Frage

Ich mache umfangreichen Gebrauch von Vererbung, polymorphisim und Verkapselung, aber ich erkennen, dass ich nicht das folgende Verhalten über Umfang ein Objekt gegen eine Variable nicht kannte. Der Unterschied ist am besten mit Code dargestellt:

public class Obj
{
    public string sss {get; set;}

    public Obj()
    {
        sss = "0";
    } 
}     

public partial class testScope : System.Web.UI.Page
 {
    protected void Page_Load(object sender, EventArgs e)
    { 
        Obj a = new Obj(); 
        String sss = "0";            
        Context.Response.Write(sss); // 0

        FlipString(sss);
        FlipString(a.sss);
        Context.Response.Write(sss + a.sss); // 0 0

        FlipObject(a);
        Context.Response.Write(a.sss); // 1
        Context.Response.End();
    }

    public void FlipString(string str)
    { str = "1"; }

    public void FlipObject(Obj str)
    { str.sss = "1"; }
}

So dachte ich, dass, wenn eine Variable in eine Methode übergeben wird, dass Änderungen an den Umfang des Verfahrens begrenzt sind. Aber es scheint, dass, wenn ein Objekt in eine Methode übergeben wird, die er die Eigenschaften ändert über das Verfahren verlängern.

Das kann ich akzeptieren, wenn die Regel ist, dass dieses Verhalten für das Objekt und nicht die Variablen aber in .net alles vorhanden ist, um ein Objekt, eine Zeichenfolge (wie das in dem Beispiel System.String) Also was ist die Regel, wie kann ich sage voraus, den Umfang eines Parameters, i in eine Methode übergeben?

War es hilfreich?

Lösung

Sie nie ein Objekt als Argument übergeben - Sie immer nur einen Verweis übergeben oder einen Werttyp Wert. Sofern Sie das ref Schlüsselwort verwenden, werden Argumente von Wert übergeben - d. H der Anfangswert des Parameters der ausgewertete Wert des Arguments ist, und Änderungen an den Wert des Parameters werden nicht vom Anrufer gesehen

Allerdings ist es sehr wichtig zu verstehen, dass der Wert des Parameters (für einen Referenz-Typen) ist nur die Referenz . Wenn Sie den Inhalt des Objekts ändern, dass der Verweis bezieht sich auf, dann , die Veränderung wird durch den Anrufer zu sehen.

Es ist ein Thema, das mehr als ein paar Absätze verdient - ich schlage vor, Sie meine Artikel über Parameter lesen in .NET für weitere Informationen übergeben.

Andere Tipps

Ich denke, dass ich dachte, es nur um googleing aus, sind einige Dinge in .net „Wert“ Typen und andere „Referenz“ sind Typen, so dass der Wert für Werttypen dupliziert wird, wenn in ein Verfahren gemarshallt werden, aber Referenztypen hat ein wie ein Zeiger oder Referenz in die Methode übergeben werden, die offensichtlich den gleichen Umfang wie die Mutter teilt. Also meine Frage ist, wie kann sagen, ob etwas ein Werttyp ist oder nicht, ich sehe, dass structs wie ints sind alle Werttypen aber Strings erscheinen wie structs verhalten, obwohl sie System.String Objekte?

Eine Klasse (Obj in Ihrem Fall) ist ein Referenztyp , so dass, wenn Sie die Funktion aufrufen, was Sie wirklich eine Referenz ist vorbei tun, um dieses Objekt (Sie im Grunde denken dies als eine typsichere Zeiger kann). Wenn Sie Änderungen an veränderliche Objekte verhindern wollen (dh Klasse / Referenztypen), dann müssen Sie dieses Objekt klonen, bevor es an die zuständige Funktion übergeben (oder einfach halten es für eine Struktur zu machen, so dass sie von Wert kopiert wird).

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