构造函数和类成员初始化之间的区别?

时间:2013-09-27 04:24:46

标签: c# constructor

在使用传递参数进行实例化时使用构造函数之间的区别是什么:

Customer Costomer1 = new Customer(100, Mark, 5000);

并且做同样但没有将任何内容传递给构造函数但只是实例化成员?

Customer Costomer1 = new Customer() { ID = 100, Name = "Mark", Salary = 5000, };

哪一种更好,哪种情况好?

如果我说构造函数是在实例化对象时需要做更多的工作而成员初始化仅用于字段和属性的签名值,那么我是否正确?

如果我正确地理解了这一点,为什么你会使用构造函数来使用第二种情况?

4 个答案:

答案 0 :(得分:5)

这是一个语法快捷方式(将调用默认构造函数)

Customer Costomer1 = new Customer() { ID = 100, Name = "Mark", Salary = 5000, }; 

等于以下

Customer Costomer1 = new Customer()
Costomer1.ID = 100;
Costomer1.Name = "Mark";
Costomer1.Salary = 5000;

答案 1 :(得分:4)

在第二个选项中,除非您添加验证,否则可以省略参数并具有不完整的实例,而在第一个选项中,所有参数都是必需的,因此不可能有部分构造的对象。 / p>

如果有多个参数,第二个版本可以更具可读性,但如果您使用C#4,则可以在第一个版本中使用命名参数。

第二个版本的代码工作量较少,但第一个版本更容易正确。

答案 2 :(得分:1)

第一个要求您在构造对象时使用参数(或可选参数)。第二个选项允许您根据需要初始化对象的属性。如果您不需要初始化属性,那么第二个选项是更好的方法。

答案 3 :(得分:1)

他们基本都做同样的事情。如果你看一下,你总是要调用构造函数。

第二个调用默认构造函数。然后它负责设置变量。第一个,初始化构造函数内的变量。

在任何情况下,第一个是您最好和最重要的选择。最好让对象通过构造函数初始化变量。对于第二个示例,初始化留给创建此对象的类的实现,这可能无法从类中产生您想要的正确结果。

例如,在第二个例子中我做:

  Customer Costomer1 = new Customer() { Name = "Mark", Salary = 5000, };

现在我没有身份证。构造函数参数将强制实现者遵守它的规则。无论如何,你都不能省略传递给构造函数的变量,除非你输入空变量(即“。”)。

当我想要快速初始化指定构造函数不接受的变量时,你的第二个例子是最好的。基本上,据我所知(我可能非常错误),第二个做到了这一点:

   Customer Costomer1 = new Customer();
   Customer1.ID = 100;
   Customer1.Name = "Mark";
   Customer1.Salary = 500;

将第二个例子视为纯粹的空手。

构建类时,必须考虑使此类工作的变量是什么。例如,客户不能拥有ID,尽管他们可能没有定义的工资。如果我没有错误地将ID包含在我的客户中,说它是0,那么当对象被使用时,你会有一些非常奇怪的行为。

考虑一下这个场景。

   Customer Costomer1 = new Customer();
   Customer1.ID = 100;
   Customer1.Name = "Mark";
   Customer1.Salary = 500;

   Customer Costomer2 = new Customer();
   Customer1.Name = "John";
   Customer1.Salary = 500;

   Customer Costomer3 = new Customer();
   Customer1.Name = "Eric";
   Customer1.Salary = 500;

现在,您有两个客户,其ID为0。虽然你可能错误地通过构造函数将其设置为相同的值,但是在构造函数FORCES中设置值时要考虑ID号。

另一件事是,例如,当我拿走你的代码并将其用于我的项目时。假设我正在使用您的代码扩展您已编写的程序。我可能或可能不知道客户必须拥有身份证号码。或者,更有可能的是,我忘记初始化名称和ID号。您的整个系统现在可能会出现奇怪的行为。

但纯粹说,出于经验,强迫自己或实施者设置某些变量会将逻辑隐藏在一个位置。我不再需要长时间的代码来初始化每个对于该对象绝对必要的变量。通常,规则是你采取任何可以重复的逻辑并将其放在一个地方。

最后,但并非最不重要的是,您通常不希望公开这样的可写变量。也就是说,不应该被篡改的重要变量。使用构造函数,您可以初始化具有ID号的类,并将其作为私有变量隐藏在类中。这样,实施者不能以任何方式将ID号变形为其他东西。根据我的经验,这有助于阻止人们“热修复”变量,给他们一些他们无法弄清楚如何做正常的结果。这可能会导致程序中出现一些非常奇怪的行为。

你实际上可以拥有两全其美。考虑一下:

class MyClass
{
    private int someVariable;
    public int someOtherVariable;

    public MyClass(int myVar)
    {
        someVariable = myVar;
    }
}

并初始化:

MyClass c = new MyClass(5) { someOtherVariable = 10 };