c#Visual Basicキーワードの等価: 'with'… 'end with'?
-
09-10-2019 - |
質問
Visual Basicでは、単一のオブジェクトの複数のプロパティを変更する場合、 With/End With
声明:
Dim myObject as Object
// ' Rather than writing:
myObject.property1 = something
myObject.property2 = something2
// ' You can write:
with myObject
.property1 = something
.property2 = something2
...
End With
C#は新しいオブジェクトを作成するときにそれを行うことができることを知っています:
Object myObject = new Object { property1 = something, property2 = something2, ...};
しかし、どうすればそれをすることができますか myOject
すでに作成されています(Visual Basicが行っているように)?
解決
これはC#ではできません。
この機能はVBに固有であり、C#で最も近いものは、説明するようなオブジェクトイニシャルです。
他のヒント
これはどう?
static class Extension
{
public static void With<T>(this T obj, Action<T> a)
{
a(obj);
}
}
class Program
{
class Obj
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
}
static void Main(string[] args)
{
var detailedName = new Obj();
detailedName.With(o => {
o.Prop1 = 1;
o.Prop2 = 2;
o.Prop3 = 3;
o.Prop4 = 4;
});
}
}
多くのタイピングを避けようとしている場合は、オブジェクトに短い名前を付けることができます。
var x = myObject;
x.property1 = something;
x.property2 = something2;
C#がVB.NETの「with 'オペレーターを持っていないのはなぜですか?
C#言語デザイナーを含む多くの人々は、「しばしば」読みやすさを傷つけることが多く、祝福というよりも呪いのようなものだと信じています。意味のある名前でローカル変数を宣言し、その変数を使用して、単一のオブジェクトで複数の操作を実行することは、ある種の暗黙のコンテキストを持つブロックを持つよりも、単一のオブジェクトで複数の操作を実行することが明確です。
VB.NETには、後方互換性のためにVB6の設計上の欠陥の一部が含まれています。 JavaScriptには同じ設計上の欠陥があります(実際、さらに悪いものです。 with
より曖昧な構成要素につながる)、他のほとんどのC-Syntax言語はそうではないので、C#に追加することには後方互換性の利点はありません。
@マークバイヤーズの答え 良いですが、変数です x
プロパティが設定された後に生きます。そして、あなたは名前を使うことができません x
繰り返します(同じブロック)。
これを試して (オブジェクトは、このサンプルの参照タイプでなければなりません) :
void Main()
{
var myObject1 = new Foo();
var myObject2 = new Hoo();
//elided...
{
var _ = myObject1;
_.MyPropertyA = 2;
_.MyPropertyB = "3";
}
{
var _ = myObject2;
_.MyPropertyX = 5;
_.MyPropertyY = "asd";
}
}
「with」式がクラスタイプである場合、「with」ステートメントは、そのタイプの新しい一時変数を作成し、「with」式で初期化され、各リーディング」に先行することに相当します。その変数で。ただし、構造タイプの場合、物事はより複雑です。コードを考慮してください(明らかに、通常は何かを書く方法ではなく、ポイントを作るために書かれています。
With MyPoints(N) ' Array of Point N=SomeNewValue .X = MyPoints(N).X .Y = MyPoints(N).Y End With
「with」ステートメントは、私のポイント(n)への参照を効果的にラッチします。私のポイントが他のいくつかの配列に変更された場合、またはnが変更されたとしても、ラッチされた参照は、withステートメントが実行されたときと同じ配列の同じ要素を指します。タイプポイントのローカル変数Pを宣言し、MyPoints(n)をつかんでからPXとPYに書き込みた場合、writeは配列を更新するのではなく、ローカルコピーPにのみヒットします。 C#で同様のセマンティクスを達成するには、ローカル変数を使用してmypointsとnの両方を保持するか、型ポイントのrefパラメーターを持つ匿名関数内にステートメントの内容を配置する必要があります。実行時に閉鎖を作成する必要がないようにするために、匿名関数は、おそらく参照により、外部スコープから必要なローカル変数も受け入れる必要があります。