属性方法与C#中的字段

时间:2015-12-28 17:03:11

标签: c# properties

使用C# - 如果我有一个对象的属性,比如说,返回数组中元素的数量,该数组是该对象的一个​​字段,如下面的NumCols

public string[][] Table { get; }  // Jagged 2D Table
public int NumRows { get { return Table.Length; } }  // number of rows in the table
public int[] NumCols {
    // number of columns in each row
    get
    {
        var NumCols = new int[NumRows];
        for (int i=0; i<NumRows; i++) { NumCols[i] = Table[i].Length; }
        return NumCols;
    }
}  

如果我要引用这个NumCols属性,那么每次都必须重新计算这个统计数据是否存在性能问题?如果Table没有改变,运行时是否足够聪明,不能每次重新计算?我应该手动将其设为一个字段,然后根据需要更新它吗?

4 个答案:

答案 0 :(得分:2)

只要访问属性值,就会执行属性getter。这样,它们与只返回值的方法Get<PropertyName>相同。

如果你想避免这种情况,你应该考虑缓存这个值,例如:使用像这样的懒惰方法:

private int[] numCols = null;
public int[] NumCols
{
    get
    {
        if (numCols == null)
        {
            numCols = ExpensiveCalculation();
        }
        return numCols;
    }
}

通常,您应该避免在属性getter中放置昂贵的东西,因为对属性的期望是您可以非常快速地以非常小的开销访问该值。如果您发现自己有一个更复杂的过程来获取值,并且上面的缓存不合适,那么您应该考虑编写一个真正的get方法。这样,该方法的用户将隐式地知道与简单属性相比存在开销:

public int[] GetNumCols()
{
     return ExpensiveCalculation();
}

答案 1 :(得分:0)

不,没有自动重复使用该方法的计算结果。这可能有很多原因,其中最重要的原因是多个调用者可以得到相同的数组(通过引用)。

如果您想要这种行为,那么创建起来相当容易。只需将结果存储在字段中,并在存储的数组发生更改时立即清除该字段。

答案 2 :(得分:0)

与所有优化一样,它取决于。你可以通过缓存结果来加速它(不会自动发生),但是这样做的时间是否值得 - 当你对程序中的其他东西进行测量时你可以加速up - 如果不做一些测量就不可能说出来。

理想情况下,您应该优化实际会产生可衡量差异的事物。即使您发现程序运行缓慢,您也希望在假设它导致问题之前运行探查器。实际上,如果您的设计要求NumCols被访问并且很多,那么这可能表明设计应该改变而不是这个特定的实现。

答案 3 :(得分:0)

在C#中,从不使用公共字段,仅使用属性被认为是一种好习惯。如果开销很大,你可以把它放到一个方法而不是nnoremap ; : nnoremap : ; ,这将告诉用户这是一个可能有开销的方法,而不仅仅是一个普通的字段。

相关问题