Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C++/CLI将字符串^作为跟踪引用传递不';I don’我没有按预期工作_.net_C++ Cli - Fatal编程技术网

.net C++/CLI将字符串^作为跟踪引用传递不';I don’我没有按预期工作

.net C++/CLI将字符串^作为跟踪引用传递不';I don’我没有按预期工作,.net,c++-cli,.net,C++ Cli,我在VS2010中使用C++/CLI。感谢您的回答,我了解到在C++/CLI中,您通过引用传递对象,如下所示 voin func(String ^ %string){ //modify string } 我想做的是将一些参数传递给GetInput表单的构造函数。然后将它们从用户输入修改到此表单。当表单关闭时,调用方表单将获得在GetInput表单中输入的值 对于我来说,它使用的是列表,而不是字符串^。代码如下: public ref class GetInput : public System

我在VS2010中使用C++/CLI。感谢您的回答,我了解到在C++/CLI中,您通过引用传递对象,如下所示

voin func(String ^ %string){
//modify string
}
我想做的是将一些参数传递给
GetInput
表单的构造函数。然后将它们从用户输入修改到此表单。当表单关闭时,调用方表单将获得在
GetInput
表单中输入的值

对于我来说,它使用的是
列表
,而不是
字符串^
。代码如下:

public ref class GetInput : public System::Windows::Forms::Form
{
public:
    List<double>^ _data;
    String ^ _string_data;

    GetInput(List<double>^ %data, String ^ %string_data){
        _data = data;
        _string_data = string_data;
        //this code is here just for the sake of an example, 
        //it's actually in one of the methods
        _data->Add(0.5); 
        _string_data = "15";
    }
    //void buttonClickHandler where i actually want to modify data and string_data
}
我需要将传递给构造函数的指针保存为类成员,然后在其中一个成员函数中更改该指针指向的数据

但是C++/ClI跟踪引用是不同的

认为“追踪参考资料”有神奇之处,可能是你在这里遇到麻烦的原因。C++/CLI语言和文档使这一点显得繁重,它是为C++程序员编写的。事实上,这一切都没什么不同

它只是一个指针

它的行为也完全像一个指针,无论是在处理器上还是在语法上。它唯一“特别”的地方是垃圾收集器可以找到它。这是必要的,这样它才能完成它的工作。C++/CLI设计人员选择使用
^
而不是
*
,因为他们有限制。普通类,例如,不能使其成为非托管类的成员。GC无法知道它在内存中的位置,因此无法完成其工作

你的问题很简单,你有两个指针<代码>字符串数据和
字符串数据
。请注意,您选择的名称并不能完全帮助您正确使用它。您更新了_string_数据指针,赋值后它现在指向“15”。但是不是通过引用传递的指针,它仍然指向原始字符串。因此,当然不会将任何更改传播回调用方。不知道目的是什么,但武断地:

  _string_data = "15";
  string_data = _string_data;
现在,调用方还将看到其引用更新为“15”。两个指针现在都指向同一个对象

请注意,
List
参数也是错误的。您没有更新
数据
指针。您也不需要这样做,因为您没有创建新的列表对象。您的代码只修改了对象,而没有修改指向该对象的指针。因此,通过引用传递它是完全没有必要的


还有一个细节与这个问题有关。请注意,您通过调用列表对象的Add()方法修改了它。但是不能对字符串执行相同的操作。它是不可变的,它的任何方法和属性都不允许您修改它的内容。这给了它非常理想的行为,字符串总是线程安全的,并且作为参数传递给方法总是安全的。确保它永远不会被修改。它的行为就像一个值

或者换句话说,您必须通过引用传递字符串指针以将更改传播回调用方

注意列表不是不可变的,您的Add()调用使对象发生了彻底的变化。使用您的类的客户端程序员不太可能期望这种情况发生。C++中的const关键字是表示差异的好方法。然而,它在C++/CLI中工作得并不好,其他.NET语言对它并不了解。您可以在声明中使用const,但它不能在运行时强制执行

但是C++/ClI跟踪引用是不同的

认为“追踪参考资料”有神奇之处,可能是你在这里遇到麻烦的原因。C++/CLI语言和文档使这一点显得繁重,它是为C++程序员编写的。事实上,这一切都没什么不同

它只是一个指针

它的行为也完全像一个指针,无论是在处理器上还是在语法上。它唯一“特别”的地方是垃圾收集器可以找到它。这是必要的,这样它才能完成它的工作。C++/CLI设计人员选择使用
^
而不是
*
,因为他们有限制。普通类,例如,不能使其成为非托管类的成员。GC无法知道它在内存中的位置,因此无法完成其工作

你的问题很简单,你有两个指针<代码>字符串数据
字符串数据
。请注意,您选择的名称并不能完全帮助您正确使用它。您更新了_string_数据指针,赋值后它现在指向“15”。但是不是通过引用传递的指针,它仍然指向原始字符串。因此,当然不会将任何更改传播回调用方。不知道目的是什么,但武断地:

  _string_data = "15";
  string_data = _string_data;
现在,调用方还将看到其引用更新为“15”。两个指针现在都指向同一个对象

请注意,
List
参数也是错误的。您没有更新
数据
指针。您也不需要这样做,因为您没有创建新的列表对象。您的代码只修改了对象,而没有修改指向该对象的指针。因此,通过引用传递它是完全没有必要的


还有一个细节与这个问题有关。请注意,您通过调用列表对象的Add()方法修改了它。但是不能对字符串执行相同的操作。它是不可变的,它的任何方法和属性都不允许您修改它的内容。这给了它非常理想的行为,字符串总是线程安全的,并且作为参数传递给方法总是安全的。确保它永远不会被修改。它的行为就像一个值

或者换句话说,您必须通过引用传递字符串指针以将更改传播回调用方

请注意,列表不是不可变的,您的Add()调用使obj发生了彻底的变化