修改getter和setter的变量

时间:2012-12-04 16:25:09

标签: c#

以下属性仅针对getter和setter

计算一次的值

所以而不是:

public bool this[int x, int y]
{
    get
    {
        return this[x * this.width + y];
    }
    set
    {
        this[x * this.width + y] = value;
    }
}

如果我们能做到这一点会更好:

public bool this[int x, int y]
{
    int index = x * this.width + y;

    get
    {
        return this[index];
    }
    set
    {
        this[index] = value;
    }
}

在这种情况下,它不是一个大问题,可以使用内联方法。但作为一项原则,有办法吗?

3 个答案:

答案 0 :(得分:5)

getset属性访问器实际上编译为两个独立的方法。如果您需要通用代码,则必须采用与任何两种不同方法相同的方式 - 通过引入第三种方法,可能是静态方法。

private static CalculateIndex(int x, int width, int y)
{
    return x * width + y;
}

public bool this[int x, int y]
{
    get
    {
        return this[CalculateIndex(x, this.width, y)];
    }
    set
    }
        this[CalculateIndex(x, this.width, y)] = value;
    }
}

在这种情况下你不能简单地设置一个变量,这样它对于索引器的访问器来说是通用的,但如果计算真的很苛刻,你可以使用某种缓存,在这种情况下你可以访问你的缓存访问器(就像示例中的index变量一样)。这样做的问题在于缓存是非常重要的解决方案,您必须处理检查值是否被缓存,如果不缓存则计算它,并且在某些情况下还将其从缓存中移除(特别是为了避免内存泄漏)。

答案 1 :(得分:1)

如果您不想两次进行计算,请添加辅助方法。

int GetOffset(int x, int y)
{
    return x + this.width * y;
}

public bool this[int x, int y]
{
    get
    {
        return this[GetOffset(x, y)];
    }
    set
    {
        this[GetOffset(x, y)] = value;
    }
}

答案 2 :(得分:-1)

可能是这样的:

public bool this[int x, int y]
{    
    get
    {
        var index= x * this.width + y; //CALCULATE INDEX ON GET
        return this[index];
    }
    set
    {
        var index= x * this.width + y;//CALCULATE INDEX ON SET
        this[index] = value;
    }
}