1

いくつかのフラット メンバーといくつかのネストされた複雑な型を持つ複雑な C# クラスがあります。

一般的な慣行として、データがない場合、「ネストされた」複合型を初期化しません。

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

Public class Person
{
 public string FirstName{get;set;}
 public Address{get;set;}
}

私はしませんPerson p = new Person(){FirstName="Test", Address = new Address()};

ただし、「すべてのサブ」複合型を初期化するように言われていますが、私の意見では、これは当てはまりません。データがないのにメモリを割り当てる理由。オブジェクトが空かどうかをどのように判断しますか。すべての値を比較しますか/何らかのラグを定義しますか、または空のインスタンスを表す特殊なサブクラスを定義しますか?

フィードバックをお待ちしております。

4

3 に答える 3

1

アクセスする前にすべてのプロパティをチェックするランタイム コストは、nullすべてのフィールドを「空の」オブジェクトで初期化するよりも高くなる可能性があります ( Null オブジェクト パターンを参照)。「空」/「null オブジェクト」のメモリ コストは、すべてのオブジェクトで単一の読み取り専用インスタンスを単純に共有できるため、非常に小さい可能性があります。

また、一部のオブジェクトの一部を初期化しないままにしておくと、オブジェクトnullにアクセス/使用する前にチェックが必要かどうかを調べるために、開発者に非常に高いコストがかかります。

基本的に、一部のフィールドを初期化しないことでいくつかの利点が得られる場合がありますが、プロパティへのすべてのアクセスがnullフィールドへのアクセスから適切に保護されていることを確認するために多くの時間を費やす必要があります。

于 2013-10-29T02:18:39.643 に答える
0

簡単にするために、コンストラクター内で初期化できます。

public class Person
{
    public Person()
    {
        this.Address = new Address();
    }
    public string FirstName {get; set;}
    public Address {get; set;}
}

.

// Don´t need to do Person p = new Person(){ FirstName="Test", Address = new Address()}; 
Person p = new Person();

何百万ものオブジェクトを持っている場合、または何百万ものオブジェクトがあることがわかっている場合を除き、心配する必要はありません。

于 2013-10-29T02:19:41.317 に答える
0

次のパターンを使用できます。

Public class Person
{
  private Address address;

  public Address Address 
  {
    get
    {
      return address ?? (address = new Address()); 
    }
  }
}
于 2013-10-29T02:22:42.660 に答える