假设有一个具有n个属性的类。在创建对象时,我必须使用以下语法
创建方式1
ClassName c = new ClassName();
并提供像
这样的值c.p1 = someValue1;
c.p2 = someValue2;
c.p3 = someValue3;
c.p4 = someValue4;
或
方式2
ClassName c = new ClassName(someValue1,someValue2,someValue3,someValue4);
如果class有像
这样的参数化构造函数private CalssName(DataType1 prop1,DataType2 prop2,DataType3 prop3,DataType4 prop4)
{
p1 = prop1;
p2 = prop2;
p3 = prop3;
p4 = prop4;
}
哪种方式适合哪种方式?
答案 0 :(得分:2)
使用任何一个取决于要求。
如果希望类对象在实例化时具有某些状态(已分配属性),则使用参数化构造函数。如果你的类没有默认构造函数(没有参数),那么用户就没有办法在没有任何状态的情况下实例化一个类。
默认情况下,每个类都有一个默认构造函数(没有任何参数),但是一旦定义了参数化构造函数,除非你提供一个显式,否则将没有默认构造函数。
想象一下,如果您有类似的课程:
public class ClassName
{
public int ID { get; set; }
public string Name { get; set; }
public ClassName(int id, string name)
{
ID = id;
Name = name;
}
}
由于您提供了参数化构造函数,因此用户无法在不传递ID
和Name
值的情况下实例化对象。 (忽略反思)
ClassName obj = new ClassName(); //This will error out
这在对象在实例化时必须具有某些值的情况下非常有用。
考虑.Net框架提供的DirectoryInfo
类,您无法在没有参数的情况下实例化DirectoryInfo
的对象
DirectoryInfo dirInfo = new DirectoryInfo();//This will error out
由于DirectoryInfo
要求对象有一个指向目录的路径,没有路径就没有用,因此只提供 参数化构造函数
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Somefolder");
答案 1 :(得分:2)
我同意Habib并添加更多信息,我发现在添加到列表时更容易:
List<ClassName> myList = new List<ClassName>();
myList.Add(new ClassName(someValue1,someValue2,someValue3,someValue4));
myList.Add(new ClassName(someValue5,someValue6,someValue7,someValue8));
不必创建对象并为其赋值,而是添加更多代码行。 在这两种方法中,对象都被创建到堆中,垃圾收集器将在不再需要对象时调用object.finalize。
答案 2 :(得分:1)
以下是一个很棒的概述:http://msdn.microsoft.com/en-us/library/ms229060%28v=vs.110%29.aspx
一般评论:
答案 3 :(得分:0)
这些属性是否需要正常运行?然后,如在方式2中那样通过构造函数注入它们可能是最好的。此外,如果您不了解,您实际上会询问2种不同形式的dependency injection。方式1是属性注入,方式2是构造函数注入。这可以帮助您寻找更好的资源。
答案 4 :(得分:0)
如果有一个没有任何初始值的类对象确实有意义,那么你可以使用默认的构造函数。
但是如果你在程序中发现它经常有这样的代码:
ClassName c = new ClassName();
c.p1 = someValue1;
然后这是一个强烈的提示,你需要一个带参数的构造函数。原因是你想避免让程序员忘记初始化你的类的对象(这实际上是c.p1 = someValue1代码正在做),并通过构造函数强制执行初始化。这样可以避免很多错误。
至于何时需要无参数构造函数。有时这是必要的,因为您可能使用的框架可能需要一个框架,或者可能是不需要使用参数进行初始化的情况。
在类似的说明中,您可能还会发现有时需要大量参数来正确初始化对象,或者您可能需要许多不同的构造函数,因为可能有不同的方法来初始化对象(例如,使用字符串,或者一个号码)。在这种情况下,您可能需要查看构建器模式。Builder pattern