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

CJ7*_*CJ7 17 c# readonly pass-by-reference

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

例如:

void MyMethod(int x, int y, read-only MyObject obj)
Run Code Online (Sandbox Code Playgroud)

where obj是对象引用,但在方法期间无法修改此对象.

这可以用C#实现吗?

Mat*_*hen 17

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


Dan*_*ker 6

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

问问自己:如果C#有一个const功能,那么我希望通过const对我的类的引用来禁止该对象的哪些操作?

然后定义一个interface省略禁止的操作.

例如:

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

    public void Clobber() { ... }

    public int Thing { get { ... } set { ... } }
}
Run Code Online (Sandbox Code Playgroud)

相应的"const"接口可能是:

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

    public int Thing { get { ... } }
}
Run Code Online (Sandbox Code Playgroud)

现在修改课程:

class MyClass : IConstMyClass
{
Run Code Online (Sandbox Code Playgroud)

现在你可以IConstMyClass用来表示const MyClass.

 void MyMethod(int x, int y, IConstMyClass obj)
Run Code Online (Sandbox Code Playgroud)

注意:会有人告诉你这还不够.如果MyMethod投射回MyClass?但忽略它们.最终,实现者可以使用反射来绕过类型系统的任何方面 - 请参阅这个有趣的例子.

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