2016-07-01 10 views
4

属性を初期化するときに値get; set;を定義しようとしています。c#使用方法get;値が設定されていない場合は値を返しますか?

AggregateFunction == AggregateFunctions.None || ColumnKey == null場合、私は私がする必要がどのような次のインターフェイス

public interface IReportColumn 
{ 
    string Title { get; set; } 

    string ColumnKey { get; } 

    AggregateFunctions AggregateFunction { get; set; } 

    string SqlAlias { get; } 

} 

はランダムな文字列に属性SqlAliasに設定されています。しかし、ここではランダムな文字列を生成しているので、getメソッドを呼び出す度に変更する必要はありません。私はそれを取得し、設定し、要求全体を通して同じ値を再利用できるようにしたい。

これはどのように私はSqlAlias値は、1回だけ上記の私の条件に基づいており、要求全体を通じて同じ値を保つ設定するにはどうすればよい

public class ReportColumnMsSqlServer : IReportColumn 
{ 

    public string Title { get; set; } 

    public string ColumnKey { get; set; } 

    public AggregateFunctions AggregateFunction { get; set; } 

    public string SqlAlias { 

     get { 

      return this.GetColumnName(); 

     } 
    } 


    private string GetColumnName() 
    { 
     string columName = this.ColumnKey; 

     if (columName == null || this.AggregateFunction != AggregateFunctions.None) 
     { 
      columName = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 
     } 

     return string.Format("{0}", new Regex("[^a-zA-Z0-9]").Replace(columName, string.Empty)); 
    } 

} 

私のインターフェイスを実装していますか?

+0

ローカルフィールドを作成します。 nullの場合、idを生成するelse saved idを返す – Nkosi

+0

あなたの質問はプロパティ値の設定*に関するものなので、なぜ* get *について質問していますか?プライベートセッターを使用してコンストラクターの値を設定する –

+0

別のプロパティを変更するプロパティゲッターは、私にとっては間違っているようです。 – juharr

答えて

5

あなたは情報を保存するために新しいプライベートフィールドを導入し、値のみにそれがアクセスしています最初の時間を計算することができます。

private string _sqlAlias = null; 
public string SqlAlias { 

    get { 
     if (_sqlAlias == null) 
      _sqlAlias = this.GetColumnName(); 
     return _sqlAlias; 

    } 
} 

戻り値はColumnKeyの両方に基づいているため、ご使用のケースに応じて、 AggregateFunctionを使用している場合は、両方のプロパティのセッターを実装して_sqlAliasnullに戻すことができますので、SqlAliasを呼び出すと、他の更新されたプロパティに基づいて新しい値が再計算されます。

+0

は、私は(SqlAlias == nullの) { リターンthis.GetColumnName()場合 { を取得 {そう 'パブリック文字列SqlAlias のように同じ変数を再利用することはできません。 } 返すthis.SqlAlias; } } '?変数を設定するには2通りの方法があり、ランダムになると1つのみです。 – Jaylen

+1

@Jaylenいいえ、それ自体のゲッター内で 'SqlAlias'を読むとスタックオーバーフローの例外が発生します。 –

+1

@Jaylenこれを行うと、循環参照が作成されます。 '{get {if(SqlAlias'(呼び出しがやり直す)).... –

1

単純な「レイジーローディング」パターンを使用します。

private string _sqlAlias; 
public string SqlAlias { 
    get { 
     if (_sqlAlias == null) { 
      _sqlAlias = GetColumnName(); 
     } 

     return _sqlAlias; 
    } 
} 
関連する問題