Sie verwechseln Verweise mit Werten. Wenn Sie dies tun:
T obj = GetT();
HandlingT(obj);
Und dann innerhalb der HandlingT
Methode dies zu tun:
obj = new T();
Der nichts auf die obj
Variable tut dieser Methode außerhalb erstellt. Die Variablen haben zufällig denselben Namen, aber sie sind nicht die gleiche Variable. Sie erstellen eine Instanz von T
und weisen sie der lokalen Variablen in der Methode zu. Wenn Sie diese Referenz außerhalb der Methode der Variablen zuweisen möchten, muss diese Zuordnung unter der Variablen erfolgen.
So zum Beispiel könnten Sie zurückkehren die Instanz von dem Verfahren:
public T HandlingT(T obj){
if(condition && obj == null){
obj = new T();
}
return obj;
}
und verwendet, den Wert außerhalb des Verfahrens zurückgegeben:
T obj = GetT();
obj = HandlingT(obj);
Grundsätzlich eine Zuordnung geschieht eine Variable, nicht ein In-Memory-Objekt. Wenn Sie das Objekt mit der Variablen referenzieren, können Sie dieses speicherinterne Objekt ändern. Aber wenn Sie die Variable einem neuen Objekt zuweisen, ändern Sie nicht das, worauf die Variable ursprünglich gezeigt hat, sondern Sie verweisen nur auf etwas anderes.
Bedenken Sie:
void DoSomething(MyObj obj)
{
obj = new MyObj();
obj.Something = "foo";
}
Das Beispiel tut nichts, um die Instanz, die ursprünglich an die Methode übergeben wurde.Eine neue Instanz wird erstellt und nur innerhalb der Methode referenziert. Sobald die Methode beendet ist, wird diese Instanz als Garbage-Collection erfasst und die ursprüngliche Instanz, die an die Methode übergeben wurde, wird nicht geändert.
Kontrast dazu:
void DoSomething(MyObj obj)
{
obj.Something = "foo";
}
Da keine neue Instanz erstellt wird, die lokalen obj
Variable immer noch auf die gleiche In-Memory-Instanz, die an die Methode übergeben wurde. Dieser Referenz wird gefolgt, und die ursprüngliche Instanz wird geändert, sodass die Änderung außerhalb der Methode nach Abschluss der Methode sichtbar ist.
Oder sollte ich stattdessen die Adresse von T in die handlingT() -Methode setzen? – kevricher
Können Sie die ASPX-Seite des Codes einschließen? – combatc2
Versuchen Sie 'HandlingT (out T obj)' –