相依性屬性的安全性
相依性屬性通常應該視為公用屬性。 Windows Presentation Foundation (WPF) 屬性系統在本質上會防止進行相依性屬性值的安全性保證。
包裝函式和相依性屬性的存取和安全性
通常,相依性屬性會與「包裝函式」通用語言執行平台 (CLR) 屬性一起實作,該屬性會簡化對執行個體屬性的取得或設定。 但是包裝函式實際上只是實作基礎 GetValue 和 SetValue 靜態呼叫的便利捷徑,這些呼叫會在與相依性屬性互動時使用。 從另一個方面來思考,這些屬性會公開為剛好受到相依性屬性 (而不是私用欄位) 支援的通用語言執行平台 (CLR) 屬性。 套用到包裝函式的安全性機制,與屬性系統行為和基礎相依性屬性的存取並不相同。 在包裝函式上放置安全性需求只會阻礙便利捷徑,但不會防止呼叫 GetValue 或 SetValue。 同樣地,對包裝函式設置保護或私用存取層級並不會提供任何有效的安全性防護。
如果您在撰寫自己的相依性屬性,應該要將包裝函式和 DependencyProperty 識別項欄位宣告為公用成員,這樣呼叫端才不會誤會該屬性的真實存取層級 (因為其存放區會實作為相依性屬性)。
對於自訂相依性屬性,您可以將屬性註冊為唯讀相依性屬性,這樣即能有效防止未持有屬性的 DependencyPropertyKey 參考的任何人設定該屬性。 如需詳細資訊,請參閱唯讀相依性屬性。
注意
宣告 DependencyProperty 識別項欄位為私用並不會受到禁止,而且也認定可用於協助降低直接公開自訂類別的命名空間,但不應該以通用語言執行平台 (CLR) 語言定義會定義該存取層級的相同概念來將這類屬性視為「私用」,下一節將說明其原因。
相依性屬性的屬性系統公開
將 DependencyProperty 宣告為公用以外的任何存取層級,通常並不實用,而且可能會造成誤導。 該存取層級設定只能防止使用者取得宣告類別執行個體的參考。 但屬性系統有幾個部分,會將傳回 DependencyProperty 作為特定屬性是否存在於類別執行個體或衍生類別執行個體中的識別方式,而且即使原始靜態識別項宣告為非公用,仍然可以在 SetValue 呼叫中使用這個識別項。 此外,OnPropertyChanged 虛擬方法會接收任何變更值之現有相依性屬性的資訊。 加之,GetLocalValueEnumerator 方法會傳回執行個體上任何具有本機設定值之屬性的識別碼。
驗證和安全性
藉由套用 ValidateValueCallback 的要求,並預期要求失敗會造成驗證失敗,即可防止屬性是在不足夠的安全性機制下設定的。 如果惡意呼叫端是在應用程式定義域內操作的話,這些呼叫端也可以隱藏透過 ValidateValueCallback 強制的設定值失效。