2013-07-18 37 views
0

我竭力要弄清楚这种类型的代码CLI对象:传递在修改它们的功能

void changeString (String^% str) 
{ 
    str = "New String"; 
} 

为什么我需要跟踪引用传递给句柄对象?这太刺激了。 为什么手柄不够,句柄是类似于C++指针,那么为什么不......

感谢

+1

'String'是一个不可变的引用类型 - 它不能被修改。您需要修改引用它的引用。所以你需要一个跟踪参考。 –

+0

这是仅用于String的情况,还是我将不得不为所有类型的对象执行此操作,如果我想在函数中修改它们? – user2381422

+0

抱怨有点愚蠢,引用是一个基本的编程概念。您可以改用StringBuilder。使这个特定的片段清理器非常明显的方法是*返回新的字符串。 –

回答

4

我相信这是精神从本C无异++代码:

void reset_foo(Foo * & p) 
{ 
    p = new Foo; // leeks, neeps and tatties 
} 

用法:

Foo * p; 
reset_foo(p); 

反过来,这仅仅是传递引用的一般概念的一个特例:

void set_int(int & n) { n = 10; } 

int a; 
set_int(a); 
assert(a == 10); 
+0

是的,我明白了这一点。所以在那种情况下,我在拼图中想念的主要问题是理解String是不可变的参考类型,正如Joe Gauterin所说。那么问题是,所有的CLI类型都是不可变的引用类型吗?如果我想在功能中改变它们,我是否必须以这种方式通过它们? – user2381422

+0

@ user2381422:“不变的参考”是什么意思?你的意思是这个对象是不可改变的?您可以编写自己的CLI类,并且它们不必是不可变的。也许'字符串“是,但这是一个设计选择。 –

+0

那么如何将对象传递给函数,其中的对象将在函数内被修改?我仍然必须将它们作为MyClass ^%传递,这是对句柄的跟踪引用? – user2381422