我可以在像C++这样的C#函数中使用引用吗?

Gio*_*Gio 6 c# reference

在C++中我可以这样做:

 int flag=0,int1=0,int2=1;
 int &iRef = (flag==0?int1:int2);
 iRef +=1;
Run Code Online (Sandbox Code Playgroud)

具有int1增加的效果.

我必须修改一些旧的c#代码,如果我可以做类似的事情,那将会非常有用,但我在考虑......也许不是.任何人?

Eri*_*ert 7

更新:下面讨论的功能最终在C#7中添加.


C#不支持您想要的功能 - 创建托管本地变量别名.你可以使用形式参数来做- 你可以创建一个形式参数,它是任何变量的别名 - 但你不能创建一个本地,它是任何变量的别名.

但是,阻止我们这样做没有技术上的困难; CLR类型系统支持"ref local variables".(它还支持ref返回类型,但不支持ref字段.)

几年前我实际上写了一个C#的原型版本,它支持ref本地和ref返回类型,并且它工作得非常好,所以我们有经验证据证明我们可以成功地做到这一点.但是,如果有的话,很快就会很快将此功能添加到C#中.有关详细信息,请参见http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/.

我注意到,如果我是你,我会用任何语言避免这种情况.编写两个变量共享相同存储的程序会使代码难以阅读,难以理解,难以修改且难以维护.

另请参阅相关问题:为什么C#不支持引用的返回?


Mar*_*ers 5

可以做到 - 或者至少与你想要的东西非常相似 - 但最好找到另一种方法.例如,您可以将整数包装在简单的引用类型中.

如果您仍然想这样做,看到Ref<T>张贴埃里克利珀类在这里:

sealed class Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

public class Program
{
    public static void Main()
    {
         int flag=0,int1=0,int2=1;

         Ref<int> iRef = (flag == 0 ?
            new Ref<int>(() => int1, z => { int1 = z; }) :
            new Ref<int>(() => int2, z => { int2 = z; }));

         iRef.Value += 1;

        Console.WriteLine(int1);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)