0
public Planet(string planetName,string planetLocation,string distance)
{
    //Is this okay to do in C#?
    Name = planetName;
    this.planetLocation = planetLocation;
    this.galaxy = galaxy;

    // etc.
}

public String Name
{
    get
    {
        return planetName;
    }
    set
    {
        if (value == null)
        {
            throw new ArgumentNullException("Name cannot be Null");
        }

        this.planetName = value;
    }
}

私が言いたいことを示すために、この簡単な例を作成しました。

  1. C# コンストラクターが独自の Getter/Setter プロパティを呼び出しても問題ありませんか? Name が null の場合、ArgumentNullException がスローされます。

  2. コンストラクターからセッター プロパティを呼び出すことが推奨されない場合、コンストラクターで例外を実装して、名前フィールドが空白にならないようにするにはどうすればよいでしょうか? つまり、Planet myPlanet = new Planet(null,"9999999","Milky Way"); と言うと、この方法でオブジェクトを作成した場合、例外が確実にスローされるようにするにはどうすればよいですか?

4

3 に答える 3

3
  1. はい、大丈夫です。

  2. セッターを呼び出すコードは例外をスローします。コンストラクターでプロパティを設定する代わりに、初期化子を使用して設定することもできます。

      // Will also throw
      var planet = new Planet("999999","Milky Way"){ Name = null };

于 2012-09-22T16:30:00.933 に答える
2

1) コンストラクターでプロパティを呼び出すのが一般的かどうかはわかりませんが、なぜそうしないのでしょうか? 私は自分のコンストラクターですべての変数を直接呼び出します。

2)コンストラクターでこれを簡単に行うことができます:

if(planetname == null)
    throw new ArgumentNullException("bla");
this.planetname = planetname;

したがって、常にplanetname等しいnullaArgumentNullExceptionがスローされます。そうでないnull場合、値は に割り当てられplanetnameます。

public string Name
{
    get{ return name; }
    set
    {
        value != null ? name = value : throw new ArgumentNullException("Bla");
    }
}

それが私がする方法です。多分それは助けます

于 2012-09-22T16:34:03.557 に答える
1

コードで Set/Set プロパティを呼び出すことは可能ですが、contract による設計に従うには、コンストラクターで null をチェックするより良い方法です。

public Planet(string planetName,string planetLocation,string distance) 
{ 
    if (string.IsNullOrEmpty(planetName))  
         throw new ArgumentNullException("Name cannot be Null"); 

    Name = planetName; 
    // More code lines
} 

public String Name {get; private set; }

P/S: IMO、フィールドよりもプロパティを使用し、本当に必要でない限りプロパティにコードを追加しないでください。次のように単純にしてください。

public String Name {get; private set; }
于 2012-09-22T16:29:53.670 に答える