【问题标题】:What is the difference between these two C# class constructors?这两个 C# 类构造函数有什么区别?
【发布时间】:2015-12-13 19:57:56
【问题描述】:

实际上不是 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;
        }
    

因为我真的不知道我是否可以像这样在类构造函数中放置默认值。

【问题讨论】:

  • 编译一下就知道了。你有什么问题? :)
  • 你可以试一试......它会告诉你是否可以将默认值放入构造函数中...... :)
  • 我的意思是它有效,但我想知道它是否没有任何副作用,比如以这种方式或类似的方式这样做是否不是一个坏习惯。

标签: c# class


【解决方案1】:

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

不过还是有一个微妙的区别,以后可能会咬到你。

看,第一个 sn-p 声明了一个所谓的 default 构造函数和一个自定义构造函数,但第二个 sn-p 只声明了一个自定义构造函数。

这是一个通用函数:

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

如果您致电Create&lt;Animal&gt;(),您将获得以下信息:

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

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

反射也是如此:

Activator.CreateInstance<Animal>();

会导致运行时异常:

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

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

【讨论】:

  • 谢谢你的回答,正是我想知道的。
【解决方案2】:

我想说这主要是关于交流。在第一种情况下,您要么提供所有值,要么不提供任何值(..你得到默认值)。编写该代码的人可能有充分的理由选择这两个选项。

在第二种情况下你更灵活,例如你可以选择只提供一个参数..这样的对象可能会变得无效。与大多数事情一样......这一切都取决于

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2014-05-12
    • 1970-01-01
    • 2012-02-10
    • 2013-04-29
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多