Подтвердить что ты не робот

Лучший способ создания объекта

Это кажется очень глупым и рудиментарным вопросом, но я попытался это сделать, но не смог найти удовлетворительного ответа,

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;

В чем разница между этими двумя методами и каков наилучший способ создания объектов?

4b9b3361

Ответ 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);
    }
}