c#如何使用get; 如果未设置该值,则返回一个值?

Jay*_*len 4 c#

我正在尝试get; set;在初始化属性时定义值.

我有以下界面

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

    string ColumnKey { get; }

    AggregateFunctions AggregateFunction { get; set; }

    string SqlAlias { get;  }

}
Run Code Online (Sandbox Code Playgroud)

我需要做的是将属性SqlAlias设置为随机字符串if AggregateFunction == AggregateFunctions.None || ColumnKey == null.但是,因为我在这里生成一个随机字符串,所以我不希望它改变我调用get方法的时间.我希望能够获得它,设置它并在整个请求中重用相同的值.

这就是我实现界面的方式

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));
    }

}
Run Code Online (Sandbox Code Playgroud)

如何根据上述条件仅设置一次SqlAlias值,并在整个请求中保持相同的值?

Jam*_*rpe 5

您可以引入一个新的私有字段来存储信息,并仅在第一次访问时计算该值:

private string _sqlAlias = null;
public string SqlAlias {

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

    } 
}
Run Code Online (Sandbox Code Playgroud)

根据您的用例,由于返回值基于ColumnKeyAggregateFunction,因此您可以实现这两个属性的setter设置_sqlAliasnull,因此进一步调用SqlAlias将根据其他更新的属性重新计算新值.