Есть ли польза от использования инициализатора объектов?

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

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

Как обстоят дела с их использованием в C#?

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

5 ответов

Одно часто пропускаемое преимущество - атомарность. Это полезно, если вы используете двойную проверку блокировки объекта. Инициализатор объекта возвращает новый объект после того, как он инициализировал всех членов, которым вы его указали. Из примера на статью 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).

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

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

Пример. Представьте, что это ваш код, но вы не можете прочитать источник ExternalService, поскольку он является внешним по отношению к вашему приложению. Вы не будете знать, что именно параметр "Чарли" вызвал ошибку в 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";
    }

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

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

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

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

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

  • Легко читается и поддерживается.

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

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

До C# 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();  

            }  
        } 

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

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

        }  
    }  
Другие вопросы по тегам