2012-05-01 28 views

回答

6

我不確定你認爲哪一部分是一個bug,但是如果你不能在編譯時這樣做,一直可以通過反射來訪問一個類的內部。這是設計。 CLR的許多方面都依賴反射來訪問字段,例如序列化。已編譯的IL需要能夠訪問所有對象的所有字段,否則您不能在內設置的專用字段。

C#中的訪問修飾符不是安全機制。如果你依靠的是一個私人領域,以防止任何人從外部設置它,那麼你做錯了什麼。它們的存在是爲了清楚地描述你的班級的哪些部分是公共合同(因此在理論上是穩定的),這些部分是實現細節的部分(因此可以不經通知而改變)。改變一個對象的內部狀態,儘管所有跡象表明你應該放棄它,你將你的應用程序的穩定性掌握在你自己的手中,並且你得到了應有的東西。

+1

我不太確定它不是一個安全機制。部分受信任的代碼不能訪問其他類型的私有成員是有原因的。 – svick

+0

很好的回答.... – MarkP

0

僅允許完全信任代碼進行反射,因此代碼已能夠執行任何操作(包括直接在進程的內存中戳)。因此,即使對於私有屬性也支持更改值的方式不會使代碼更安全。它使反射API一致,並允許有用的場景,尤其是測試。