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,不允许修改.您还可以创建不可变副本或包装器.
如果您传递的对象的类别是由您编写的,那么您很幸运.
问问自己:如果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?但忽略它们.最终,实现者可以使用反射来绕过类型系统的任何方面 - 请参阅这个有趣的例子.
阻止反射攻击的唯一选择是琐碎的方法:制作完全断开连接的克隆.