c#引用赋值操作符

本文关键字:赋值操作符 引用 | 更新日期: 2023-09-27 18:11:48

例如:

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

是任何引用操作符而不是"="行:3,为了使x等于3,如果我赋值y =3

c#引用赋值操作符

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

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

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

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

你不是第一个问这个问题的人;参见我可以像c++一样在c#函数中使用引用吗?了解更多详情。

'int'是值类型,因此在赋值时复制值,正如您已经发现的那样。

你可以使用指针在传统的C/c++意义上通过使用"不安全"块,但指针只能在块内使用,这限制了它的使用。如果你想在"不安全"块之外访问值,那么你需要转换为使用引用。

像这样…

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

这不是你要问的,但我认为这可能会有所帮助。如果想在函数内部使用指针别名,可以使用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());

(注意必须使用不安全标志进行编译)

做到这一点的唯一方法是使用"不安全"的代码,并实际使用指针。在c#中,指针不能存在于不安全代码块之外。这样你就可以像在C/c++

中那样使用指针了。

查看此页面了解如何使用"不安全"代码块

我想评论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键取决于"青年"参数。我希望先删除我的密钥,然后再重新创建。m_mainGrid当然是类的成员。在这种情况下,键确实被删除并重新创建。但是重新创建的只是SetGridColumns中的"targetKey",而不是我的m_mainGrid。

所以,我在这里唯一能做的就是使用指针,这在c#中不是首选的方式。如果我能做到:
ref RegistryKey key = youth ? m_youthGrid : m_mainGrid;

一切正常