オブジェクトの初期化を簡略化できる

私のコードでは、「オブジェクトの初期化を簡略化できる」という3つのメッセージが表示されるのですが、私の知識欲(と強迫性障害)は増すばかりで、これらのメッセージが表示されないようにコードを修正したいと思っています。これらのメッセージが表示されないように設定すればいいのはわかっているのですが、バックグラウンドで表示されていることが頭から離れません。もしどなたか、初期化を簡略化する方法を教えてくださる方がいらっしゃれば、とても助かります。より多くのコードが必要であれば教えてください。

1:

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

第2位:

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

treenodesについては、私が同じ名前をつけたからだと思いますが、名前を変えてみましたが、違いはありませんでした。

**3番目:***。

OleDbCommand select = new OleDbCommand();//this line
select.Connection = cnDTC;
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2);
質問へのコメント (1)

以前の提案もすべて良いですが、3つ目の方法を追加します。 それらの警告をオフにして無視してください。 Microsoftが全員を効率的かつきちんとコーディングしようとする試みに感謝しますが、これは私の意見では良い提案ではなく、実際にはコードの読み取りと編集が困難です。

まず、これにより本質的にオブジェクトの初期化が単一のコード行に変わり、エラーはそのように報告されます。 オブジェクトに20ビットのデータがロードされている場合、最初の行にエラーが表示され、どのプロパティがエラーになっているかはわかりません。 コードのブロック全体をエラーとして表示されているため、デバッグは役に立ちません。

次に、将来コードを拡張して特定のプロパティにコードを追加する必要がある場合は、別のコードでこれを行う必要があります。 これにより、断片化が追加され、関連するコードのビットが分離されます(おそらく、議論の余地があります)。

これらの問題はどちらも非常にマイナーなことのように思えるかもしれませんが、警告は非常にマイナーなことでもある修正を示唆しています。 初期化を括 ⁇ で囲むために、コードをデバッグして変更することが難しくなりました。 これは私の意見では悪いトレードオフです。

警告を右クリックして[抑制]を選択するか、[ツール]>に移動して、警告を無効にできます。オプション>テキストエディター> C#>コードスタイル>一般>オブジェクト初期化を優先>警告を[なし]に設定するか、設定を[いいえ]に設定します。

解説 (6)
ソリューション

第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
};

第2

**前***:

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

After

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

第3

**前

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);

このようなメッセージが表示されたら、その行にカーソルを置いて、Ctrl+.(または、表示されている電球をクリック) - すると、"quick-Fix / quick-refactor&quotが開きます;

さらにvarを読んでください(それは本当に悪ではありません 😉)。 オブジェクトとコレクションのイニシャライザ**]2についてのドキュメントをもう少し読んでください。

解説 (8)

私もこのコードで同じような問題を抱えていた:

        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の場合):

解説 (1)

@tonyenkiducx weenが好きですが、議論すべき全体像のアイデアがあるように感じます。

私の経験から、Visual Studioが提供するリファクターの提案は役に立ちません。 考慮すべきより大きな問題は、コード設計が正しいかどうかだと思います。 オブジェクト指向のプログラミングでは、プロパティを次々に設定 may はカプセル化に違反します。 アイデアは、オブジェクトが破棄されるまで、メンバーにアクセス/呼び出された後、オブジェクトは常に有効な状態にある必要があるということです。 この場合、各プロパティが設定された後に状態が有効になります。 一貫性を高めているため、適切なカプセル化により、ソフトウェアアプリケーションが全体的に改善されます。

「オブジェクトの初期化は簡略化できます」メッセージは、作成パターンを使用できるコードのポイントを検出するのに役立ちます。違反:

-抽象的な工場パターン。 -ビルダーパターン。 -工場メソッドパターン。 -プロトタイプパターン。

これにより、 @ tonyenkiducx :によって提起された懸念に対処できます。

まず、これにより本質的にオブジェクトの初期化が1行のコードに変わり、エラーはそのように報告されます。 オブジェクトに20ビットのデータがロードされている場合、最初の行にエラーが表示され、どのプロパティがエラーになっているかはわかりません。 コードのブロック全体をエラーとして表示されているため、デバッグは役に立ちません。

次に、将来コードを拡張して特定のプロパティにコードを追加する必要がある場合は、別のコードでこれを行う必要があります。 これにより、断片化が追加され、関連するコードのビットが分離されます(おそらく、議論の余地があります)。

したがって、Visual Studioがしばしば示唆するオブジェクトが消費される時点でインスタンス化にインラインを付ける代わりに、クリーショナルパターンの使用を検討することをお勧めします。 これは簡略化メッセージを削除しない可能性がありますが、この時点で、そのメッセージフラグを慎重に検討し、安全に抑制できます。

解説 (0)

コンパイラーは、以下の構文を使うよう求めている:

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

これは3番目のケースです。

解説 (0)