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);
}
}
结果:空字符串
答案 0 :(得分:3)
DefaultValue
并没有真正做任何事情,它具有指示功能,以便其他代码可以查找它,MSDN explains:
视觉设计师可以使用默认值来重置成员 值。代码生成器也可以使用默认值来确定 是否应为该成员生成代码。一个 DefaultValueAttribute不会自动导致成员 使用属性值初始化。您必须设置初始值 在你的代码中。
答案 1 :(得分:2)
请参阅:DefaultValueAttribute
Class
指定属性的默认值。
x
,y
和z
不是属性,而是字段。
试试这个:
class B
{
public int x, y, z;
public B()
{
x = y = 2;
z = 5;
}
}
答案 2 :(得分:2)
DefaultValue
作为属性被某些类用于在运行时对您的对象执行某些操作(例如,如果序列化程序的值为5,则序列化程序可以决定不序列化z
,因为这是默认值)
编译器不使用该属性为您的类生成默认构造函数。
您应该改为定义默认构造函数,如下所示:
class B {
public B() {
x = y = 2;
z = 5;
}
}
答案 3 :(得分:1)
您对.net属性的期望过高。属性只是元数据的扩展。也就是说,编译器只是将此sorta信息绑定到特定属性,而不是设置您期望的实际值。 因此,如果您想获得值集,必须有一些额外的代码,无论是您自己编写还是其他框架为您编写。 您可以在堆栈溢出时检查此链接。 .Net DefaultValueAttribute on Properties