我什么时候应该使用参数化构造函数和默认构造函数

时间:2014-10-15 15:11:58

标签: c# constructor

假设有一个具有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;
}

哪种方式适合哪种方式?

5 个答案:

答案 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;
    }
}

由于您提供了参数化构造函数,因此用户无法在不传递IDName值的情况下实例化对象。 (忽略反思)

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