1

私はこのコードに出くわし、他の人に彼らの視点を提供してもらいたいと思いました...それは良いですか悪いですか?;)

Class ReportClass
{
 public string ReportName {get; set;}
}

次に、コードで次のように使用されました。

displayReport(ReportClass.ReportName = cmbReportName.SelectedValue.ToString())

それは私があなたに与えることができる最も単純な形の例についてです。質問は...なぜ私は例を見つけることができないのですか?これは何と呼ばれますか?これはただトラブルを求めているだけですか?

編集:私はインプレース割り当てを参照しています。今日まで気づかなかった

4

9 に答える 9

6

私はインプレース代入を避ける傾向があります-または実際にはこのような副作用-1つの一般的なイディオムを除いて:

string line;
while ((line = reader.ReadLine()) != null)
{
    // Do something with line    
}

(およびストリームを読み取るためのバリアントなど)

パラメータ呼び出しでオブジェクト初期化子を使用しても問題ありません。

Foo(new Bar { X=1, Y=2 });

しかし、既存のオブジェクトのプロパティに割り当てる... まあ、それはすべて主観的ですが、私のお茶ではありません.

于 2008-11-06T20:45:06.247 に答える
4

それはまったく問題ありません。両方とも。

  • 自動プロパティ ({get; set;}モノ): C# で導入されました。非常に便利な機能です。

  • パラメーターの代入: C# ではめったに使用されませんが、完全に合法です。基本的には、代入演算子 (=) の右側の式の値をプロパティの左側のプロパティに代入し、この値をメソッドに渡します。

    これは C ではより一般的ですが、C# でも許可されるべきではない理由はわかりません。読みやすさが向上することもあれば、さらに悪化することもあります。常識を働かせて、どちらがいつ適用されるかを判断してください。

于 2008-11-06T20:35:26.390 に答える
4

これは、コードを維持するのが難しい/デバッグするのが難しい/コードを理解するのが難しいと思います. そのメソッドを呼び出す前に、行で割り当てを行います。

ReportClass.ReportName = cmbReportName.SelectedValue.ToString();
displayReport(ReportClass.ReportName);

私は複合文のファンではありませんでした。

于 2008-11-06T20:30:36.133 に答える
2

自動プロパティまたはインプレース割り当てのことですか?

チームの IMO によって異なります。チームが C スタイルの開発者で構成されている場合。それなら大丈夫だと思います。

しかし、このコードがたとえば VB 開発者によってさらに保守される場合は、これをより読みやすくする必要があります。

例?C 言語の代入演算子 (=) も、割り当てられた値を返します。

var a = 0;
var b = 0;

// This makes a *and* b equals to 1
a = b = 1; 

// This line prints 3 and a is now equals to 3
Console.WriteLine(a = 3);

// This line prints 7 and a and b is now equals to 7
Console.WriteLine(a = b = 7);

このような課題が発生するのはむしろ自然なことだと思います。C言語はIMOの略記を奨励しているように見えるからです。

読みやすさと問題の軽減が必要な場合は、改行を追加するとよいでしょう。

displayReport(
    ReportClass.ReportName = cmbReportName.SelectedValue.ToString());

複合ステートメントが異なる行にある場合は、意図をより明確にします。(ただし、まだ複合ステートメント)

または、最初に正しい部分を独自の変数に抽出します。

var reportName = cmbReportName.SelectedValue.ToString();

displayReport(ReportClass.ReportName = reportName);

私はいつもそれを使っていますが、それを読んで混乱している人を見たことがありません。

于 2008-11-06T20:27:16.580 に答える
2

Microsoft Framework のデザイン ガイドラインでは、ステートメントのように直接的な言語サポートがある場合を除き、複数のステートメントを 1 行に配置することは推奨されていませんfor。複数代入の明示的な言語サポートがあるため、

int a, b, c;
a = b = c = 0;

許可されています。一方、例で使用されている形式のコードはお勧めできません。

これはどうですか、人々?

while ((packetPos = Packet.FindStart(buffer, nextUnconsideredPos)) > -1)

インライン割り当てを回避するには、次のように冗長に因数分解する必要があります。

packetPosition = Packet.FindStart(buffer, nextUnconsideredPosition);
while (packetPosition > -1)
{
  ...
  packetPosition = Packet.FindStart(buffer, nextUnconsideredPosition);
}
于 2008-11-06T20:46:18.863 に答える
2

個人的には、パラメーターとしての割り当てはあまり読みにくいと思います。実行の全体的なフローは、パラメーター リスト内で実際に操作が行われることによって歪められます。

私は自分のコードが空白を保存するのではなく、意図を表現するべきだと考えるのが好きです。そして、この例での私の意図は、まさに EvilSyn が提案するものであり、最初に値を割り当て、次にそれをメソッドに渡します。

于 2008-11-06T20:47:25.460 に答える
-1

プロパティに名前を付ける限り、ReportClass があります。これを Report に変更し、そのプロパティを ReportName から Name に変更します。入力の手間を省きます (ただし、インテリセンスは利用可能です)。Report.Name としてコーディングすると見栄えが良くなります。

私はそれが少し話題から外れていることを知っていますが、ちょっとホー

于 2008-11-07T12:43:38.670 に答える
-1

私には問題ないようです。おそらく C# 3.0 でコンパイルされており、C# の自動プロパティが許可されています。

于 2008-11-06T20:24:47.613 に答える
-2

それは本当に有効なコードですか?私には静的クラスのようです。

私はあなたが次のようにそれを使用したと推測したでしょう:

displayReport(new ReportClass { ReportName = cmbReportName.SelectedValue.ToString() } )
于 2008-11-06T20:39:55.570 に答える