.NET DefaultValue属性

Aar*_*ron 53 .net c# attributes properties

我听说有人说这个DefaultValue属性有几个不同的东西,包括:

  • "它在其他任何东西使用它之前设定了该属性的价值."
  • "它不适用于autoproperties."
  • "它仅用于装饰.您必须手动设置实际默认值."

哪个(如果有的话)是对的?DefaultValue实际上是否设置了默认值?是否有不起作用的情况?最好不要使用它吗?

STW*_*STW 54

我通常使用的地方DefaultValue是用于序列化/反序列化为XML的类.它不会在实例化期间设置默认值,也不会影响autoproperties.

来自MSDN:

DefaultValueAttribute不会导致使用属性的值自动初始化成员.您必须在代码中设置初始值.

MSDN - DefaultValueAttribute类


编辑:正如Roland指出的那样,正如其他人在答案中提到的那样,表单设计器也使用了该属性


Joh*_*ton 17

要在四年后更新:目前,设置JSON.net的DefaultValueHandling参数使DefaultValue按照@aaron预期的方式工作:

[JsonProperty("allowUploading",DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(true)]
public bool AllowUploading { get; set; }
Run Code Online (Sandbox Code Playgroud)


Row*_*haw 12

像所有属性一样,它是元数据,因此"它仅用于装饰.您必须手动设置实际默认值." 是最接近的.

MSDN继续谈到DefaultValueAttribute:

DefaultValueAttribute不会导致使用属性的值自动初始化成员.您必须在代码中设置初始值.

即,您仍然需要使构造函数与您所说的默认值匹配,以便信任它的代码仍然有效,例如内置的XML序列化将使用它们来确定是否序列化属性; 类似地,表单设计者将使用DefaultValues来计算出需要自动生成的代码.


小智 10

你实际上可以"强迫"它很容易在任何类上工作.

首先,您需要在System命名空间中编写对象扩展方法:

public static class ObjectExtensions
{
    public static void InitializePropertyDefaultValues(this object obj)
    {
        PropertyInfo[] props = obj.GetType().GetProperties();
        foreach (PropertyInfo prop in props)
        {
            var d = prop.GetCustomAttribute<DefaultValueAttribute>();
            if (d != null)
                prop.SetValue(obj, d.Value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在类的构造函数中,在类的层次结构中足够高,实际上需要这样的自动默认值初始化,您只需要添加一行:

    public MotherOfMyClasses()
    {
        this.InitializePropertyDefaultValues();
    }
Run Code Online (Sandbox Code Playgroud)


And*_*ski 5

在最新版本的 中C#,您可以执行以下操作:

public class InitParam
{
    public const int MyInt_Default = 32;
    public const bool MyBool_Default = true;

    [DefaultValue(MyInt_Default)]
    public int MyInt{ get; set; } = MyInt_Default;

    [DefaultValue(MyBool_Default)]
    public bool MyBool{ get; set; } = MyBool_Default;
}
Run Code Online (Sandbox Code Playgroud)