String 在Metro/C++;? 我正在研究C++的Mytra风格的应用程序,并且必须通过引用传递字符串(不知何故)。首先,我传递了字符串^,它不起作用,因为字符串是不可变的,我是如何发现的

String 在Metro/C++;? 我正在研究C++的Mytra风格的应用程序,并且必须通过引用传递字符串(不知何故)。首先,我传递了字符串^,它不起作用,因为字符串是不可变的,我是如何发现的,string,reference,c++-cli,microsoft-metro,String,Reference,C++ Cli,Microsoft Metro,通过引用传递字符串的正确方法是什么 编辑:好的,看起来不那么容易,因为答案和注释建议使用返回值。但我认为这不适用于我的情况:在这个Metro应用程序中,我有两个页面,应该在这两个页面上“共享”一个字符串。 因此,在主页中,我在单击事件中执行此操作: this->Frame->Navigate(新建页面,this->TestString) 在第二页的OnNavigatedTo事件中,我将第二个参数转换为字符串^。然后我使用this->Frame->GoBack()导航回第一页。在那里,我希望能够访

通过引用传递字符串的正确方法是什么

编辑:好的,看起来不那么容易,因为答案和注释建议使用返回值。但我认为这不适用于我的情况:在这个Metro应用程序中,我有两个页面,应该在这两个页面上“共享”一个字符串。
因此,在主页中,我在单击事件中执行此操作:
this->Frame->Navigate(新建页面,this->TestString)


在第二页的OnNavigatedTo事件中,我将第二个参数转换为字符串^。然后我使用
this->Frame->GoBack()
导航回第一页。在那里,我希望能够访问已更改的字符串。不幸的是,据我所知,GoBack()不允许传递任何参数。

请参见下面一个函数
f
的示例,该函数将对
std::string
的引用作为参数

std::string someString;

void f(std::string& s);

f(someString);

下面是函数
f
的示例,该函数将对
std::string
的引用作为参数

std::string someString;

void f(std::string& s);

f(someString);

您可以使用跟踪引用:

void ModifyTheParameter(String^% value) {
    value = gcnew String("Blah");
}
这将修改作为参数()传入的原始变量。然后,它将与使用
String^
参数的任何其他方法一样使用

但如果可能,请避免使用跟踪引用作为参数。我建议只返回一个
字符串^
,并将其分配给原始变量


还有另一种可能性:您可以创建某种视图无关的数据模型,其中包含您的字符串(可能还有您使用的其他数据)。然后,您可以将该数据模型传递给您的方法。因为DataModel变量没有更改(只是它的一个属性),所以不需要传递对它的引用

您可以使用跟踪参考:

void ModifyTheParameter(String^% value) {
    value = gcnew String("Blah");
}
这将修改作为参数()传入的原始变量。然后,它将与使用
String^
参数的任何其他方法一样使用

但如果可能,请避免使用跟踪引用作为参数。我建议只返回一个
字符串^
,并将其分配给原始变量


还有另一种可能性:您可以创建某种视图无关的数据模型,其中包含您的字符串(可能还有您使用的其他数据)。然后,您可以将该数据模型传递给您的方法。因为DataModel变量没有更改(只是它的一个属性),所以不需要传递对它的引用

你真的不应该使用passby-reference,正如博茨在回答中所说的那样,使用返回值。我更新了我的问题,用更多的细节来描述我的情况。恐怕我不知道在那种情况下如何使用返回值。你真的不应该使用pass-by-reference,而是像博茨在回答中所说的那样使用返回值。我更新了我的问题,以更详细地描述我的情况。恐怕我不知道在那种情况下如何使用返回值。谢谢你的回答。我更新了我的问题,以便更详细地描述我的情况。正如您所建议的,我将避免跟踪引用,但我也不知道在我的情况下如何返回值。@Sentropie我明白了。我给我的答案增加了另一种可能性。谢谢你的回答。我更新了我的问题,以便更详细地描述我的情况。正如您所建议的,我将避免跟踪引用,但我也不知道在我的情况下如何返回值。@Sentropie我明白了。我给我的答案增加了另一种可能性。