簡體   English   中英

為什么反射可以在C#中訪問類的受保護/私有成員?

[英]Why can reflection access protected/private member of class in C#?

為什么反射可以在C#中訪問類的受保護/私有成員?

這對於全班來說是不安全的,為什么反思會給予這種力量? 這是反模式嗎?

成員輔助功能不是安全功能。 它是為了保護程序員免受他或她自己的傷害。 它有助於實現封裝,但它絕不是安全功能。

反思是冗長乏味的,因此人們通常不會自願使用它來訪問非公共成員。 它也很慢。 反射通常僅用於特殊情況。 然而,沒有什么可以完全保護人類的愚蠢,如果有人想濫用反思,他可以很容易地做到,但即使沒有反射API,他們也可以實現同樣的事情(如果他們完全信任,那就是)如果他們足夠堅定了。

這對於遠程處理,序列化,物化等場景是必要的。您不應盲目使用它,但請注意,這些設施始終可用於任何系統(實際上,通過直接尋址內存)。 反思簡單地將其形式化,並將控制和檢查放在路上 - 您沒有看到它,因為您可能正在以“完全信任”運行,因此您已經比受保護的系統更強大。

如果您在部分信任中嘗試此操作,您將看到對內部狀態的更多控制。

這是反模式嗎?

僅當您的代碼使用不當時。 例如,請考慮以下內容(對WCF數據協定有效):

[DataMember]
private int foo;

public int Foo { get {return foo;} set {foo = value;} }

WCF支持這個是不正確的嗎? 我懷疑沒有...有多種情況下你想要序列化不屬於公共API的東西,而沒有單獨的DTO。 同樣,如果您選擇,LINQ-to-SQL將實現為私有成員。

反射對於調試器來說是絕對必要的。 想象一下,您正在單步執行程序,無法查看私有變量的值。 這可能就是為什么反射在.NET和Java中工作的原因,使調試變得非常簡單。

如果我們不需要調試器,那么我可以想象反射將更多地受到OOP精神的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM