【问题标题】:C# 6.0 Default InitializationC# 6.0 默认初始化
【发布时间】:2017-11-21 13:00:27
【问题描述】:

以下代码在 C# 5.0 中有效:

private static String _prefix;
public static String Prefix
{
    get { return _prefix; }
    set {_prefix = (value == String.Empty) ? "abc_" : value;}
} 

我正在尝试使用默认初始化在 C#6 中更简洁地编写它。 (https://msdn.microsoft.com/en-us/magazine/dn802602.aspx)

以下代码在 C# 6.0 中有效(但逻辑不同)

public String Prefix { get; set; } = "abc_";

我试过了:

public String Prefix { get; set; } value == String.Empty ? "abc_" : value

但是由于名称'value'在当前上下文中不存在而失败

我该如何解决这个错误?

我正在尝试将属性设置为“abc_”,如果它为 null 或为空,并且如果它已经有值,请不要触摸它。

【问题讨论】:

    标签: c# properties initialization c#-6.0


    【解决方案1】:

    此代码不是关于默认初始化,而是关于防止 string.Empty 被设置为初始化后的值。

    private static String _prefix;
    public static String Prefix
    {
        get { return _prefix; }
        set {_prefix = (value == String.Empty) ? "abc_" : value;}
    }
    

    此代码行将在初始化时设置默认值一次,但不会阻止 string.Empty 稍后设置。

    public String Prefix { get; set; } = "abc_";
    

    我想要做的是将属性设置为“abc_”,如果它为 null 或为空,并且如果它已经有值,请不要触摸它。

    在 c# 6 中简化您的第一个代码的唯一方法是使用表达式主体。不仅要检查字符串是否为空,还要检查字符串是否为空,您可以使用string.IsNullOrEmpty

    private static String _prefix;
    public static String Prefix
    {
        get => _prefix;
        set => _prefix = string.IsNullOrEmpty(value) ? "abc_" : value;
    }
    

    【讨论】:

    • 感谢您的回答。为什么不是关于默认初始化?像 public String Prefix { get;放; } 字符串另一个字符串 == String.Empty ? "abc_" : "test" 实际上是有效的。我的问题是“价值”不被认可。还是我误解了你的意思?谢谢!
    • @HappyBird value 在该上下文中不是有效的关键字。默认初始化器在初始化值时设置默认值一次,而不是在您设置值时设置。因此,如果您希望有一个例程,每次设置值时都会进行检查,您必须像之前所做的那样在 setter 中执行此操作。
    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2012-11-29
    • 2011-10-28
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多