Лучший способ создания объекта
Это кажется очень глупым и рудиментарным вопросом, но я попытался это сделать, но не смог найти удовлетворительного ответа,
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(){}
public Person(string name, int age)
{
Name = name;
Age = age;
}
//Other properties, methods, events...
}
Мой вопрос: если у меня есть класс, как это, что лучший способ создать объект?
Person p=new Person("abc",15)
ИЛИ
Person p=new Person();
p.Name="abc";
p.Age=15;
В чем разница между этими двумя методами и каков наилучший способ создания объектов?
Ответы
Ответ 1
Решите, нужен ли вам неизменяемый объект или нет.
Если вы поместите свойства public
в свой класс, состояние каждого экземпляра может быть изменено каждый раз в вашем коде. Таким образом, ваш класс может быть таким:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(){}
public Person(string name, int age)
{
Name = name;
Age = age;
}
//Other properties, methods, events...
}
В этом случае конструктор Person(string name, int age)
не так полезен.
Второй вариант - реализовать неизменяемый тип. Например:
public class Person
{
public string Name { get; private set; }
public int Age { get; private set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
//Other properties, methods, events...
}
Теперь у вас есть конструктор, который устанавливает состояние для экземпляра один раз, во время создания. Обратите внимание, что теперь настройки для свойств private
, поэтому вы не можете изменить состояние после создания объекта.
Лучшей практикой является определение классов как неизменяемых каждый раз, когда это возможно. Чтобы понять преимущества непреложных классов, я предлагаю вам прочитать статью .
Ответ 2
Действительно зависит от вашего требования, хотя в последнее время я видел тенденцию к классам с хотя бы одним открытым конструктором.
Поверхность размещения ваших параметров в конструкторе via заключается в том, что вы знаете, на эти значения можно положиться после создания экземпляра. Недостатком является то, что вам нужно будет поработать с любой библиотекой, которая, как ожидается, сможет создавать объекты с открытым конструктором.
Мои личные предпочтения состоят в том, чтобы идти с открытым конструктором и устанавливать любые свойства как часть декларации.
Person p=new Person()
{
Name = "Han Solo",
Age = 39
};
Это связано с проблемой "недостаток класса без голого конструктора", а также уменьшает обслуживание (я могу установить больше вещей без изменения конструктора).
Ответ 3
Там действительно не лучший способ. Оба они совершенно одинаковы, если вы не хотите выполнять некоторую дополнительную обработку с использованием параметров, переданных конструктору во время инициализации, или если вы хотите обеспечить согласованное состояние сразу после вызова конструктора. Если это так, предпочтете первую.
Но для соображений удобочитаемости/поддерживаемости избегайте создания конструкторов со слишком большим количеством параметров.
В этом случае оба будут делать.
Ответ 4
По моему скромному мнению, это просто вопрос о том, являются ли аргументы факультативными или нет. Если объект Person не должен (логически) существовать без имени и возраста, они должны быть обязательными в конструкторе. Если они являются необязательными (т.е. Их отсутствие не представляет угрозы для хорошего функционирования объекта), используйте сеттеры.
Здесь цитата из документов Symfony о вводе конструктора:
Существует несколько преимуществ использования инъекции конструктора:
- Если зависимость является требованием, и класс не может работать без нее, то ее ввод через конструктор гарантирует, что он присутствует, когда класс используется, поскольку класс не может быть построен без него.
- Конструктор только когда-либо вызывается один раз, когда объект создается, поэтому вы можете быть уверены, что зависимость не изменится во время жизни объекта.
Эти преимущества означают, что инъекция конструктора не подходит для работы с дополнительными зависимостями. Это также сложнее использовать в сочетании с иерархиями классов: если класс использует инъекцию конструктора, то его расширение и переопределение конструктора становится проблематичным.
(Symfony - одна из самых популярных и уважаемых фреймовых фреймворков)
Ответ 5
Если вы думаете, что меньше кода означает более эффективный, то лучше использовать функцию построения.
Вы также можете использовать код, например:
Person p=new Person(){
Name='abc',
Age=15
}
Ответ 6
Или вы можете использовать файл данных, чтобы помещать много объектов человека в список или массив. Для этого вам нужно использовать System.IO. И вам нужен файл данных, который содержит всю информацию об объектах.
Метод для него выглядел бы примерно так:
static void ReadFile()
{
using(StreamWriter writer = new StreamWriter(@"Data.csv"))
{
string line = null;
line = reader.ReadLine();
while(null!= (line = reader.ReadLine())
{
string[] values = line.Split(',');
string name = values[0];
int age = int.Parse(values[1]);
}
Person person = new Person(name, age);
}
}