2012-02-14 118 views
3

爲什麼它不產生一個錯誤?如果我嘗試更改主progrm文件中此結構的專用字段,它會生成錯誤,但不會在結構實現中。結構 - 進入私人領域

public struct MyStruct 
{ 
    private int privateField; 

    public int MyField 
    { 
     get { return privateField; } 
     set { if (value >= 0) privateField = value; else value = 0 } 
    } 

    public void SomeMethod (MyStyruct s) 
    { 
     s.privateField = 10; // no error here. 
    } 
} 

回答

6

私有成員被限制在結構不是對象。在這種情況下,即使sthis不同,它仍然有效。

+0

很好的答案(7分鐘後會接受最好的答案)。 Questoion 2:我應該使用privateField更快地讀取數據,還是使用MyField C#會優化閱讀? – zgnilec 2012-02-14 20:13:41

+1

不要擔心這種微觀優化。使用該屬性,除非你創建一個拷貝構造函數。特別是因爲你的二傳手有特殊的邏輯。 – Osiris 2012-02-14 20:15:15

+0

我不認爲你會通過使用privateField而不是MyField來獲得更多的性能。就我而言,這是一個風格問題,除非有特定的理由相對於另一個(即吸氣劑或二道過濾器中的特殊邏輯)。 – 2012-02-14 20:20:44

3

private意味着它只能在struct的範圍內使用。這是一個訪問修飾符說,這個變量的訪問級別,功能privatestruct本身只。

你應該用你的財產,以改變它的結構之外,在main例如。

你的方法SomeMethod是結構的一部分,所以你被允許改變它的私有成員。

雖然,你所訪問的方式,是有點不尋常。

4

這種行爲是不特定於結構 - 它持有類千真萬確的。

private指字段僅內型訪問。這並不意味着「僅在類型相同的實例」內。

鑑於您試圖訪問來自同一類型中的私有字段,即使它是同一類型的不同實例,private應允許訪問。

1

由於SomeMethod是關於結構體本身的方法。你也不會在課堂上發生錯誤 - 本地成員可以修改私人領域。

1

private修飾符意味着一個部件可以僅從其類型中進行訪問。它不限制從其實例的訪問。

3

首先,這有什麼用它做是否是一個結構或類 - 或者甚至它是否是一個字段或某些其他成員。在C#

無障礙決定基於其中的代碼,而不是它是否是「這個對象」或其他物體。的C#說明書的

第3.5節的更多細節。例如,從3.5.2:

訪問域的成員的由程序文本的(可能是不連續)部分,其中訪問該成員被允許的。

[...]

如果M的聲明可訪問性是privateM訪問域是T程序文本。

+0

謝謝,我正在閱讀很多文檔,但我的英文不在高級水平,這就是爲什麼我在這裏問。 – zgnilec 2012-02-14 20:15:13

1

這是允許的,因爲傳入的類型也是MyStruct。該結構可以訪問相同類型結構中的私有成員。

正如其他人指出的那樣,這種行爲對於類類型也是一樣的。