2017-10-17 92 views
0

請參閱下面的代碼:爲什麼其他類的私有變量可以在.Equals中覆蓋?

public class TestClass 
{ 
    private int TestVariable; 

    public override bool Equals(object obj) 
    { 
     TestClass testClass = obj as TestClass; 
     return TestVariable == testClass.TestVariable; 
    } 
} 

這怎麼行編譯:

return TestVariable == testClass.TestVariable; 

TestVariable是私有的,被外部訪問。如果我行更改爲這則不會編譯因爲我希望:

return TestVariable == obj.TestVariable; 
+0

但是 - 當你調用obj.TestVariable時,它會失敗,因爲它的私有性和有效性你是外在的 - 你不是使用「this」,而是你所在類的新版本無法看到..我有一個大腦(顯然),你也可以問我腦中有什麼,我可以告訴你,但你不能自己閱讀,而你可以閱讀你自己的,但我們都來自模板人(我希望) – BugFinder

+1

私人意味着(來自docs):「類型或成員只能由同一類或結構中的代碼訪問」。你的代碼在同一個類中,所以它可以訪問它。 – Evk

+0

我不知道C#,但它看起來不像是從另一個類訪問的。看起來像在擁有它的類中訪問的私有變量,這是完全正確的。 – Carcigenicate

回答

4

這裏有兩個不同的東西:

obj.TestVariable 

這不起作用,因爲obj類型是object和類型object的情況下,沒有一個TestVariable成員。所以訪問它不會工作。

testClass.TestVariable 

然而,這會工作,因爲testClass是同一類型,你目前的類型。這樣一來,你是該類型的私人範圍,這樣你就可以訪問私有變量,即使您所指的對象與this不同。

又見language documentation on the private modifier(重點煤礦):

私有成員只能訪問在類或聲明它們的結構體[...]

嵌套類型同一機構也可以訪問這些私人成員。

因此,既然您仍然在類的主體,您可以訪問該成員。正如下面的段落所解釋的,儘管嵌套類型是一種完全不同的類型,但與父類沒有必需的類型關係,它甚至可以在嵌套的類型中起作用。但它可以工作,因爲嵌套類型定義是,它的父類型的主體是

+0

謝謝,所以如果我在TestClass內部創建十個TestClass實例,那麼我可以在TestClass內創建十一個TestClass實例的私有變量來創建它們? +1。 – w0051977

+0

是的,如果您在另一個TestClass實例的實例方法內創建了TestClass對象,則仍然可以訪問該新實例的私有成員。 – poke

4

無障礙環境是不是實例,但類型

爲什麼:因爲你是在類TestClass,並且可以訪問所有的私有成員在那個班,即使你不是指this,但是你到達那裏的一個實例。這是設計。

C#的郎規格提到它3.5.2下: ....

否則,如果M是私有的,訪問被如果在M被聲明的類型內發生它 允許。 ...

所以如果一個成員是私人的,你可以在同一個類型中訪問它,而不僅僅是同一個實例。

注意:如果它沒有以這種方式實現,那麼將不可能提供一個拷貝構造函數來接受另一個實例來初始化它,因爲某些屬性可能無法訪問。

+0

但我指的是TestClass的另一個實例? – w0051977

+0

@ w0051977:accessibbility不是關於實例,而是類型 –

1

我想你誤解了private的意思。 private並不意味着您只能使用this.訪問該成員。這意味着您只能在該課程中訪問該成員。

Equals方法在TestClass之內,因此可以訪問TestVariable。你正在訪問哪個對象的TestVariable並不重要。

爲什麼要這樣設計呢?

private整點不是限制對一個實例的訪問,而是限制對實現的訪問。當你聲明private時,你不希望其他代碼(可能由不知道實現細節的其他人編寫)來混淆實現細節成員,因爲它可能會弄髒一些東西。

相關問題