C#:你可以这样做,以便方法参数通过引用传递一个对象但是只读吗?
例如:
void MyMethod(int x, int y, read-only MyObject obj)
其中obj
是对象引用,但在方法期间无法修改此对象。
这可以用C#实现吗?
答案 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