【问题标题】:Set a default value to a property为属性设置默认值
【发布时间】:2010-06-18 16:18:22
【问题描述】:

是否可以在没有属性主体的情况下设置默认值?最好带注释。

[SetTheDefaultValueTo(true)]
public bool IsTrue { get; set; }

[SetTheDefaultValueTo(false)]
public bool IsFalse { get; set; }

public void Something()
{
    var isTrue = this.IsTrue;
    var isFalse = this.IsFalse;
}

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    不,没有内置方法可以使用元数据设置属性的值。您可以使用某种工厂来构建具有反射的类的实例,然后可以设置默认值。但简而言之,需要使用构造函数(或字段设置器,提升到构造函数)来设置默认值。

    如果您的构造函数有多个重载,您可能需要查看constructor chaining

    使用 C# 6+,你可以做这样的事情......

    public string MyValue { get; set; } = "My Default";
    

    哦,它变得更有趣了,因为人们甚至要求这样的东西......

    // this code won't compile!
    public string MyValue {
        private string _myValue;
        get { return _myValue ?? "My Default"; }
        set { _myValue = value; }
    }
    

    ... 优点是您可以将字段的范围控制为只能在属性代码中访问,因此您不必担心在不使用 getter/setter 的情况下类中的其他任何事情.

    【讨论】:

    • 有什么地方可以让我为这个功能或类似的东西投票吗?
    • 您也许可以在 connect.microsoft.com 上找到一些东西。
    • eek... 我刚刚在 CodeProject 上找到了这个。它在构造对象后使用反射来设置默认值。 codeproject.com/KB/dotnet/AutoPropsDefaultValues.aspx
    • 我以为我在此站点的某处看到了另一个条目,其中包含指向 connect.microsoft.com 上的报告的链接...我再也找不到它了。如果有人找到该链接,我很乐意更新我的答案以包含它。
    • 非常令人困惑-尽管您的第二个代码示例是作为解决方案提供的,而不是作为不起作用的示例。为了清楚起见,我进行了编辑。
    【解决方案2】:

    在类构造函数中分配默认属性值。

    class MyClass
    {
        public MyClass()
        {
            IsTrue = true;
            IsFalse = false;
        }
    
        public bool IsTrue { get; set; }
    
        public bool IsFalse { get; set; }
    
        [...]
    
        public void Something()
        {
            var isTrue = this.IsTrue;
            var isFalse = this.IsFalse;
        }
    }
    

    【讨论】:

    • 这看起来更像是他的问题,而不是答案。
    【解决方案3】:

    如果您使用的是 C#5 及更早版本,则必须在构造函数中进行。

    但从 C# 6.0 开始,包含自动属性初始化器的功能,语法为:

    public int myage { get; set; } = 33;
    

    【讨论】:

      【解决方案4】:

      旧线程。 看起来 Microsoft 听说过,并且此功能在 .Net Framework 4.6+ (C# 6+) 中可用 你可以像使用它一样

      public string MyValue { get; set; } = "My Default";
      

      【讨论】:

        【解决方案5】:

        在这个非常具体的例子中,你可以:

        public bool IsFalse { get; set; }
        public bool IsTrue
        {
            get { return !IsFalse; }
            set { IsFalse = !value; }
        }
        
        public void Something()
        {
            var isTrue = this.IsTrue;
            var isFalse = this.IsFalse;
        }
        

        但是,一般来说,不会。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多