2016-08-29 3 views
1

NULLプロパティを検証したい場合、NULLの場合は空の文字列を返したいと思います。そのために私はクラス以下のように作成しました:returingする前にヌルプロパティを確認する

public class TestValue 
{ 
    public string CcAlias 
    { 
     get 
     { 
      return string.IsNullOrEmpty(CcAlias) ? string.Empty : CcAlias; 
     } 
     set 
     { 
      CcAlias = CcAlias ?? string.Empty; 
     } 
    } 
} 

とコードの下で私のクラスをテストした:

System.StackOverflowException was unhandled 
    HResult=-2147023895 
    Message=Exception of type 'System.StackOverflowException' was thrown. 
    InnerException: 
+0

カスタムコードをまったく実行している場合、自動プロパティは使用できません。カスタム機能の場合(あなたがやっているような)、あなた自身でプロパティのコードを実装する必要があります(メンバー変数からの値の格納と取得を含む)。 –

答えて

3

あなたのセッター:

private void TestMethod() 
    { 
     var testValue = new TestValue(); 
     testValue.CcAlias = null; 

     MessageBox.Show(testValue.CcAlias); 
     //I thought an empty string will be shown in the message box. 
    } 

は、残念ながらエラーが下に記載されて来ていますゲッターは自分自身を再帰的に呼びます:

set 
{ 
    CcAlias = CcAlias ?? string.Empty; 
} 

これはCcAliasゲッターを呼び出し、再びを呼び出して(テストでは​​)となり、何度も繰り返してStackOverflowExceptionにつながります。

はあなたのセッターでこれをバッキングフィールドを宣言して設定する必要があります。

public class TestValue 
{ 
    private string __ccAlias = string.Empty; // backing field 

    public string CcAlias 
    { 
     get 
     { 
      // return value of backing field 
      return string.IsNullOrEmpty(_ccAlias) ? string.Empty : _ccAlias; 
     } 
     set 
     { 
      // set backing field to value or string.Empty if value is null 
      _ccAlias = value ?? string.Empty; 
     } 
    } 
} 

は、だから、バッキングフィールド _ccAliasであなたの文字列を格納し、あなたのゲッターは、このフィールドの値を返します。
設定者がこのフィールドを設定するようになりました。セッターの引数はキーワード valueで渡されます。

+0

これは理にかなっています!私が問題を理解できるようにしてくれてありがとう。 –

関連する問題