3

使用传递参数实例化时使用构造函数有什么区别:

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

并且做同样的事情但没有将任何东西传递给构造函数而只是实例化成员?

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

哪个更好,它们适合什么情况?

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

如果我正确理解这一点,如果可以使用构造函数,为什么还要对成员使用第二种情况?

4

4 回答 4

5

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

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

等于以下

Customer Costomer1 = new Customer()
Costomer1.ID = 100;
Costomer1.Name = "Mark";
Costomer1.Salary = 5000;
于 2013-09-27T04:34:13.913 回答
4

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

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

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

于 2013-09-27T04:29:32.703 回答
1

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

于 2013-09-27T04:30:44.553 回答
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。虽然您可能会通过构造函数错误地将其设置为相同的值,但在构造函数中设置值会迫使您考虑 ID 号。

另一件事是,例如,当我获取您的代码并将其用于我的项目时。假设我正在使用您的代码来扩展您已经编写的程序。我可能知道也可能不知道客户必须有 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 };
于 2013-09-27T04:41:15.960 回答