在C++中我可以这样做:
int flag=0,int1=0,int2=1;
int &iRef = (flag==0?int1:int2);
iRef +=1;
Run Code Online (Sandbox Code Playgroud)
具有int1增加的效果.
我必须修改一些旧的c#代码,如果我可以做类似的事情,那将会非常有用,但我在考虑......也许不是.任何人?
更新:下面讨论的功能最终在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#不支持引用的返回?
你可以做到 - 或者至少与你想要的东西非常相似 - 但最好找到另一种方法.例如,您可以将整数包装在简单的引用类型中.
如果您仍然想这样做,看到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)