C#引用赋值运算符?

时间:2011-10-21 03:52:17

标签: c# variables reference

例如:

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

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

6 个答案:

答案 0 :(得分:9)

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

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

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

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

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

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

答案 1 :(得分:4)

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

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

像这样......

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

您可以使用 C

中的指针
    int x = 1;
    unsafe
    {
        int* y = &x;
        *y = 3;
    }

    Debug.WriteLine(x.ToString());

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

看看这段代码:

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,具体取决于“youth”参数。我希望首先删除我的密钥,然后重新创建。 m_mainGrid当然是类的成员。 在这种情况下,确实删除并重新创建了密钥。但重新创建的只是SetGridColumns中的“targetKey”,而不是我的m_mainGrid。

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

ref RegistryKey key = youth ? m_youthGrid : m_mainGrid;

一切都应该正常。