修改getter和setter的变量

MrF*_*Fox 1 c#

以下属性只需要为getter和setter计算一次的值

所以代替:

public bool this[int x, int y]
{
    get
    {
        return this[x * this.width + y];
    }
    set
    {
        this[x * this.width + y] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    get
    {
        return this[index];
    }
    set
    {
        this[index] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hon*_*tan 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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