托管C ++:列表中的字符串不会传递回调用者

时间:2009-12-02 04:51:18

标签: c# visual-c++ memory-management managed-c++

我有一个C#.Net控制台应用程序,它调用C ++ .Net类库。但是,执行以下应用程序时,列表变为空!

如果我删除旁边注释中指示的行,则代码可以正常工作。我不明白这个的原因。

如果我想在C ++类库中为列表重新分配内存,就像我在下面尝试的那样,那么正确的方法是什么?

C#2005控制台应用程序

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

C ++ 2005类库

public ref class Callee
{
    public:
    void DoSomething(List<String^>^ list);
};

void Callee::DoSomething(List<String^>^ list)
{
    list = gcnew List<String^>(); // Remove this line and it works
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}

1 个答案:

答案 0 :(得分:1)

您希望在C ++ / CLI中等效于此(C#代码如下)

class Caller
{
    static void Main(string[] args)
    {
        Callee callee = new Callee();
        List<String> s = new List<String>();
        callee.DoSomething(ref s);

        Console.WriteLine(s.Count); // Prints out 0
    }
}

public class Callee 
{
    void DoSomething(ref List<string> list)
    {
        list = new List<string>(); 
        list.Add("Test String 1");
        list.Add("Test String 2");
    }
}

请注意,'list'是通过引用传递的,因此当您分配新对象时,它将更改传递给函数的原始变量。

等效的C ++ / CLI语法如下:

public ref class Callee
{
    public:
    void DoSomething(List<String^>^% list);
};

void Callee::DoSomething(List<String^>^% list)
{
    list = gcnew List<String^>(); 
    list->Add(gcnew String("Test String 1"));
    list->Add(gcnew String("Test String 2"));
}

在该类型中添加“%”将使列表作为跟踪引用传入。

有关跟踪参考的详细信息,请访问http://en.wikipedia.org/wiki/C%2B%2B/CLI#Tracking_references