这两个C#类构造函数之间有什么区别?

时间:2015-12-13 11:34:46

标签: c# class

不是2个构造函数,而是3个但是其中2个被重载。

  1. 这个原因主要是我在一段时间后看过的教程。

        public Animal()
        {
            this.height=0;
            this.weight=0;
            this.name="No Name";
            this.sound = "No Sound";
        }
        public Animal(double height, double weight, string name, string sound)
        {
            this.height=height;
            this.weight=weight;
            this.name=name;
            this.sound = sound;
        }
    
  2. 我从软件开发类中记得这一点,所以我想知道用这种方式写它是否有意义,如果没有,那么如果这是在我的代码上会出错?

        public Animal(double height=0, double weight=0, string name="No Name", string sound="No Sound")
        {
            this.height=height;
            this.weight=weight;
            this.name=name;
            this.sound = sound;
        }
    
  3. 因为我真的不知道我是否可以在类构造函数中放置默认值。

2 个答案:

答案 0 :(得分:1)

我会说这主要是关于沟通。在第一种情况下,您要么提供所有值,要么不提供任何值(..并且您获得默认值)。编写该代码的人可能只有这两个选项的充分理由。

在第二种情况下,您更灵活,例如,您可以选择仅提供一个参数..可能是这样的对象将变为无效的情况。和大多数事情一样......一切都取决于

答案 1 :(得分:1)

当然可以。对于大多数代码,你不会看到很大的区别(除了在第一种情况下你必须提供所有参数,或者没有)。

但是有一个微妙的差异,它可以在以后咬你。

请参阅,第一个代码段声明了一个所谓的默认构造函数和一个自定义构造函数,但第二个代码段仅声明了一个自定义构造函数。

这是一个通用函数:

public static T Create<T>()
    where T : new()
{
    return new T();
}

如果您拨打Create<Animal>()

,您将获得以下内容:
  

错误CS0310:“Animal”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“Program.Create<T>()”中将其用作参数“T”

因此,您的自定义构造函数会在预期的情况下替换默认构造函数。

同样适用于反思:

Activator.CreateInstance<Animal>();

将导致运行时异常:

  

未处理的异常:System.MissingMethodException:没有为此对象定义无参数构造函数。

因此,提供可访问的默认构造函数也具有语义含义。它告诉您通过默认构造函数创建类时仍然有意义的实例,并且不需要其他参数。例如,它可用于涉及序列化的场景(某些序列化程序需要默认构造函数,其他序列化程序则不需要)。