2

この猫のスキンを作成する方法は他にもあると思いますが、C#で「メイン」オブジェクトをインラインでインスタンス化するときに、サブクラスのプロパティを直接設定できない理由を誰かが理解してくれることを願っています。

たとえば、次のクラスがある場合:

public class SubClass
{
  public string SubField { get; set; }
}

public class MainClass
{
  public string MainField { get; set; }
  public SubClass Sub { get; set; }

  public MainClass()
  {
    Sub = new SubClass();
  }
}

次の手順を実行しようとするとエラーが発生します。

var main = new MainClass
{
  MainField = "Main Value",
  Sub.SubField = "Sub Value"
};

「Sub.SubField=...」行で発生するエラーは、次のとおりです。

* "Invalid initializer member declarator"
* "The name 'Sub' does not exist in the current context"

もちろん、以下は機能します。

var main = new MainClass
{
  MainField = "Main Value",
  Sub = new SubClass { SubField = "Sub Value" }
};

しかし、それはもっと面倒で、私の意見では、あまりカプセル化されていません。

C#が宣言されたオブジェクトを認識しない理由や、インスタンス化されていないことをC#が認識する方法に戸惑います。他の状況ではそれほど注意しません。

私は主要な概念を見逃していると確信しています。私を啓発するまでの誰か?前もって感謝します!

4

3 に答える 3

3

これはあなたが望むことをします:

var main = new MainClass { 
  MainField = "Main Value", 
  Sub = { SubField = "Sub Value" } 
}; 

上記のコードは、実際には次の行に沿ってコンパイルされます。

var main = new MainClass(); 
main.MainField = "Main Value";
main.Sub.SubField = "SubValue";

オブジェクトの初期化構文は、ノイズが少し少ないので気に入っています。ほとんどの開発者はC#ブロックの操作に慣れているため、すべてをまとめておく可能性が高くなります。

また、MainClassのSubプロパティにプライベート設定を持たせることをお勧めします。

于 2012-10-12T17:28:41.110 に答える
2

まず、それはサブクラスではありません。これは、プロパティとして公開される別のオブジェクトです...

MSを引用するには:オブジェクト初期化子を使用すると、コンストラクターを明示的に呼び出すことなく、作成時にオブジェクトのアクセス可能なフィールドまたはプロパティに値を割り当てることができます。

参照: http: //msdn.microsoft.com/en-us/library/bb384062.aspx

于 2012-10-12T17:15:31.663 に答える
0

あなたが試みていることは違法であり、とにかく意味がありません。なぜなら、それSubは新しいオブジェクトだからです。あなたはまだあなたが望むことを達成することができます(アンディの答えを参照してください)。

セクション7.6.10.2C#言語仕様のオブジェクト初期化子を見てください。これは次のように述べています。

オブジェクト初期化子は、{および}トークンで囲まれ、コンマで区切られた一連のメンバー初期化子で構成されます。各メンバー初期化子は、初期化されるオブジェクトのアクセス可能なフィールドまたはプロパティに名前を付け、その後に等号と式、またはオブジェクト初期化子またはコレクション初期化子を指定する必要があります。オブジェクト初期化子が同じフィールドまたはプロパティに複数のメンバー初期化子を含めることはエラーです。オブジェクト初期化子が、初期化する新しく作成されたオブジェクトを参照することはできません。

于 2012-10-12T17:40:20.700 に答える