我在理解ref
C#中的关键字的确切含义时遇到了麻烦。在我的C ++代码中,我正在创建一个字符串变量以及一个指向它的指针和引用变量。我将其传递给Delete或Change函数,并且正如预期的那样,所有3个变量都已被修改。
但是,使用C#,我正在创建变量x
,并使用字符串数据对其进行初始化。我正在创建一个变量y
,该变量在幕后应该是对的引用x
。然后,我用一个关键字传递x
给Change
orDelete
方法ref
,导致该方法内部的变量以及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";
}
}
}
这行:var y = x; 在x#中创建ya的副本,而不是在c#中对x的引用,因此在调用Changed函数时不应进行更改。
似乎没有一种简单的方法可以用C#(或大多数其他语言)重现相同的C ++行为。
当您将非值类型的对象作为参数传递给函数时,对象将按值传递,而对象内容(属性/字段等)则按引用传递(可以从函数内部进行更改),当您使用“ ref”关键字传递对象,该对象本身就是byref,并且也可以更改(与在c ++ / c中发送指针与向结构发送双指针(由指针本身保留指针)相同)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句