Wie erstelle ich eine CLI-Wert Klasse eine Liste (oder ähnliche) enthält, die von Wert übergeben wird?

StackOverflow https://stackoverflow.com/questions/2085337

Frage

Wir haben eine C ++ Bibliothek, die eine Struktur enthält, einen STL-Vektor von Strukturen verwendet, etwa so:

struct Params
{
    // values...
}

struct Settings
{
    std::vector<Params> m_params;

    // values...
}

Ich bin ein CLI-Wrapper für die Bibliothek zu schreiben, und ich möchte Äquivalente für die oben genannten Strukturtypen. Ich hatte darüber nachgedacht, eine Liste als Äquivalent eines Vektors verwendet, etwa so:

public value struct Params
{
    // values...
}

public value struct Settings
{
    List<Params>^ Params;

    // values...
}

Aber da List ein Referenztyp ist, wird die Liste als Referenz übergibt um eher als Wert. Gibt es eine Möglichkeit, eine CLI-Klasse der Erstellung einer Liste (oder ähnliche) enthalten, die von Wert übergeben wird, zusammen mit dem Rest der Mitglieder?

War es hilfreich?

Lösung

Ich bin damit einverstanden Antwort mit mcdave ist, was läuft darauf hinaus, dass das, was Sie fragen, wird nicht unterstützt.

Ich spekuliere, dass Ihre Hauptsache ist, nicht zu bekommen Ist Pass-by-Wert, aber mehr Pass-by-Wert zu erhalten Verhalten . Denken Sie an System.String. Das ist nicht wirklich ein Werttyp, aber Sie können die Referenzen um sicher passieren, weil Strings nicht geändert werden kann, können Sie nur neue machen können.

Um das gleiche für eine Liste zu erhalten, können Sie eine Eigenschaft vom Typ Params machen IList<Param>. Wenn es die Zuordnung der Inhalte in eine neue List<Param> kopieren und speichern Sie die IList Zeiger erhalten Sie, wenn AsReadOnly() aufrufen. Von nun an der IList auf ein Objekt, das nicht verändert werden kann. Wenn die Struktur von Wert übergeben wird, wird der Zeiger kopiert, aber das ist in Ordnung, weil es zeigt auf etwas unveränderlich. Wenn Ihr Objekt um eine Menge übergeben wird, wird es auch schneller, weil es für eine deep jedes Mal keine Notwendigkeit.

Andere Tipps

Ich glaube nicht, dass Sie Ihre Einstellungen Klasse um nach Wert übergeben können, weil ( von C3417 ) wie der Copykonstruktor.

Sie können einen ähnlichen Effekt erzielen mit:

public value struct Settings : public ICloneable
{
    List<Params>^ m_params;

    virtual Object^ Clone()
    {
        Settings^ rv = gcnew Settings();
        rv->m_params = gcnew List<Params>();
        rv->m_params->AddRange(m_params->ToArray());
        return rv;
    }
}

In Ihrem C # -Code würden Sie dann:

Settings s1, s2;
// ... some code modifying s1
s2 = (Settings)s1.Clone();

, die fast so sauber wie die Settings settings1 = settings2; Stil Syntax, die Sie mit Pass von Wert zu erhalten ist.

Wie wäre es List<Params>^% Params; alternativ List<Params%>^% Params;?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top