C# Действительно ли этот инициализатор избыточен?
У меня есть следующая строка кода:
var dmrReceived = new DownloadMessagesReport();
StyleCop и ReSharper предлагают удалить избыточный инициализатор. Однако, если я заменю его
DownloadMessagesReport dmrReceived;
конечно, это сгенерирует ссылку на объект, не установленную на экземпляр объекта? Я использую.NET 3.5. Вам больше не нужно вручную создавать объекты?
Следующая следующая строка:
dmrReceived = dc.DownloadNewMessages(param, param2, param3);
Стоит отметить, что dc
это класс, сгенерированный из службы WCF. Так DownloadNewMessages
является методом веб-службы WCF
6 ответов
Если это поле, оно будет автоматически инициализировано значением по умолчанию - пустым для ссылочного типа. Учитывая var
тем не менее, я предполагаю, что это не так, и что вы все равно создаете его экземпляр в своем коде, тем самым отбрасывая значение, которое вы здесь создали. Вам не нужно инициализировать переменную, где она объявлена. Если вы хотите использовать var
вы делаете, но тогда я бы порекомендовал вам объявить его там, где вы впервые его используете.
Итак, ваш код
var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);
Вторая строка не заполняет объект, который вы создали в первой строке, но полностью заменяет этот объект. Таким образом, первое присваивание не требуется (поскольку первый объект никогда не используется), о чем и предупреждает R#.
Это приведет к ошибке ссылки на объект, только если dmrReceived
Доступ до того, как он назначен. Во многих случаях причина, по которой Резарпер говорит, что инициализатор является избыточным, заключается в том, что переменной всегда будет назначаться другое значение в каждом возможном пути выполнения.
т.е.
DownloadMessagesReport dmrReceived;
...
if(condition) {
dmrReceived = new DownloadMessagesReport();
} else {
throw new Exception("oh no");
}
return dmrReceived.SomeProperty;
Доступ к SomeProperty
это первое место в коде, где dmrReceived
на самом деле нужно иметь значение. Как следует из остальной части кода, нет способа добраться до этой строки кода без присвоения ей значения, поэтому начальное значение, которое могло бы быть присвоено, не использовалось бы ни в каком пути выполнения и, следовательно, было бы избыточным,
"Вам больше не нужно вручную создавать объекты?"
Конечно, вам нужно "вручную" создавать экземпляры объектов, как компилятор узнает, когда или где создать его в ином случае?
Простой сценарий таков:
MyType x;
if ( EverythingWorkedOut )
x = new MyType(params);
else
x = null;
Если компилятор создаст его в первый раз, он будет избыточен и потребует больше всего кода.
Не доверяйте ReSharper или другим компьютерным интеллектуалам из-за собственных инстинктов! Вы знаете, они не всегда правы.
Просто примечание, вам не нужно делать x = null;
так как это должно быть значение по умолчанию для объекта, который не был создан.
Предположим, это ваш код:
var dmrReceived = new DownloadMessagesReport();
dmrReceived = dc.DownloadNewMessages(param, param2, param3);
Вы создаете экземпляр DownloadMessagesReport
в первой строке. А затем вы выбрасываете этот объект, назначая dmrReceived
переменная другое значение, возвращаемое из DownloadNewMessages
метод. Первый new DownloadMessagesReport()
Объект избыточен. Вы эффективно создаете мусор, который в какой-то момент придется убирать сборщику мусора.
Вот почему ReSharper и StyleCop показывают вам предупреждение.
Если вы можете инициализировать переменную с фактическим значением прямо в той же строке, где объявлена переменная, сделайте это.
Конечно, этого достаточно?
DownloadMessagesReport dmrReceived = dc.DownloadNewMessages(param, param2, param3);