2 Stimmen

C# Aufruf einer Methode und Variablenumfang

Warum werden die Karten unten geändert? Habe mich verwirrt.. verstehen, die Übergabe von ref, die ok funktioniert.. aber wenn ein Array übergeben ist nicht tun, wie ich erwarte. Kompilieren unter .NET3.5SP1

Vielen Dank!

void btnCalculate_Click(object sender, EventArgs e)
{
    string[] cards = new string[3];
    cards[0] = "old0";
    cards[1] = "old1";
    cards[2] = "old2";
    int betResult = 5;
    int position = 5;
    clsRules myRules = new clsRules();
    myRules.DealHand(cards, betResult, ref position);  // why is this changing cards!
    for (int i = 0; i < 3; i++)
        textBox1.Text += cards[i] + "\r\n";  // these are all new[i] .. not expected!

    textBox1.Text += "betresult " + betResult.ToString() + "\r\n";  // this is 5 as expected
    textBox1.Text += "position " + position.ToString() + "\r\n"; // this is 6 as expected
}

public class clsRules
{
    public void DealHand(string[] cardsInternal, int betResultInternal, ref int position1Internal)
    {
        cardsInternal[0] = "new0";
        cardsInternal[1] = "new1";
        cardsInternal[2] = "new2";

        betResultInternal = 6;
        position1Internal = 6;
    }
}

1voto

mfeingold Punkte 6996

Wenn Sie ein Array als Objekt übergeben, wird es nicht kopiert. Die empfangende Methode arbeitet mit der gleichen Instanz. In gewissem Sinne werden Arrays immer per Referenz übergeben. Wenn ein Array sowie eine Instanz eines beliebigen anderen Referenztyps als Parameter übergeben wird, erhält die empfangende Methode ihre eigene Kopie einer Referenz auf dieselbe Instanz des Typs. Es wird keine Kopie des eigentlichen Objekts erstellt.

Wenn Sie eine Kopie übergeben müssen, müssen Sie dies explizit tun: Erstellen Sie selbst eine Kopie oder klonen Sie das Array. Der Grund, warum dies nicht für Sie getan wird, ist offensichtlich - das Kopieren eines Arrays kann teuer sein, Sie wollen es nicht, wenn es nicht wirklich notwendig ist

1voto

Fredrik Ullner Punkte 2008

Arrays sind Referenztypen und können sich daher ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X