将属性设置为默认值

38

有没有可能在不使用属性主体的情况下设置默认值?最好是使用注释。

[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;
}
5个回答

70
抱歉,没有内置的方法可以使用元数据设置属性的值。您可以使用某种工厂来使用反射构建类的实例,然后设置默认值。但简而言之,您需要使用构造函数(或字段设置器,这些被提升到构造函数)来设置默认值。 如果您的构造函数有多个重载版本,则可以考虑使用构造函数链接。 在使用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 以外的方式来操作状态。


有没有一个地方可以投票支持这个功能或类似的东西? - BrunoLM
1
你可能会在connect.microsoft.com上找到一些有用的东西。 - Matthew Whited
1
哎呀,我刚在CodeProject上发现了这个。它使用反射在对象构造后设置默认值。http://www.codeproject.com/KB/dotnet/AutoPropsDefaultValues.aspx - Matthew Whited
1
我记得在这个网站上看到过另一个条目,其中包含了连接到connect.microsoft.com报告的链接...但我再也找不到它了。如果有人找到了这个链接,我很乐意更新我的答案并加入它。 - Matthew Whited
非常令人困惑——我认为你的第二个代码示例是作为解决方案提供的,而不是作为一些行不通的东西的示例。我进行了编辑以增强清晰度。 - Jazimov

16

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

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;
    }
}

5
这看起来更像是他的问题,而不是对它的答案。 - Matthew Whited

13

如果您使用的是C#5或更早版本,则必须在构造函数中完成此操作。

但自C# 6.0以来,已经包括了具有自动属性初始化程序的功能,并且语法如下:

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

9

旧帖。 看起来微软已经听取意见,在 .Net Framework 4.6+ (C# 6+) 中提供了这个功能。 您可以像这样使用它:

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

我选择点赞这个回答而不是Chitioui的,因为他的回答晚了2个月,并没有对此有任何补充。 - dading84

1
在这个非常具体的例子中,你可以说:
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;
}

但是一般来说是不行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接