Laden...

Wie erzeuge ich Referenz auf Value-Typ?

Erstellt von wisher78 vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.127 Views
wisher78 Themenstarter:in
101 Beiträge seit 2011
vor 8 Jahren
Wie erzeuge ich Referenz auf Value-Typ?

Hallo,

ja ich weiß very basic die Frage aber ich kann folgenden Sachverhalt nicht ganz glauben und frage lieber nach.


object a = 0;
object b = 0;

b=a;
a= 1;

Console.WriteLine(b.ToString());

Die Ausgabe ist 0

Hier wird Boxing betrieben und da es sich um einen Werte-Typ handelt, findet keine Referenz-
Zuweisung statt. Okay, aber kann ich diese nicht irgendwie erzwingen? Gibt es noch andere Wege als hier über Zeigervariablen zu operieren?

F
10.010 Beiträge seit 2004
vor 8 Jahren

Nein, und wozu sollte soetwas gut sein?

wisher78 Themenstarter:in
101 Beiträge seit 2011
vor 8 Jahren

Weil es Anforderungen gibt, wo ich selbst einen einzelnen Wert nicht kopieren, sondern referenzieren möchte?

2.080 Beiträge seit 2012
vor 8 Jahren

Du wirst nicht um einen Wrapper herum kommen, den Du dann referenzieren kannst.
Entweder Du schreibst dir einen eigenen Wrapper für deine Anforderung, oder Du gibst dich mit Nullable<T> zufrieden.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

T
2.224 Beiträge seit 2008
vor 8 Jahren

Ich würde einfach Nullable empfehlen.
Dort wird dann dein Werttyp als Property gekapselt.
Dann kannst du quasi die Referenzen zum Nullable zuweisen.
Eine eigene Kapselung macht hier für einen Wert Typen keinen Sinn.
Wenn du aber mehrere hast, dann hast du eher eine Klasse.
Aber sind halt Basics.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
152 Beiträge seit 2013
vor 8 Jahren

Ich würde einfach Nullable empfehlen.
Dort wird dann dein Werttyp als Property gekapselt.
Dann kannst du quasi die Referenzen zum Nullable zuweisen.


int? a = 0;
int? b = 0;

b = a;
a = 1;

Console.WriteLine("a = {0}", a); // a = 1
Console.WriteLine("b = {0}", b); // b = 0 ; hier soll aber auch 1 ausgegeben werden.

Oder habe ich den Vorschlag der Verwendung von Nullable falsch verstanden.
Auch Nullable-Typen verhalten sich doch auch wie Wertetypen.

Wenn du aber mehrere hast, dann hast du eher eine Klasse.

Dann habe ich aber immer noch keine Referenz wie in C++, eine Referenz auf eine Zeigervariable.

In C++ geht das ohne Probleme, dort wird aber auch nicht zwischen Referenz- und Wertetypen unterschieden.


int a = 0;
int &b = a; // Referenz auf a

a = 1;

cout << "a = " << a << endl; // a = 1
cout << "b = " << b << endl; // b = 1

T
2.224 Beiträge seit 2008
vor 8 Jahren

Komisch, hatte eigentlich auch erwartet, dass dies klappt.
Dann kommst du eben um eine eigene Klasse nicht herum.

Dann musst du eben direkt mit den Instanzen einer Klasse arbeiten.
Anders könnte man diesen Fall nicht abdecken.
Dein C++ Beispiel wird hier eben wegen dem verwaltetem Code nicht viel helfen.
Dort sind Zeiger nicht erlaubt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

ob man nun wirklich mit "/unsafe" arbeiten möchte sei mal dahingestellt - aber möglich ist das durchaus...

static unsafe void Test()
        {
            int a = 0;
            int *b = &a;

            a = 1;
            
            Console.WriteLine("a = {0}", a); // a = 1
            Console.WriteLine("b = {0}", *b); // b = 1
            Console.ReadLine();
        }

LG

S
145 Beiträge seit 2013
vor 8 Jahren

Meistens wird ja der ValueType in einer extra Methode entsprechend angepasst
und da reicht ja die einfache ref Angabe im Parameter

wisher78 Themenstarter:in
101 Beiträge seit 2011
vor 8 Jahren

Habe es mit einer Mini-Klasse gelöst. Enthält eben nur ein Member.
Danke, für die Vorschläge.