Можно ли использовать Инициализатор объектов?

Есть ли преимущества в использовании инициализаторов объектов С#?

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

Что такое их использование в С#?

Как инициализировать объекты с помощью инициализатора объектов (руководство по программированию на С#)

Ответ 1

Часто упущенная выгода - это атомарность. Это полезно, если вы используете двойную проверку блокировки на объекте. Инициализатор объекта возвращает новый объект после инициализации всех членов, о которых вы ему сообщили. В примере из статьи MSDN:

StudentName student = new StudentName
{
    FirstName = "Craig",
    LastName = "Playstead",
    ID = 116
};

Будет переведено на следующее:

StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;

StudentName student = _tempStudent;

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

Для получения дополнительной информации об этом, вы можете проверить эту статью.

Другим преимуществом является то, что он позволяет создавать анонимные объекты (например, создавать проекцию или присоединяться к нескольким клавишам в LINQ).

Ответ 2

Существует потенциальная причина не использовать инициализаторы объектов: если во время инициализации есть исключение, стек вызовов в отладчике Visual Studio возвращает только выражение инициализатора, а не конкретную строку, в которой произошло исключение.

Если вы используете библиотеки или внешние службы с неверно названными исключениями или, альтернативно, используете библиотеки с собственным кодом, в которых вы не видите код, который генерирует исключение (например, Xamarin на Android), инициализаторы объектов могут затруднить отладку ваш код, так как вы не знаете, какой параметр вызвал исключение.

Пример. Представьте, что это ваш код, но вы не можете прочитать источник ExternalService, поскольку он является внешним для вашего приложения. Вы не будете знать, что это был параметр "charlie", который вызвал ошибку в ExternalService.

    var instance = new ClassToBeInitialized
    {
        alpha = "alpha", 
        bravo = ExternalService(0),
        charlie = ExternalService(1)
    };

    private static string ExternalService(int parameter)
    {
        if (parameter == 1)
        {
            throw new Exception("The external service crashed");
        }

        return "correctStringResult";
    }

Ответ 3

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

Ответ 4

Я думаю, что это способствует удобочитаемости.

В качестве примера обратите внимание, что в примере, показанном в приведенной ссылке, я иногда предпочитаю иметь частный сеттер для свойств (FirstName и LastName), но это зависит от вашего дизайна.

Ответ 5

Существует 3 основных преимущества инициализации объекта

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

  • Легко читаемый и поддерживаемый.

  • Экономия времени.

Посмотрите здесь, как это может избежать множества нажатий клавиш:

До С# 3.0 мы выполняли инициализацию следующим образом:

         public  class Employee  
        {  
            public string Name { get; set; }  
            public int Id { get; set; }  
            public string Department { get; set; }  
            public int salary { get; set; }  
        }  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                Employee emp=new Employee();  
                emp.Name = "Kumar";  
                emp.Department = "IT";  
                emp.Id = 101;  
                emp.salary = 80000;  
                Console.ReadLine();  

            }  
        } 

Теперь после С# 3.0 мы инициализируем в одной строке следующим образом.

class Program  
    {  
        static void Main(string[] args)  
        {  
            Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};        

        }  
    }