инициализация объекта может быть упрощена

С моим кодом я получаю 3 сообщения, все говорящие, что object initialization can be simplified и в моей растущей жажде знаний (и моем OCD) я хотел бы "исправить" мой код, чтобы эти сообщения не появлялись. Я знаю, что могу просто установить его, чтобы эти сообщения не появлялись, но у меня все еще есть в голове, что они там в фоновом режиме, которые не сидят прямо со мной. Если кто-нибудь может указать, как "упростить инициализацию", это было бы здорово, чтобы я мог улучшить свои навыки. Если требуется больше кода, дайте мне знать, и я могу добавить его.

первая:

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);//issue on this line
node.Tag = drive;

второй:

DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line

Я подозреваю, что с treenodes его, потому что я дал им то же имя, но я попытался изменить имя, но это не изменило ситуацию.

третий:

OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);

Ответ 1

первый

До:

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
node.Tag = drive;

После:

var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};

второй

До:

DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line

После:

var node = new TreeNode((new DirectoryInfo(dir)).Name, 0, 1);

третий

До:

OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})",
      strSQL2);

После:

var select = new OleDbCommand(
      String.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2), 
      cnDTC);

3-й (со строчной интерполяцией):

var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);

BTW: всякий раз, когда появляется такое сообщение, попробуйте поместить курсор на эту строку и нажмите Ctrl + . (или щелкните появившуюся лампочку), которая открывает "быстрый-исправление/быстрый рефакторинг",

Далее читаем о var (это действительно не зло) и еще несколько документов об инициализаторах объектов и коллекций

Ответ 2

Хотя все предыдущие предложения тоже хороши, я бы добавил третий путь. Отключите эти предупреждения и игнорируйте их. Хотя я ценю попытки Microsoft сделать так, чтобы все работали эффективно и аккуратно, на мой взгляд, это не очень хорошее предложение, и на самом деле это затрудняет чтение и редактирование кода.

Во-первых, это по существу превращает инициализацию объекта в одну строку кода, и любые ошибки сообщаются как таковые. Если в объект загружено 20 бит данных, в первой строке вы увидите сообщение об ошибке и не будет указано, в каком свойстве произошла ошибка. Отладка не поможет, так как в качестве ошибки отображается весь блок кода.

Во-вторых, если вам в будущем потребуется расширить код и добавить дополнительный код для определенного свойства, вам теперь нужно будет сделать это в отдельном коде. Это добавляет к фрагментации и разделяет смежные биты кода (Может быть, это спорно).

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

Вы можете отключить предупреждение, щелкнув правой кнопкой мыши предупреждение и выбрав "подавить", или перейдите в "Инструменты"> "Параметры"> "Текстовый редактор"> "С#"> "Стиль кода"> "Общие"> "Инициализировать объект"> и установите для предупреждения значение "Нет" или установите для параметра "Предпочтение" значение "Нет". Нет.

Ответ 3

У меня была похожая проблема с этим кодом:

        Customer oCust = new Customer();
        oCust.Address = txtAddress.Text;
        oCust.City = txtCity.Text;
        oCust.State = txtState.Text;

И решил это с помощью этого кода:

        Customer oCust = new Customer()
        {
           Address = txtAddress.Text,
           City = txtCity.Text,
           State = txtState.Text
        };

Оооочень... чтобы отключить предупреждение (IDE0017) (в VS 2017/2019):
Нажмите на вкладку Tools. Затем спуститесь к Options...
Тогда | TextEditor | С# | CodeStyle | Генерал |
В настройках Expressoin измените Prefer Object Initializer на No.

В качестве альтернативы вы можете оставить параметр " Да" и изменить уровень серьезности с "Предупреждение" на "Предложение". Теперь он будет отображаться как сообщение в списке ошибок.

Ответ 4

Мне нравится @tonyenkiducx ответ, но я чувствую, что есть некоторые идеи большой картины, которые следует обсудить.

По моему опыту, предложения по рефактору, предоставленные Visual Studio, не помогают. Я думаю, что более важным вопросом является вопрос о правильности дизайна кода. В объектно-ориентированном програмировании параметры настройки один за другим могут нарушать инкапсуляцию. Идея состоит в том, что объект всегда должен находиться в правильном состоянии после того, как любой член будет доступен или вызван до момента уничтожения объекта. В этом случае состояние должно быть действительным после каждого свойства. Правильная инкапсуляция приведет к общему улучшенному программному приложению, потому что вы увеличиваете свою сплоченность.

object initialization can be simplified сообщения могут быть полезны при обнаружении точек в вашем коде, где вы можете использовать шаблон создания, в случае, если инкапсуляция нарушена:

  • Абстрактный заводской шаблон
  • Образец Builder
  • Модель фабричного метода
  • Шаблон прототипа

Это позволяет нам решать проблемы, вызванные @tonyenkiducx:

Во-первых, это по существу превращает инициализацию объектов в одну строку кода, и любые ошибки сообщаются как таковые. Если у вас было 20 бит данных, которые были загружены в объект, вам будет представлена ошибка в первой строке и не будет указано, какое свойство имеет ошибку. Отладка не поможет, так как вам будет показан весь блок кода как ошибка.

Во-вторых, если в будущем вам нужно будет расширить код и добавить дополнительный код для определенного свойства, вам нужно будет сделать это в отдельном коде. Это добавляет к фрагментации и разделяет смежные биты кода (Может быть, это спорно).

Таким образом, вместо того, чтобы встраивать экземпляр в точке, в которой объект потребляется, что часто предлагает Visual Studio, я предлагаю вам рассмотреть использование шаблона создания. Это может не удалить сообщение об упрощении, но на данный момент вы задумались над этим флагом сообщения и можете безопасно его подавить.

Ответ 5

Компилятор хочет, чтобы вы использовали следующий синтаксис:

var select = new OleDbCommand
{
   Connection = cnDTC,
   CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2)
};

Это для вашего третьего случая.