以下属性仅针对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;
}
}
在这种情况下,它不是一个大问题,可以使用内联方法。但作为一项原则,有办法吗?
答案 0 :(得分:5)
get
和set
属性访问器实际上编译为两个独立的方法。如果您需要通用代码,则必须采用与任何两种不同方法相同的方式 - 通过引入第三种方法,可能是静态方法。
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;
}
}