C#引用赋值运算符?

例如:

int x = 1; int y = x; y = 3; Debug.WriteLine(x.ToString()); 

是否为任何引用运算符而不是“=”在行:3,使x等于3,如果我指定y = 3。

‘int’是一个值类型,因此正如您所发现的那样复制赋值时的值。

您可以使用传统的C / C ++意义上的指针,使用“不安全”块,但指针只能在该块中使用,这限制了它的使用。 如果您想要访问“不安全”块之外的值,则需要转换为使用引用。

这样的东西……

 var x = new Tuple(1); var y = x; y.Item1 = 3; 

我曾经写过一个具有该function的C#版本的原型; 你可以说:

 int x = 123; ref int y = ref x; 

现在x和y将是同一个变量的别名。

我们决定不在该语言中添加该function; 如果你有一个非常棒的使用案例,我很乐意听到它。

你不是第一个询问这个function的人; 看, 我可以在C#函数中使用像C ++这样的引用吗? 更多细节。

更新:该function可能在C#7中。

这不是你要求的,但我认为它可能会有所帮助。 如果你想在函数内部使用指针别名,你可以像这样使用ref关键字:

 public static void RefExample(ref int y) { y = 3; } main() { int x = 5; RefExample(ref x); Console.WriteLine(x); // prints 3 } 

您可以使用C中的指针

  int x = 1; unsafe { int* y = &x; *y = 3; } Debug.WriteLine(x.ToString()); 

(注意你必须使用unsafe标志进行编译)

执行此操作的唯一方法是使用“不安全”代码,并实际使用指针。 指针不能存在于C#中不安全的代码块之外。 然后,您应该能够像在C / C ++中一样使用指针

查看此页面,了解如何使用“不安全”代码块。

我想评论Eric Lippert的回答,但是新用户无法评论post。 所以,我想我有这样的用法。

看看这段代码:

 private void SetGridColumns(ref RegistryKey targetKey, List cols) { string targetKeyName = Path.GetFileName(targetKey.Name); m_grids.DeleteSubKeyTree(targetKeyName, false); targetKey.Close(); targetKey = m_grids.CreateSubKey(targetKeyName); 

// …}

  public void SetColumns(List cols, bool youth) { RegistryKey key = youth ? m_youthGrid : m_mainGrid; SetGridColumns(ref key, cols); } 

它应该是这样的:在SetColumns中,我使用键来调用SetGridColumns,具体取决于“youth”参数。 我希望首先删除我的密钥,然后重新创建。 m_mainGrid当然是类的成员。 在这种情况下,密钥确实被删除并重新创建。 但重新创建的只是SetGridColumns中的“targetKey”,而不是我的m_mainGrid。

所以,我在这里唯一能做的就是使用指针,这在C#中不是首选方式。 如果我只能这样做:

 ref RegistryKey key = youth ? m_youthGrid : m_mainGrid; 

一切都应该工作正常。