Winforms ^(对象句柄操作符)是如何工作的?

Winforms ^(对象句柄操作符)是如何工作的?,winforms,c++-cli,Winforms,C++ Cli,我可以通过删除文本框中的最后一个字符 textBox1->Text = textBox1->Text->Remove(textBox1->Text->Length - 1); 我想创建一个指向文本的引用或指针。但我不能这样做 String^ t = textBox1->Text; t = t->Remove(t->Length - 1); // Text doesn't change 注意:任何一项都不能编译: String* t = tex

我可以通过删除文本框中的最后一个字符

textBox1->Text = textBox1->Text->Remove(textBox1->Text->Length - 1);
我想创建一个指向文本的引用或指针。但我不能这样做

String^ t = textBox1->Text;
t = t->Remove(t->Length - 1); // Text doesn't change

注意:任何一项都不能编译:

String* t = textBox1->Text; // error: an ordinary pointer to a
                            // C++/CLI ref class or interface class
                            // is not allowed

String& t = textBox1->Text; // error: an ordinary reference to a
                            // C++/CLI ref class or interface class
                            // is not allowed

String% t = textBox1->Text // error: a tracking reference to a
                           // System::String is not allowed
只需更改本地引用(指针thingy,handle,…)
t
,以引用由
Remove
返回的字符串

文本框字符串不会因此而改变

当你这样做的时候

textBox1->Text = t;
…您正在为属性
文本
调用一个setter函数,该setter函数不仅更改文本框字符串数据,而且更新或至少使文本框显示无效

只需更改本地引用(指针thingy,handle,…)
t
,以引用由
Remove
返回的字符串

文本框字符串不会因此而改变

当你这样做的时候

textBox1->Text = t;

…您正在为属性
文本
调用一个setter函数,该setter函数不仅更改文本框字符串数据,而且更新或至少使文本框显示无效。

在.NET中的字符串是不可变的。存储一个引用到TyBox控件,而不是.@ CyDyGr:只是出于好奇(我不熟悉C++ CLI),什么是“代码”> TrimBox x这里的可能类型?@ CODYGRY,但不<代码> T->移除< /Cord>创建一个新的字符串?@欢呼:St::Windows::窗体::这是System::Windows::Forms::Control的派生类。您正在查找引用。这在C++/CLI中是受支持的,它是
String^%
。但是当您尝试使用它时,您会感到非常惊讶,在支持引用的语言中,属性是一个非常容易泄漏的抽象。C++之所以没有这些大的原因。如果需要额外级别的间接寻址,则需要使用委托。NET中的字符串是不可变的。存储一个引用到TyBox控件,而不是.@ CyDyGr:只是出于好奇(我不熟悉C++ CLI),什么是“代码”> TrimBox x这里的可能类型?@ CODYGRY,但不<代码> T->移除< /Cord>创建一个新的字符串?@欢呼:St::Windows::窗体::这是System::Windows::Forms::Control的派生类。您正在查找引用。这在C++/CLI中是受支持的,它是
String^%
。但是当您尝试使用它时,您会感到非常惊讶,在支持引用的语言中,属性是一个非常容易泄漏的抽象。C++之所以没有这些大的原因。如果你需要一个额外的间接级别,那么你需要使用一个委托。但是为什么在我写
t=[新字符串对象]
时不调用setter函数呢?@Pavel因为
t
只是一个局部变量而
TextBox::Text
是一个属性(引擎盖下的一对getter/setter)。但为什么在我编写
t=[new String object]
时不调用setter函数?@Pavel,因为
t
只是一个局部变量,而
TextBox::Text
是一个属性(引擎盖下的一对getter/setter)。