10

私は C# 開発者です。私は C、C++、および Java のバックグラウンドを持っているので、中括弧が大好きです。ただし、VB.NET など、.NET ファミリの他のプログラミング言語も好きです。C# と VB.NET の間を行き来することは、.NET でしばらくプログラミングを行ってきた場合、それほど大したことではありません。私が働いている会社では、それは非常に一般的なアプローチです。C# の専門家として、私は VB.NET コンパイラが提供する XML リテラルとwithキーワードがとても気に入っています。Microsoft がこれらの機能を C# にも含めていたらよかったのにと思います。

他の開発者がそれについて何を言わなければならないのか、私はただ興味があります!

4

6 に答える 6

16

個人的には、WITH を構築後に使用するのは好きではありません。初期化後にオブジェクトでいくつかのことを行う必要がある場合、通常、その動作は型自体にカプセル化する必要があります。本当に WITH のようなことをしたい場合は、短い変数を宣言し、オプションで新しいスコープを導入するだけです。

ただし、いくつかのプロパティを使用してオブジェクトをコンパクトに初期化できると便利です。これがまさに、C# 3 で次のように記述できる理由です。

MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };

これには制限があります (C# 4 のオプションの名前付きパラメーターが克服するのに役立ちます) が、潜在的な混乱やあいまいさにつながることなく、以前よりも優れています。

(XML リテラルの面では、私は再び C# チームに参加しています。XML は、言語に組み込むための非常に特殊なテクノロジです。XML を作成するために使用され、他のツリーを作成するために使用できる一般化された形式を考え出すことができれば、クエリ式が IEnumerable や IQueryable に直接関連付けられていないのと同じように、それもいいでしょう。)

于 2009-01-09T21:59:03.263 に答える
3

With簡単な 1 文字の変数名を作成することで、VB.Net を置き換えることができます。後で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、特定のことについてはプロパティを調べる必要があったため、C# バージョンでは実際にはタイピングが少なくて済みました。ここでは大したことではありませんが、レポートに 2 つではなく 20 のフィールドがあり、1 つではなく 3 つの項目でブレークする必要があると想像してください。

もちろん、C# で示した手法を VB にも使用できます。しかし、注意すべき主なことは、WITH実際にはあまり効果がないということです。

于 2009-01-09T22:17:16.737 に答える
1

通常、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私がすでに持っている言語に自然に適合しているようです。

于 2009-01-12T07:47:45.353 に答える
1

開発者の好みの問題ですが、WITH については同意します。私の好みは、作用する変数の数とそれらが存在する範囲を最小限に抑えることです。C# の哲学はほとんど同じようです。しかし、この場合、ここでの回答は、変数を追加する (そして自分で責任を負う) ことは、私にとってラムダに非常に似ている構造と比較して良いことであることを示唆しているようです。

于 2009-01-09T22:24:56.457 に答える
1

初期化中に「質量」プロパティの設定のみを許可するのは、かなり恣意的だと​​思います。これが「悪い」理由が本当にわかりません:

MyObj myObj = ObjFactoryFunction();

...

if(someCondition)
  myObj { Prop1 = 1, Prop2 = 2 };

このサンプル コードは、クリーンで簡潔だと思います。

于 2009-01-10T00:53:57.233 に答える
0

「With」または同様の機能が、これまで人気のある VB のみの機能と一緒に最終的に C# に追加されたとしても、私は驚かないでしょう。最近の PDC などでの C# 4.0 プレビュー プレゼンテーションでは、C# 4.0 と VB 10 から始まる「言語の同等性への注目」の高まりについて多くの話がありました。

于 2009-01-12T05:01:12.833 に答える