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

Ben*_*nny 52 c# default-value

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

Dav*_*und 62

要与其余部分一起使用,它将是null,但我还应该补充一点,你可以使用获得任何类型的默认值default

default(MyClass) // null
default(int) // 0
Run Code Online (Sandbox Code Playgroud)

在使用泛型时,它尤其有用; 你可能想要返回default(T),如果你的返回类型是T,你不想假设它可以为空.

  • +1有关默认关键字的完整说明,请访问http://msdn.microsoft.com/en-us/library/xwth0h0d%28VS.80%29.aspx (3认同)

Gra*_*ton 14

默认值为classanull


Pet*_*ter 11

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

您可以使用DefaultValueAttribute修饰属性.

private bool myVal=false;

[DefaultValue(false)]
 public bool MyProperty {
    get {
       return myVal;
    }
    set {
       myVal=value;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我知道这不能回答你的问题,只是想把它作为相关信息添加.

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

  • 正如页面所说,DefaultValue 只是 VS 的视觉设计师使用的东西。它与实际的初始化完全无关;这只是它应该如何初始化的“提示”。 (3认同)

And*_*law 8

如果您想知道为什么没有一种语言功能允许您以某种方式为类定义非空默认值,请记住类是“引用类型”。引用类型是对已分配内存的引用,或者换句话说,除 null 之外的任何内容都是需要分配内存的该对象的构造实例。因此,现在考虑如何将“default”关键字集成到 .NET 中,以便它适用于类,想象一下可以考虑的两种实现:

  1. 您可以定义标记为默认的静态实例。也许“默认”变得像访问修饰符(例如公共默认只读等)。也许这可行。但这真的是一个有价值的语言功能吗?至少这样每个“默认”都会指向相同的静态内存实例。

  2. 如果每次在类上使用 default 关键字时都会调用默认构造函数会怎样?这将很糟糕,因为如果您不重写 Equals 来不比较引用,两个默认值可能彼此不相等,而且由于内存管理和内存分配性能下降以及构造函数的副作用,这也很糟糕。

总而言之,我认为这是我们真正不想要的语言功能。并且 default(MyClass) 将始终 == null。


Yom*_* S. 8

我会让这个“默认”类实例成为一个字段而不是属性,就像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
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*man 7

类的默认值是null.对于结构,默认值与实例化结构的默认无参数构造函数时所获得的相同(顺便说一下,它不能被覆盖).相同的规则以递归方式应用于类或结构中包含的所有字段.


Dar*_*rov 5

如果是引用类型,则默认值为null,如果是值类型,则视情况而定。