28

今日、Infragistics コントロール ライブラリのオンライン ヘルプを見ていたら、Withキーワードを使用してタブ コントロールに複数のプロパティを設定する VB コードを見つけました。VB プログラミングを始めてから 10 年近くが経ちましたが、このキーワードが存在することすらほとんど忘れていました。私はまだ C# に比較的慣れていないので、同様の構造があるかどうかをすぐに確認しました。悲しいことに、私は何も見つけることができませんでした。

C# には、VBのWithキーワードによって提供される機能を模倣するキーワードまたは同様の構造がありますか? そうでない場合、C# にこれがない技術的な理由はありますか?

編集: 質問をする前に、これに関する既存のエントリを検索しましたが、レイが参照したものは見つかりませんでした(here)。質問を絞り込むために、C# にこれがない技術的な理由はありますか? そして Gulzar はそれを釘付けにしました - いいえ、C# にWithキーワードがない技術的な理由はありません。これは、言語設計者による設計上の決定でした。

4

7 に答える 7

26

これは、C# プログラム マネージャーが言わなければならないことです: なぜ C# には 'with' ステートメントがないのですか?

  • 読みやすさのメリットが小さいか、まったくない。読みやすさのメリットは小さいか、存在しないと考えました。with ステートメントがコードを読みにくくするとまでは言いませんが、そうする人もいるでしょう。

  • 言語の複雑さの増加。with ステートメントを追加すると、言語がより複雑になります。たとえば、VB では、ローカル変数 (Text) と "with" ターゲット (.Text) のプロパティの間の潜在的なあいまいさに対処するために、新しい言語構文を追加する必要がありました。この問題を解決する他の方法も、言語の複雑さをもたらします。もう 1 つの方法は、スコープをプッシュしてプロパティでローカル変数を非表示にすることですが、エスケープ構文を追加しないとローカル変数を参照する方法がありません。

  • C++ の遺産。C++ には with ステートメントがありませんでした。そのようなステートメントがないことは、C++ 開発者にとって一般的に問題とは考えられていません。また、他の変更 (人々が書いているコードの種類の変更、プラットフォームの変更、言語のその他の変更など) がより必要なステートメントで行われたとは感じませんでした。

于 2009-03-02T03:12:50.307 に答える
16

C# 3.0 では、オブジェクト初期化子を使用して、オブジェクトの作成時に同様の効果を得ることができます。

var control = new MyControl
{
    Title = "title",
    SomeEvent += handler,
    SomeProperty = foo,
    Another = bar
};

それよりも:

var control = new MyControl();
control.Title = "title";
control.SomeEvent += handler;
control.SomeProperty = foo;
control.Another = bar;

この構文は C# 3.0 で導入されましたが、2.0 フレームワークでも引き続き使用できます。これは、コンパイラによって導入されたシンタックス シュガーに過ぎないことに注意してください。

于 2009-03-02T03:17:31.997 に答える
11

これは慣用的な c# ではありませんが、本当にwith同等のものが必要な場合は、次のようにすることができます。

Person MyPersonWithALongName = new Person();
MyUtils.With(MyPersonWithALongName, p => {

    p.Name = "George";
    p.Address = "123 Main St";
    ...

});

class MyUtils {

    public static void With<T>(T x, Action<T> do) {
        do(x);
    }
}

更新:
これを拡張メソッドに変えることで、これをより簡潔にすることができます。おそらく、再利用可能にするために「Alias」または「As」という名前に変更します。

MyPersonWithALongName.Alias(p => {
    p.Name = "George";
    p.Address = "123 Main St";
    ...
});
于 2009-03-02T04:04:10.120 に答える
9

いいえ、「with」キーワードは意図的に言語から除外されました。

参照の名前が長い場合は、変数を使用して簡単に短い参照を作成し、スコープを制限することもできます。

{
   SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece;
   r.Some = 42;
   r.Properites = "none";
   r.To = 1;
   r.Set = null;
}
于 2009-03-02T03:21:57.773 に答える
1

これらのソリューションの場合:

// ....
// (class Common)

public static void With<T>(T property, Action<T> action) {
    action(property);
}

// ...
// usage somewhere ...    
Person person = GetPerson();
Common.With(person, p => { p.Name = "test", p.Age = "123" });

変数を「p」でエイリアシングしているようです。ソリューションが進むにつれて、変数名を短くするのは簡単だと思いました。「With」ジェネリックを使用したこの種のソリューションは、エレガンスを購入しません。

理想的には、構文を少し作り直して、複数のプロパティの初期化が今日どのように機能するかと同じように使用できるようにしたいと思います。

Person person = new Person() { Name = "test", Age = "123" };
于 2011-11-29T18:01:46.210 に答える
0

いいえ、C# 開発チームが意識的に下した決定です。with キーワードを悪用すると (with のネスト)、コードの可読性が低下する可能性があるため、人々は 'with' キーワードについて複雑な感情を抱いています。

于 2009-03-02T03:11:59.153 に答える
-1

存在しない技術的な理由があるとは思いません。私が言いたいのは、それが存在しない理由は、それがタイピングを減らすためだけに存在するプログラミング構造だからだということです。インテリセンスやコピー アンド ペーストなどの機能により、このような機能に対する世界の需要はあまりありません。私は VB.Net を使用していますが、まだサポートされているかどうか思い出せません。それを使用する必要性を本当に感じたことはありません。

于 2009-03-02T03:12:21.820 に答える