我正在寫一個函數,返回一個封裝的數據結構的對象的引用,我希望沒有人能夠使用該引用來更改對象,是否有可能在c#中做到這一點?是否有可能使一個函數返回的函數在C#中不可變?
6
A
回答
8
如果你要返回的對象是不可變的,那就可以正常工作。
如果不是,則可以返回只顯示只讀屬性的包裝對象。
1
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%保證有人不會修改您的對象,因爲用戶可以通過反射入侵任何對象。
相關問題
- 1. 是否有可能從C中的另一個函數返回一個函數?
- 2. C++ 11:是否有可能從函數返回一個std :: initializer_list?
- 3. ANSI C - 函數是否可以返回另一個函數?
- 4. 是否有可能有一個函數在另一個函數
- 5. 是否有可能使一個函數不能返回,直到滿足條件?
- 6. 是否有可能改變函數的返回類型
- 7. 是否有可能在C函數中構建函數?
- 8. 是否有可能在反應渲染函數中返回空?
- 9. 是否有可能在jQuery中返回事件函數?
- 10. 是否有可能在JavaScript函數中返回多次
- 11. 在PHP中,是否有可能返回一個類的構造函數?
- 12. 是否有可能從函數返回兩個向量?
- 13. 函數是否可以返回一個promise,或者不是?
- 14. 返回可變長度的C++函數
- 15. C++ Lambdas:函數返回一個函數,返回一個函數...?
- 16. 是否有可能JNI函數返回整數或布爾值?
- 17. 是否有可能從一個函數返回兩個列表在Python
- 18. 是否有可能從函數返回中斷/停止循環?
- 19. C#中的可變參數,當函數有另一個功能
- 20. 重構一個可能返回函數的函數
- 21. 函數是否可能使用其參數返回指針?
- 22. 是否有可能從一個函數返回一個jquery小部件?
- 23. 是否有可能在Codeigniter中返回多個變量/數組?
- 24. 是否有可能修改一個函數的返回值,而無需在python中定義新的函數?
- 25. 函數中是否可以有函數?
- 26. 是否有可能在C++中有一個函數(-name)作爲模板參數?
- 27. 是否有可能使用ASP.NET MVC4中的一個控制器函數在視圖中返回兩個數組?
- 28. 是否有可能在另一個函數中運行'2-deep'的函數?
- 29. 是否可以窩在Objective-C的另一個函數中的一個函數
- 30. 是否可以從Sybase函數返回一個數字列表?
+1唯一的問題是如果他們已經有引用到不可變類型的內部結構的地方。 – 2010-08-08 11:14:28