Laden...

Reference speichern, ohne unmanged Code?

Erstellt von chea77er vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.044 Views
C
chea77er Themenstarter:in
74 Beiträge seit 2008
vor 14 Jahren
Reference speichern, ohne unmanged Code?

Hallo,

Ich habe eine Managed Class, die recht simple aufgebaut ist, Nun da man ja in C# keine direkten Pointer zu anderen Klassen machenkann, hab ich mir mal überlegt mit einer Refernce zu arbeiten.

Hier ein beichspiel:


public class MyClass
{
        anderclass test;
        nocheineandere test2;
        ....
}

class Test
{
      MyClass reference;
      
      public void init(ref MyClass t)
      {
             reference = t;
      }
}

So wen ich nun in einem Program die Init Funktion aufrufe, und eine reference zu einer vorhandenen MyClass klasse übergebe, wird diese dann wirklich in MyClass reference gespeichert, wen ich nun wärend der Laufzeit irgentwas mit reference ändere also zB.

reference.andereclass = new ....

Wird diese dann auch wirklich geändert, oder nur die Variable reference, und das selbe ungekehrt, wen ich die ursprungliche nehme und die ändere, wird es dann in reference auch geändert.

Wen nicht was für andere möglichkeiten habe ich .

Und vorallen wen MyClass eine funktion beinthaltet, würde diese dann auch richtig ausgeführt werden. Also eine FUnktion die eine andere variable ändern soll.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo chea77er,

public void init(ref MyClass t)  

bringt gar nichts, wenn t nicht innerhalb von init geändert wird.

Wonach du fragst, ist eine Referenz auf eine Referenz. Das gibt es aber in C# nur bei der Parameterübergabe (und da eben nur solange, wie die Funktion noch nicht beendet ist) und nicht für Felder.

Ich frage mich allerdings, wozu du das brauchst. Eigentlich braucht man sowas nicht. Durch Referenzen erreicht man ja schon, dass man an verschiedenen Stellen auf dasselbe Objekt zugreifen kann. Dass sich, wenn man eine Referenz ändert, auch alle anderen Referenzen auf dasselbe Objekt mitändern, braucht man eigentlich nicht. Schreib man was zu dem konkreten Einsatzzweck.

herbivore

479 Beiträge seit 2008
vor 14 Jahren

Hallo,

auch in C# kann man Pointer (Zeiger) verwenden, aber nur wenn man mit /unsafe kompiliert. Davon würde ich aber abraten, da so die Absturzgefahr sehr hoch wird.
Außerdem musst du dann

ptr->Member

machen.

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
C
52 Beiträge seit 2010
vor 14 Jahren
public void init(ref MyClass t)  

bringt gar nichts, wenn t nicht innerhalb von init geändert wird.

Das musst du mir mal genauer erklären.

925 Beiträge seit 2004
vor 14 Jahren

Das musst du mir mal genauer erklären.

Warum sollte ich call by reference machen, wenn ich in der Methode den tatsächlichen Parameter nicht ändern will? In so einem Fall reicht auch call by value.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo chrismoe,

Das musst du mir mal genauer erklären.

ich meinte, dass das ref in der Parameterliste nur sinnvoll ist, wenn in mindestens einem Code-Pfad innerhalb der Methode eine Zuweisung an t vorgenommen wird. Dass eine solche Änderung auf die Variable durchschlägt, die an t übergeben wurde, ist ja gerade der Sinn von ref. Siehe auch [Artikel] C# und Übergabemechanismen: call by value vs. call by reference (ref/out).

herbivore

C
52 Beiträge seit 2010
vor 14 Jahren

@herbivore

Genmau das meine ich. Das gilt für Value-Typen. Bei Referenz-Typen braucht man das nicht. Das klingt so, als ob ich, falls ich kein ref reingeben und eine Zuweisung an t mache, die Änderungen nicht "durchschlagen", das ist im Fall von Referenztypen falsch. Die schlagen sehr wohl durch. Das einizige was nicht durchschlägt, ist das manipulieren des Parameters, der ist bei CBV eine kopierte Referenz und bei ref die "wahre" Referenz. Also falls ich t null setzte oder auf ein anderes Objekt umbiege.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo chrismoe,

Das klingt so, als ob ich, falls ich kein ref reingeben und eine Zuweisung an t mache, die Änderungen nicht "durchschlagen", das ist im Fall von Referenztypen falsch

im Grund hast du mit deinem Beitrag schon recht, aber dieser Satz ist, so wie er da steht, nicht korrekt. Denn eine Zuweisung an t ist ja gerade das, was du mit "Also falls ich t null setzte oder auf ein anderes Objekt umbiege" beschreibst. Zuweisungen an t schlagen auch bei Referenztypen nur durch, wenn ref benutzt wird. Dagegen schlagen bei Referenztypen Änderungen an dem Objekt, auf das t verweist, - wie du richtig gesagt hat - in jedem Fall (also mit oder ohne ref) durch.

Aber das ändert ja alles nichts daran, dass die Verwendung von ref nicht sinnvoll ist, solange nicht mindestens in einem Codepfad eine Zuweisung an t durchgeführt wird.

herbivore