0
class Program
{
    class B
    {
        [DefaultValue(2)]
        public int x, y;

        [DefaultValue(5)]
        public int z;
    }

    static void Main(string[] args)
    {
        B b = new B();
        Console.WriteLine(String.Format("{0} {1} {2}", b.x, b.y, b.z));
    }
}

结果:0、0、0

DefaultValueAttribute在控制台应用程序中不起作用,或者我做错了什么?

编辑:

有人说关于 的属性get,set,但这也不起作用:

class Program
{
    public class A
    {
        [DefaultValue("123")]
        public string Name { get; set; }
    }

    static void Main(string[] args)
    {
        var a = new A();
        Console.WriteLine(a.Name);
    }
}

结果:空字符串

4

4 回答 4

3

DefaultValue它并没有真正做任何事情,它具有指示功能,以便其他代码可以查找它,MSDN 解释说

视觉设计者可以使用默认值来重置成员的值。代码生成器也可以使用默认值来确定是否应该为成员生成代码。DefaultValueAttribute 不会导致成员使用属性值自动初始化。您必须在代码中设置初始值。

于 2013-08-02T08:42:47.503 回答
2

请参阅:DefaultValueAttribute

指定属性的默认值。

x,y并且z不是属性,而是字段。尝试这个:

    class B
    {
        public int x, y, z;
        public B()
        {
            x = y = 2;
            z = 5;
        }
    }
于 2013-08-02T08:40:43.543 回答
2

DefaultValue因为某些类使用属性在运行时对您的对象执行某些操作(例如,z如果其值为 5,则序列化程序可以决定不序列化,因为这是默认值)。

编译器不使用该属性为您的类生成默认构造函数。

您应该改为定义一个默认构造函数,如下所示:

class B {
    public B() { 
        x = y = 2;
        z = 5;
    }
}
于 2013-08-02T08:41:47.277 回答
1

您对 .net 属性的期望过高。属性只是元数据的扩展。也就是说,编译器只是将此排序信息绑定到特定属性,而不是设置您期望的实际值。因此,如果您想获得值集,则必须有一些额外的代码由您自己编写或其他框架为您编写。您可以在堆栈溢出时检查此链接。 .Net DefaultValueAttribute 属性

于 2013-08-02T08:52:31.883 回答