2010-08-08 70 views

回答

8

如果你要返回的對象是不可變的,那就可以正常工作。

如果不是,則可以返回只顯示只讀屬性的包裝對象。

+2

+1唯一的問題是如果他們已經有引用到不可變類型的內部結構的地方。 – 2010-08-08 11:14:28

1

我看到的唯一方法是爲此類型創建兩個接口。一個接口只是只讀。然後該方法只返回這個只讀接口的一個實例。

+2

而調用者可以強制轉換爲非只讀界面。 – Oded 2010-08-08 11:14:05

+1

但沒有人會這樣的事情。 :-)包裝更安全。所以我也喜歡你的版本。 – schoetbi 2010-08-08 11:15:14

+0

這麼多關於假設的短語,如此小的字符空間...... – 2010-08-08 11:40:17

1

我不認爲有任何內置的方式。 C#似乎沒有像C++那樣支持const正確性。你可以讓內部成員只讀,這將是一個開始。但除此之外還有更多。

您可以使您的類的所有成員函數不帶有mutator函數,並且使所有數據成員屬性具有私有setter。在爲屬性實現getter時,複製返回的所有類並返回一個新實例,而不是將引用返回給私有成員。

class SomeClass 
{ 
    public void SomeFunctionThatDoesNotModifyState() 
    { 
    } 

    public int SomeProperty 
    { 
     get 
     { 
      return someMember; // This is by-value, so no worries 
     } 
    } 

    public SomeOtherClass SomeOtherProperty 
    { 
     get 
     { 
      return new SomeOtherClass(someOtherMember); 
     } 
    } 
} 

類SomeOtherClass {// .... }

你必須非常小心,SomeOtherClass的實施的確,當你調用拷貝構造深層複製。

即使在所有這些之後,仍然無法100%保證有人不會修改您的對象,因爲用戶可以通過反射入侵任何對象。

相關問題