我正在编写一个函数,它返回对某个封装数据结构的对象的引用,我希望没有人能够使用该引用更改对象,是否可以在c#中执行此操作?
答案 0 :(得分:8)
如果您要返回的对象是不可变的,那么它将正常工作。
如果没有,则可以返回仅显示只读属性的包装器对象。
答案 1 :(得分:1)
我看到的唯一方法是为此类型创建两个接口。一个界面只是只读。然后该方法只返回此只读接口的实例。
答案 2 :(得分:1)
我认为没有任何内置方式。 C#似乎对C ++的const-correctness没有相同的支持。您可以将内部成员设为只读,这将是一个开始。但是还有更多的东西。
您将使您的类非变异函数的所有成员函数,并使所有数据成员属性与私有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%保证有人不会修改你的对象,因为用户可以通过反射攻击任何对象。