2011-10-21 75 views
4

例如:C#引用赋值运算符?

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

它是否是任何参考操作员而不是 “=” 就行:3, 使在x等于3,如果我分配Y = 3。

+0

不,没有。这已经出现了,我记得Eric Lippert很好的回应。 – 2011-10-21 03:55:45

+3

你能解释为什么你会想要那样的东西吗?值类型不能这样做。 –

+0

http://stackoverflow.com/questions/1420186/references-to-variables-in-c – 2011-10-21 04:02:43

回答

4

“廉政”是分配的值类型,所以复制的价值,因为你已经发现。

你可以通过使用“不安全”的块使用指针在传统的C/C++感但随后的指针是仅该块限制了它的使用内部使用。相反,如果您想访问“不安全”块之外的值,则需要转换为使用引用。

事情是这样的......

var x = new Tuple<int>(1); 
var y = x; 
y.Item1 = 3; 
+0

请注意,如果x原本是一个类中的字段,则此解决方案可能不实际。在这种情况下,你可以改为使用[this code](http://stackoverflow.com/questions/2980463/how-do-i-assign-by-reference-to-a-class-field-in-c/ 2982037#2982037)由Eric Lippert在回答类似问题时提供。 – Brian

+0

注意:'x'和'y'可以是参考类型的局部变量,同样的道理适用。 *重新分配y不会影响x。*关于值类型的位不重要。 –

0

做到这一点的唯一方法是用“不安全”的代码,而实际使用指针。指针不能存在于C#中不安全的代码块之外。然后,您应该能够像在C/C++中一样使用指针

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

3

这不正是你问什么,但我想这可能是有益的。如果你想在函数内部的指针别名,你可以使用ref关键字像这样:

public static void RefExample(ref int y) 
{ 
    y = 3; 
} 

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

您可以使用指针像Ç

int x = 1; 
    unsafe 
    { 
     int* y = &x; 
     *y = 3; 
    } 

    Debug.WriteLine(x.ToString()); 

(请注意,您必须用编译不安全的标志)

9

我曾经写过一个原型的C#的版本有这样的功能;你可以说:

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

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

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

你不是第一个人问这个功能;有关更多详细信息,请参阅Can I use a reference inside a C# function like C++?

UPDATE:该功能可能会在C#7

+0

下面是一个例子,能够让'x'在循环之外成为'i'或'j'会更好。 http://i.imgur.com/W12AMCN.png – shinzou

+0

寻找_exact_相同的功能,我发现这个问题(其中许多人都一样)。我有一种我认为非常普通的情况,但我无法看到使用引用的体面解决方法。我想要的不涉及指针,内存地址或C++的其他“复杂”特性。我需要一个简单的(“盲”)引用(别名),来自C++的#define方向。我没有兴趣将函数传递给/从函数返回,所以也没有与栈相关的问题。以我的情况为例: – mireazma

+0

情况:我有几个_int_变量,并且按下一个键(在一个循环中),我从现在开始“分配”一个变量作为工作变量。现在所有要遵循的工作(许多功能)必须位于该特定变量上(即按另一个键来读/写它)。我看不到如何避免_unnecessary/overhead_code。 C++参考是绝对完美的。除了恕我直言,就像允许为ref类型传递值一样,相反也应该如此。 – mireazma

0

我想评论埃里克利珀的答案,但新用户不能评论的帖子。所以,我觉得我有这样的用法。

看看这个代码:

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

// ... }

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

它应该这样: 在SetColumns我打电话取决于与键SetGridColumns“青春“参数。我希望我的密钥首先被删除然后重新创建。 m_mainGrid当然是一个类的成员。 在这种情况下,密钥确实被删除并重新创建。但重新创建的只是SetGridColumns中的“targetKey”,而不是我的m_mainGrid。

因此,我唯一能做的就是在C#中使用不是首选的指针。 如果我只能这样做:

ref RegistryKey key = youth ? m_youthGrid : m_mainGrid; 

一切都应该正常工作。