VB.NETで本当にクールなwith()コンストラクトがC#に含まれていないのはなぜですか?
-
07-07-2019 - |
質問
私はC#開発者です。私はC、C ++、Javaのバックグラウンドから来たので、中括弧が大好きです。ただし、VB.NETなど、.NETファミリの他のプログラミング言語も気に入っています。 .NETでしばらくプログラミングを行っていた場合、C#とVB.NETを切り替えることはそれほど大したことではありません。それは私が働いている会社で非常に一般的なアプローチです。 C#の男として、私はVB.NETコンパイラが提供するXMLリテラルと with
キーワードが本当に好きです。 Microsoftがこれらの機能をC#にも含めていたら良かったと思います。
私は好奇心、盛です、他の開発者がそれについて言っていること!
解決
" with"の場合、私は驚かないでしょう。または、同様の機能が、これまで一般的に使用されていたVB専用の機能とともに、最終的にC#に追加されます。最近のPDCや他の場所でのC#4.0プレビュープレゼンテーションでは、「言語のパリティに焦点を当てる」ことについて多くの話がありました。 C#4.0およびVB 10以降。
他のヒント
個人的には、構築後に使用する場合、WITHは好きではありません。オブジェクトを初期化した後にいくつかのことを行う必要がある場合、通常、その動作は型自体にカプセル化する必要があります。本当にWITHのようなことをしたい場合は、短い変数を宣言し、オプションで新しいスコープを導入するだけです。
ただし、いくつかのプロパティを使用してオブジェクトをコンパクトに初期化できると便利です。これが、C#3で記述できる理由です。
MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };
これには制限がありますが(C#4のオプションおよび名前付きパラメーターはこれを克服するのに役立ちます)、潜在的な混乱/あいまいさを招くことなく、それよりも優れています。
(XMLリテラルの面では、私は再びC#チームにいます。XMLは言語に組み込むための非常に特殊な技術です。 XMLを作成しますが、他のツリーの作成にも使用できます。これは、クエリ式がIEnumerableまたはIQueryableに直接関連付けられていないのと同じように素晴らしいことです。)
簡単な1文字の変数名を作成することにより、VB.Netの With
を置き換えることができます。 With
は後で End With
も必要とするため、実際にはコードが少なくなります。
たとえば、かなり頻繁に行う必要があったことの1つは、コントロール/ブレークスタイルレポートのデータテーブル内の行を反復することでした。
vb.netでは、次のようになります。
Dim CurCustomerName As String
Dim CustomerSalesTotal As Decimal
Dim ds As DataSet = GetReportData()
With ds.Tables(0).Rows
Dim i As Integer = 0
While i < .Count
''//{
CurCustomerName = .Item(i)("CustName")
CustomerSalesTotal = 0
PrintHeaderLine(CurCustomerName)
While i < .Count AndAlso CurCustomerName = .Item(i)("CustName")
''//{
PrintItemLine(.Item(i)("OrderTotal"))
CustomerSalesTotal += .Item(i)("OrderTotal")
i+= 1
End While ''//}
PrintSubTotalLine(CustomerSalesTotal)
End While ''//}
End With
C#は次のようになります。
string CurCustomerName;
Decimal CustomerSalesTotal;
DataSet ds = GetReportData();
DataRowCollection r = ds.Tables[0].Rows;
int i=0;
while (i<r.Count)
{
CurCustomerName = r[i]["CustName"];
CustomerSalesTotal = 0;
PrintHeaderLine(CurCustomerName);
while (i<r.Count && CurCustomerName == r[i]["CustName"])
{
PrintItemLine(r[i]["OrderTotal"]);
CustomerSalesTotal += r[i]["OrderTotal"];
i++;
}
PrintSubTotalLine(CustomerSalesTotal);
}
ここで注意すべきことは、VBは WITH
を配列インデックスと組み合わせることができず、 .Item
プロパティを特定のものに使用します。ここでは大したことではありませんが、レポートに2ではなく20のフィールドがあり、1ではなく3つの項目で分割する必要がある場合を想像してください。
もちろん、VBのC#で説明されている手法も使用できます。しかし、注意すべき主なことは、 WITH
は実際には多くを与えないことです。
開発者の好みについてですが、WITHについてはあなたと一緒です。私の好みは、プレイ中の変数の数と、変数が存在する範囲を最小限にすることです。 C#の哲学はほとんど同じようです。しかし、この場合、ここでの応答は、変数を追加する(そして自分に責任を持たせる)ことは、私にとってはラムダに非常に似ているコンストラクトと比較して良いことであることを示唆しているようです。
初期化中に「質量」プロパティの設定のみを許可するのはかなりarbitrary意的だと思います。なぜこれが「悪い」のかわかりません:
MyObj myObj = ObjFactoryFunction();
...
if(someCondition)
myObj { Prop1 = 1, Prop2 = 2 };
このサンプルコードは簡潔で簡潔だと思います。
通常、C#で with
機能のリクエストが表示されると、リファクタリングの恩恵を受けるコードが表示されます。通常、リファクタリングが完了すると、 with
の必要性はなくなります。
オブジェクトへの流なインターフェイスを構築するときのコードの動作が気に入っています。 with
といくつかの類似点があります。 MessageBox.Show()
を設計していた場合、次のように記述できます。
new MessageBox()
.SetText("Hello World!")
.SetButtons(MessageBox.Buttons.OK)
.SetIcon(MessageBox.Icon.Information)
.Show();
Linqでも同様のことがわかります:
var q = Enumerable.Range(1, 100)
.Where(x => x % 2 == 0)
.Select(x => x * x);
with
に少し似ていますが、私がすでに持っている言語に自然に適合するようです。