方法参数可以通过引用传递对象但是只读吗?

时间:2010-08-08 08:58:28

标签: c# readonly pass-by-reference

C#:你可以这样做,以便方法参数通过引用传递一个对象但是只读吗?

例如:

void MyMethod(int x, int y, read-only MyObject obj)

其中obj是对象引用,但在方法期间无法修改此对象。

这可以用C#实现吗?

5 个答案:

答案 0 :(得分:17)

没有。 C#与C ++ const没有直接的类比(它自己的const是不同的东西)。一个常见的C#模式是传入一个不允许修改的接口,例如IEnumerable。您还可以创建不可变副本或包装器。

答案 1 :(得分:6)

如果您传递的对象的类别是由您编写的,那么您很幸运。

问问自己:如果C#有一个const功能,我希望通过const对我的班级的引用来禁止对该对象进行什么操作?

然后定义interface,省略禁止的操作。

例如:

class MyClass 
{
    public string GetSomething() { ... }

    public void Clobber() { ... }

    public int Thing { get { ... } set { ... } }
}

相应的“const”界面可能是:

interface IConstMyClass 
{
    public string GetSomething() { ... }

    public int Thing { get { ... } }
}

现在修改课程:

class MyClass : IConstMyClass
{

现在,您可以使用IConstMyClass来表示const MyClass

 void MyMethod(int x, int y, IConstMyClass obj)

注意:会有人告诉你这还不够。如果MyMethod转回MyClass怎么办?但忽略它们。最终,实现者可以使用反射来绕过类型系统的任何方面 - see this amusing example

阻止反射攻击的唯一选择是琐碎的方法:制作一个完全断开连接的克隆。

答案 2 :(得分:3)

这在C#中是不可能的。

您可以通过传入不可变对象来防止这种情况。

答案 3 :(得分:0)

没有任何机制可以帮助您。

要么通过一次性复制,要么将不可变性(即使是临时性的)构建到类中。

答案 4 :(得分:0)

为什么不制作该对象的副本,并在obj未被修改的情况下对该副本执行任何操作。

请在此处查看如何克隆您的对象:Deep cloning objects