C# - 通过引用传递值类型的良好而灵活的方法?

Kap*_*aG3 2 c# variables reference

我的问题,缩小到一个简单的解释,如下:我有一个类需要使用一个数字(不改变它),这可能会改变.这个数字不一定来自另一个类,它可以是任何类.但是我想只给它一次"给"它一次,而不是经常不得不调用更新方法或不得不创建一个包装器(因为我再说过,这应该适用于任何类型的数字并且必须包装一切都是不切实际的).

这是一些代码,希望它有所帮助:

public class SimpleExample
{
    int value;
    public SimpleExample(int variableOfWhichINeedAReference)
    {
        //Of course this won't work, but I'll keep it simple.
        value = variableOfWhichINeedAReference; 
    }
    public void DisplayValue()
    {
        print(value);
    }
}
public class RandomClass
{
    int myValue = 10;
    SimpleExample s = new SimpleExample(myValue);

    public void WorkWithValue()
    {
        myValue++;
    }

    public void Display()
    {
        print(foo);
        print(bar);
        s.DisplayValue();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,问题似乎非常明显:如果我实例化一个SimpleExample并给它一个变量作为参数,它将获得它的值而不是它的引用.有一种简单的方法可以避免我创建一个包装器吗?谢谢.

Tim*_*lds 7

做一个非常简单的课程:

class Ref<T>
{
    public T Value;
    public Ref<T>()
    {
    }
    public Ref<T>(T value)
    {
        this.Value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

class A
{
    Ref<int> x;
    public A(Ref<int> x)
    {
        this.x = x;
    }
    public void Increment()
    {
        x.Value++;
    }
}

...

Ref<int> x = new Ref<int>(7);
A a = new A(x);
a.Increment();
Debug.Assert(x.Value == 8);
Run Code Online (Sandbox Code Playgroud)

请注意,Ref<T>此处的类是对的引用 - 而不是对变量的引用.如果您想要引用变量,请使用Eric Lippert的解决方案(如Filip所指出的).

  • @Servy我打赌OP更关心解决他的问题而不是处理SO法律主义...... (4认同)
  • 还要注意,没有真正需要`where T:struct`.这种类型对类和结构都非常有效,对于类和结构它也很有用,所以为什么要限制它. (2认同)
  • @Servy我明白,但是,我认为OP可能会发现这是他遇到的问题的最佳解决方案.因此,虽然它不是*完全*所要求的,但我认为它非常有用.它基本上提供强类型拳击(而不是`对象`,它没有). (2认同)