他们都基本上做同样的事情。如果你看它,你总是必须调用构造函数。
第二个调用默认构造函数。然后它负责设置变量。首先,初始化构造函数中的变量。
在任何情况下,第一个都是您最好的选择。最好让对象通过构造函数来初始化变量。对于第二个示例,初始化留给创建此对象的类的实现,这可能无法从类中产生您想要的正确结果。
例如,在第二个示例中,我这样做:
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 };