0
String ^% text = button->Text ; 
text = "something" ;

应该更改按钮的文本,但事实并非如此。

4

1 回答 1

3

这不起作用,代码只更新对象。它没有比这更进一步,还更新了 TextBox::Text 属性。这不仅仅是因为这是一个字符串,正如重复链接中所暗示的那样,它也不适用于简单的值类型属性。

这是因为属性不是值,您无法创建对它们的引用。当您使用它们时,它们看起来就像语法中的值。但肯定不是当你声明它们时,请注意你必须如何编写一个 get 和一个 set 方法。因此,要更新 TextBox 中显示的文本,您必须调用属性的 set 方法。这不仅仅是一个简单的变量赋值,它是一个方法调用。直观上可能很明显,请注意分配 Text 属性是如何产生很多副作用的。你可以在屏幕上看到它。

要间接调用一个方法,你需要另一辆车,你需要一个委托。非常类似于 C 中的函数指针。任何有关 .NET 编程的介绍性书籍都会解释它们。您可以声明自己的委托类型,但更喜欢 .NET 框架中内置的通用委托类型。添加对 System.Core 的引用,以便您可以使用通用 Action<> 委托类型。您需要首先编写一个分配 Text 属性的方法:

private: 
    void updateTextBox(String^ text) {
        textBox1->Text = text;
    }

这将使用如下示例方法进行更新:

    void Test(Action<String^>^ updater) {
        updater("foo");
    }

并注意此方法如何更新任何文本框,您传递的委托对象决定哪个。您可以使用如下代码创建委托变量:

    Test(gcnew Action<String^>(this, &Form1::updateTextBox));
于 2013-04-21T18:11:45.300 回答