2012-12-04 134 views
1

以下屬性只是乞求的值被兩個getter和setter修改變量的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; 
    } 
} 

在這種情況下,這並不是什麼大事,可以使用內聯方法。但作爲一個原則,有沒有辦法?

回答

-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; 
    } 
} 
+1

問題是必須做兩次計算。 – MrFox

+0

@MFFOX:我明白你的意思。在這種情況下,您需要提供某種兌現策略。但事情是*指數*是一個**計算**值,所以直到你還沒有計算它,你不能說它是否與之前一樣。因此,緩存或「價值改變」狀態的識別,可以在該屬性之外的某個地方完成。 – Tigran

+0

@downvoter:原因? – Tigran

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變量)。這樣做的問題在於緩存實際上是重量級解決方案,您必須處理是否緩存值,如果不是緩存值並在某些情況下也將其從緩存中移除(特別是爲了避免內存泄漏),請進行檢查。

+0

OP提出的問題和這個答案之間的區別是什麼,來自* actual *問題的預期? – Tigran

+0

區別在於OP想要在屬性的「範圍」中定義某些內容,我解釋這是不可能的。 –

+0

他*似乎*在抱怨他必須兩次計算該值的事實... – Tigran

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