C# 对象初始化可以简化

C# 对象初始化可以简化,c#,initialization,C#,Initialization,通过我的代码,我收到了3条信息,都说对象初始化可以简化,在我对知识(和OCD)日益增长的渴望中,我想“修复”我的代码,这样这些信息就不会出现。我知道我可以设置它,这样这些信息就不会出现,但我的脑海中仍然会有这样的想法:它们就在背景中,而不是坐在我身边。如果有人能指出如何“简化初始化”,那就太好了,这样我就可以提高自己的技能。如果需要更多的代码,让我知道,我可以添加它 1st: TreeNode node = new TreeNode(drive.Substring(0, 1), driveIma

通过我的代码,我收到了3条信息,都说
对象初始化可以简化
,在我对知识(和OCD)日益增长的渴望中,我想“修复”我的代码,这样这些信息就不会出现。我知道我可以设置它,这样这些信息就不会出现,但我的脑海中仍然会有这样的想法:它们就在背景中,而不是坐在我身边。如果有人能指出如何“简化初始化”,那就太好了,这样我就可以提高自己的技能。如果需要更多的代码,让我知道,我可以添加它

1st:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
第二名:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
我怀疑treenodes是因为我给了他们相同的名字,但我试着改变了名字,但没什么不同

3rd:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);

编译器希望您使用以下语法:

var select = new OleDbCommand
{
   Connection = cnDTC,
   CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2)
};
这是您的第三个案例。

1st 之前

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
node.Tag = drive;
DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line
之后:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
第二名 之前

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
node.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);
3rd 之前:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
之后:

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
3rd(带字符串插值):

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
OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) {
    Tag = drive
};
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);
var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", 
      cnDTC);
顺便说一句:每当出现此类消息时,请尝试将光标放在该行上,然后按Ctrl+。(或单击出现的灯泡)-打开“快速修复/快速重构”


进一步阅读(这真的不是邪恶的我对这段代码也有类似的问题:

        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
        };
用这个密码解决了这个问题:

        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中):
单击工具选项卡。然后转到选项…
然后|文本编辑器| C#|代码样式|常规|
在“表达首选项”下,将“首选对象初始值设定项”更改为“否”


或者,您可以将首选项保留为,并将严重性从警告更改为
建议

现在它将在错误列表中显示为一条消息。

虽然前面的所有建议都很好,但我会添加第三种方法。关闭这些警告并忽略它们。虽然我欣赏微软的试图让每个人都高效、整洁地编码,在我看来,这不是一个好建议,它实际上会产生难以阅读和编辑的代码

首先,这实质上将对象初始化转换为一行代码,任何错误都会这样报告。如果将20位数据加载到对象中,则会在第一行显示错误,而不会告诉您哪个属性出错。调试将不会有帮助,因为您将整个代码块显示为er罗

其次,如果将来需要扩展代码并为特定属性添加额外的代码,那么现在需要在单独的代码中执行。这会增加碎片并分离相关的代码位(可能有争议)

这两个问题看起来都很小,但警告提示了一个解决方案,这也是一个很小的问题。为了将您的初始化括起来,您使您的代码更难调试和修改。在我看来,这是一个糟糕的权衡

您可以通过右键单击警告并选择“抑制”来禁用警告,或转到工具>选项>文本编辑器>C#>代码样式>常规>首选对象初始值设定项>并将警告设置为无,或将首选项设置为否。 我喜欢,但我觉得似乎有一些更大的想法需要讨论

<>从我的经验来看,VisualStudio提供的重构建议是没有帮助的。我认为更大的问题是代码设计是否正确。在面向对象的编程中,一个接一个地设置属性<强> 5 < /强>违反封装。这个想法是,对象应该总是在有效的ST中。在任何成员被访问/调用后ate,直到对象被销毁。在这种情况下,设置每个属性后,状态应有效。适当的封装将导致软件应用程序的整体改进,因为您正在增强其内聚性

对象初始化可以简化
消息可能有助于在违反封装的情况下检测代码中可以使用的点:

  • 抽象工厂模式
  • 构建器模式
  • 工厂方法模式
  • 原型模式
这使我们能够解决tonyenkiducx提出的问题:

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
node.Tag = drive;
DirectoryInfo di = new DirectoryInfo(dir);
TreeNode node = new TreeNode(di.Name, 0, 1); //this line
首先,这实质上是将对象初始化转换为一行代码,任何错误都会这样报告。如果将20位数据加载到对象中,则会在第一行显示错误,而不会告诉您哪个属性出错。调试不会有帮助,因为您会将整个代码块显示为错误r

其次,如果将来需要扩展代码并为特定属性添加额外的代码,那么现在需要在单独的代码中执行。这会增加碎片并分离相关的代码位(可能有争议)


这样,而不是在对象被消费的点内联实例化,这是VisualStudio经常建议的,我建议您考虑使用创建模式。这可能不会删除简化消息,但此时,您已经仔细考虑了消息标志并可以安全地抑制它。

谢谢,但我不在这里。为什么
var
比实际给出它的类型更简单,因为据我所知
var
用于不同的类型?不,绝对不是,请继续阅读链接文章,它只是一个“快捷方式”。(试着将鼠标指针放在var声明上,这将给出准确的推断类型。var!=variant!!!!:)顺便说一句,您正在使用string.Format打开sql注入的应用程序。^^^>这只是我,还是其中的一些人