2014-10-15 7 views
0

Предположим, что существует класс, имеющий n свойств. Создавая свои объекты, я должен создать, используя следующий синтаксисКогда я должен использовать параметризованный конструктор и конструктор по умолчанию

Way 1

ClassName c = new ClassName(); 

и Ассинг значения как

c.p1 = someValue1; 
c.p2 = someValue2; 
c.p3 = someValue3; 
c.p4 = someValue4; 

или

Way 2

ClassName c = new ClassName(someValue1,someValue2,someValue3,someValue4); 

если класс имеет конструктор параметризованную как

private CalssName(DataType1 prop1,DataType2 prop2,DataType3 prop3,DataType4 prop4) 
{ 
    p1 = prop1; 
    p2 = prop2; 
    p3 = prop3; 
    p4 = prop4; 
} 

Какие способы подойдет для которых siuation?

ответ

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 

Это полезно в ситуациях, когда он является обязательным для объекта, чтобы иметь некоторые значения в момент создания экземпляра.

Рассмотрите DirectoryInfo класс предоставленный.Net Framework, вы не можете создать экземпляр объекта DirectoryInfo без параметра

DirectoryInfo dirInfo = new DirectoryInfo();//This will error out 

DirectoryInfo Поскольку требуется объект, чтобы иметь путь, указывающий на каталог, было бы не использовать без пути, поэтому она снабжена только параметризованным конструктор

DirectoryInfo dirInfo = new DirectoryInfo(@"C:\Somefolder"); 
2

Я согласен с Хабиб и добавив немного больше информации, я считаю, это проще, например, при добавлении в список:

List<ClassName> myList = new List<ClassName>(); 
    myList.Add(new ClassName(someValue1,someValue2,someValue3,someValue4)); 
    myList.Add(new ClassName(someValue5,someValue6,someValue7,someValue8)); 

Вместо того, чтобы создавать объекты и присваивать им значения, добавляя больше строк кода. В обоих подходах объекты создаются в кучу, и сборщик мусора будет вызывать объект. Финализировать, когда объекты больше не нужны.

0

Должны ли эти свойства, необходимые для нормальной работы класса? Тогда инъекция их через конструктор, как на пути 2, может быть лучше всего. Кроме того, если вы не знали, вы действительно спрашиваете о двух разных формах: dependency injection. Способ 1 - это инъекция свойств, а путь 2 - инъекция конструктора. Это может помочь вам найти дополнительные ресурсы, на каком пути лучше всего.

0

Если у вас есть смысл иметь объект вашего класса без каких-либо начальных значений, вы можете использовать конструктор по умолчанию.

Но если вы обнаружите, что в вашей программе вы часто есть код, который выглядит следующим образом:

ClassName c = new ClassName(); 
c.p1 = someValue1; 

, то это сильный намек на то, что вам требуется конструктор с параметрами. Причина в том, что вы хотите избегать того, чтобы оставить программисту возможность забыть инициализацию объекта вашего класса (это практически код c.p1 = someValue1) и обеспечить инициализацию через конструктор. Таким образом можно избежать многих ошибок.

Что касается когда вам нужен бесступенчатый конструктор. Иногда это необходимо, потому что фреймворки, которые вы можете использовать, могут потребовать одного, или это может быть случай, когда не требуется инициализация с использованием параметров.

На аналогичной ноте вы также можете обнаружить, что иногда требуется много параметров для правильной инициализации объекта, или вам может потребоваться много разных конструкторов, потому что могут быть разные способы инициализации объекта (например, использование строки, или число). В этом случае вам может понадобиться взглянуть на шаблон строителя. Builder pattern

1

Вот отличный обзор: http://msdn.microsoft.com/en-us/library/ms229060%28v=vs.110%29.aspx

Общие комментарии:

  • Если не причина, чтобы сделать иначе, вы должны разоблачить конструктор по умолчанию
  • Вы должны также разоблачить конструкторы, которые объектно ориентированный, то есть класс автомобиля должен быть конструктивным с двигателем и трансмиссией, но не с водителем, так как водитель не является частью класса автомобиля.Это моя интерпретация того, что подразумевается под основными свойствами в «DO использовать параметры конструктора в качестве ярлыков для установки основных свойств».
  • Вы не должны раскрывать конструктор по умолчанию, если вы хотите, чтобы объект был неизменным (со всеми свойствами readonly)
Смежные вопросы