c# - 静态类 - 构造函数java




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

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

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


class的默认值为null


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

  1. 将静态实例定义为默认值:这可能有效,但可能需要一种非常笨重的方式来以某种方式识别编译器在何处获取静态实例。 这不是一个值得投入该语言的功能。

  2. 允许每次在表达式中出现默认值时调用默认构造函数:这将是非常糟糕的,因为现在您必须担心两个默认值可能不相等,因为您没有重写Equals以不比较引用,并且因为内存管理和内存分配性能命中,以及构造函数的副作用。

总而言之,我认为这是一种我们真正不想要的语言功能。 默认(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
}

要与其余部分一起调用,它将为null ,但我还应该添加,您可以使用默认值获取任何类型的默认值

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

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


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




default-value