代码之家  ›  专栏  ›  技术社区  ›  CJ7

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

  •  17
  • CJ7  · 技术社区  · 14 年前

    如:

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

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

    这能用C#实现吗?

    5 回复  |  直到 14 年前
        1
  •  18
  •   Matthew Flaschen    14 年前

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

        2
  •  6
  •   Community Vlad V    7 年前

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

    扪心自问:如果C#有一个 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

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

        3
  •  3
  •   Oded    14 年前

    这在C#中是不可能的。

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

        4
  •  0
  •   Lasse V. Karlsen    14 年前

    没有任何机制可以帮你做到这一点。

    要么传递一个一次性副本,要么在类本身中构建不变性(即使是临时的)。

        5
  •  0
  •   Community Vlad V    7 年前

    你为什么不做一个复制品,然后在你工作的时候用它做任何你想做的事呢 obj

    Deep cloning objects