【问题标题】:Static fields - string interpolation using static静态字段 - 使用静态的字符串插值
【发布时间】:2019-05-29 05:05:04
【问题描述】:
public static class SomeRegexConsts
{
    public static readonly string FullName = $"{Name} {Surname}";

    private static readonly string Name = "[A-Z][a-z]+";

    private static readonly string Surname = "[A-Z][a-z]+";
}

在上面的示例中,FullName 在运行时将等于" "。 这与静态字段的初始化方式(从上到下)有关。

一般来说,除了将其更改为 getter 之外,我没有看到任何其他解决方案:

public static string FullName => $"{Name} {Surname}";

关于如何改进此代码的任何想法,因为我不喜欢这个 lambda,并且将 FullName 移动到 NameSurname 下面不是一个选项,因为 StyleCop 不允许我这样做。

【问题讨论】:

  • 我希望这只是一个简化的示例,因为那些正则表达式模式与现实世界中的名称不匹配。
  • 哦,是的,它被简化了。实际的正则表达式更长,但它不是这个问题的主题
  • 您确实意识到有些名称的字母超出了A-Z 的范围?
  • 是的,但你可能没有意识到我已经回答了这个问题:)
  • 谁读 cmets?对不起,关于再次问同样的问题。 :)

标签: c# .net stylecop


【解决方案1】:

如果您不想将FullName 移到其他人下方,我认为这是您唯一的解决方案。

public static class SomeRegexConsts
{
    static SomeRegexConsts(){
        FullName = $"{Name} {Surname}";
    }

    public static readonly string FullName;

    private static readonly string Name = "[A-Z][a-z]+";

    private static readonly string Surname = "[A-Z][a-z]+";

【讨论】:

    【解决方案2】:

    创建一个返回 FullName 字符串的公共方法怎么样?

    public string getFullname()
    {
        return $"{Name} {Surname}";
    }
    

    这样public static readonly string FullName = $"{Name} {Surname}";,如果可以摆脱它,就不再需要了。

    【讨论】:

    • 是的,但它为不会改变的东西添加了另一个方法调用
    【解决方案3】:

    我相信这适用于 StyleCop,因为它在任何类型的字段之前都需要 const

    public static class SomeRegexConsts
    {
        private const string Name = "[A-Z][a-z]+";
        private const string Surname = "[A-Z][a-z]+";
    
        public static readonly string FullName = $"{Name} {Surname}";
    
    }
    

    除非您在需要非常量字段的类中使用反射,否则编译后的代码应该不受影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      相关资源
      最近更新 更多