用户定义的类在C#中的默认值

我看到一些代码将返回默认值,所以我想知道一个用户定义的类,编译器将如何定义其默认值?

与其余的一样,它将是null ,但我也应该补充说,你可以得到任何types的默认值,使用default

 default(MyClass) // null default(int) // 0 

在使用generics时可能特别有用; 如果你的返回types是T ,你可能想要返回default(T) ,而你不想假设它是可以为空的。

class的默认值是null

注意:DefaultValueAttribute不会使用该属性的值自动初始化成员。 您必须在代码中设置初始值。

你可以使用DefaultValueAttribute来修饰你的属性。

 private bool myVal=false; [DefaultValue(false)] public bool MyProperty { get { return myVal; } set { myVal=value; } } 

我知道这不会回答你的问题,只是想添加这个相关的信息。

有关更多信息,请参阅http://msdn.microsoft.com/zh-CN/library/system.componentmodel.defaultvalueattribute.aspx

类的默认值为null 。 对于结构,默认值与实例化结构的默认无参构造函数(不能被覆盖)相同。 同样的规则recursion地应用于类或结构内包含的所有字段。

如果是引用types,则默认值为null ,如果是值types,则取决于。

 Assert.IsTrue(default(MyClass) == null); 

如果你想以某种方式为引用types定义一个非空的默认值,请认识到引用types具有默认值是没有意义的。 在某些时候,引用将需要指向构造对象的分配内存。 为了做到这一点,我想象了两个实现:

  1. 定义一个静态实例作为默认值:这可以工作,但可能需要一个非常笨重的方式来以某种方式识别编译器在哪里获得静态实例。 不是一个真正的function值得投入到语言。

  2. 每次在expression式中出现默认值时,都允许调用默认的构造函数:这将是非常糟糕的,因为现在您必须担心两个默认值可能不相等,因为您没有覆盖等于不比较引用,也是可怕的,因为内存pipe理和内存分配性能受到打击,而副作用则来自构造函数。

所以总的来说,我认为这是一个我们不想要的语言function。 而默认(MyClass)将始终== null。

我会使这个“默认”类实例一个字段而不是属性,如System.String.Empty看起来如何:

 public class Person { public string Name { get; set; } public string Address { get; set; } public static readonly Person Default = new Person() { Name = "Some Name", Address = "Some Address" }; } ... public static void Main(string[] args) { string address = String.Empty; Person person = Person.Default; //the rest of your code }