C#Pass by Reference(ref关键字)问题

时间:2016-08-03 01:14:53

标签: c# c++ reference

我无法理解C#中ref关键字的确切含义。 在我的C ++代码中,我创建了一个字符串变量以及指向它的指针和引用变量。我将其传递给删除或更改功能,正如预期的那样,所有3个变量都被修改。

然而,使用C#,我创建变量x并使用字符串数据初始化它。我创建了一个变量y,它应该引用x。然后,我使用x关键字将Change传递到Deleteref方法,从而导致方法内的变量以及x待修改。但是,y不会被修改,即使它应该是对x的引用,就像在C ++中一样。这不仅是字符串的问题,因为我已经尝试使用C#对象进行上述测试,并且具有相同的结果。

当我执行y时,这是否意味着x按值复制了var y = x

C ++

#include <iostream>
using namespace std;

void Delete(string &variable)
{
    variable = "";
}

void Change(string &variable)
{
    variable = "changed data";
}

void main()
{
    string x = "data";
    string *y = &x;
    string &z = x;
    Delete(x);
}

C#

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var x = "data";
            var y = x;
            Change(ref x);
        }


        public static void Delete(ref string variable)
        {
            variable = null;
        }

        public static void Change(ref string variable)
        {
            variable = "changed";
        }
    }
}

3 个答案:

答案 0 :(得分:2)

这一行:     var y = x; 使y成为x的副本而不是c中对x的引用 所以当你调用Changed函数时,它不会改变。

似乎没有一种简单的方法可以在C#(或大多数其他语言)中重现相同的C ++行为。

当您将非值类型对象作为参数传递给函数时,该对象按值传递,但对象内容(属性/字段等)通过引用传递(您可以从函数内部更改它们) ),当您使用&#34; ref&#34;传递对象时关键字,对象本身是byref,也可以更改(它与发送指针相对于在c ++ / c中向结构发送双指针(它本身保存指针)相同)。

答案 1 :(得分:1)

除了“不安全”之外别无他法。代码,在C#中重现此行为。 即使第二个变量的标识发生变化,C ++仍然可以将指针固定在另一个变量上的能力在大多数其他语言中都不可用。

这不是字符串或任何其他类型的特殊功能。 例如,在以下C ++代码的末尾,&#39; g&#39;指向更新的&#39; f&#39;,设置为&#39; SomeOtherFoo&#39;:

Foo f = new Foo();
Foo g = f;
f = SomeOtherFoo();
//'g' does not point to the updated 'f'

安全&#39; C#,在以下代码的末尾,&#39; g&#39;仍然是原始对象,而不是由&#39; SomeOtherFoo&#39;返回的新对象:

,

答案 2 :(得分:0)

问题的核心是字符串在C#中被视为值类型(原始),但在C ++中被视为引用类型。因此,将一个字符串分配给另一个变量将简单地复制该值,如Dr.Haimovitz所写。

您可以通过编写“不安全代码”来访问C#中变量的实际指针的一种方法。 https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx

相关问题