Autor Beitrag
miniC#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Do 05.02.09 12:31 
Hallo,

ich habe mal wieder ein sehr grundlegendes Problem. Ich habe ein Programm mit einer einfachen Nodestruktur, welche jeweils einen Wert enthält, der auf einen anderen Node zeigt. Der Node auf welchen gezeigt wird, soll verändert werden können. Ich habe dies jetzt einfach mit meinem guten alten Freund ref gelöst. Ist dies die richige Herangehensweise für mein Problem oder muss ich mich da in für mich kryptische Themen wie Pointer oder Delegaten einlesen ? Irgendwie erscheint mir die Lösung sehr unsauber ;)

so schaut der code grob aus (leider grad net daheim und kein zugriff auf den orginaltext) :

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
    public abstract class EffectorNode
    {
        internal List<EffectorNode> subnodes;
        internal EffectorNode pointonnode;
    }

    public class myEffector : EffectorNode 
    {
        public myEffector(ref EffectorNode Target, List<EffectorNode> Subnodes)
        {
            subnodes = Subnodes;
            pointonnode = Target;
        }
    }


edith sagt : die bäumen können recht groß werden ;) bis zu 1000 nodes sind keine ausnahme ;)

_________________
Zitat MDSN : " ... C# (gesprochen: "si scharp") " :D


Zuletzt bearbeitet von miniC# am Do 05.02.09 12:36, insgesamt 1-mal bearbeitet
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Do 05.02.09 12:36 
Wenn es sich um eine Objekttypen handelt die übergeben wird wird in C# standardmäßig nur die reference übergeben und somit ist ref meist überflüssig (außnahme: wenn es sich um Werttypen handelt).


edit:
Ok hab ich vielleicht etwas falsch ausgedrückt.

Bei Objekttypen:
- ohne ref -> man arbeitet direkt mit dem Objekt
man kann z.b. Properties des Objekts verändern usw aber wenn man das Objekt ersetzt wird das außerhalb nicht mit ersetzt (reicht in dem von MiniC# beschriebenen Fall aus)
- mit ref -> man arbeitet mit der Adresse des Objekts
quasi das gleiche wie oben nur das man auch das objekt an sich ersetzen kann


Zuletzt bearbeitet von bakachan am Do 05.02.09 14:48, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 05.02.09 14:31 
Überflüssig ist ref auch bei Referenzdatentypen nicht. Beispiel:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
    class Test
    {
        public string Text { get; set; }
    }

    class Program
    {
        static void OhneRef(Test test)
        {
            test = new Test();
            test.Text = "foo";
        }

        static void MitRef(ref Test test)
        {
            test = new Test();
            test.Text = "foo";
        }

        static void Main(string[] args)
        {
            Test test = new Test();
            test.Text = "bar";
            Console.WriteLine(test.Text);
            OhneRef(test);
            Console.WriteLine(test.Text);
            MitRef(ref test);
            Console.WriteLine(test.Text);
            Console.ReadKey();
        }
    }


Ausgabe:
ausblenden Quelltext
1:
2:
3:
bar
bar
foo

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 05.02.09 19:05 
Zur Erklärung der Phänomene:
Werttypen wie in int, double usw werden direkt auf dem Stack gespeichert und die Variable enthält den Wert. Variablen auf Objekttypen jedoch enthalten einen Verweis auf die Daten im Heap. Und der Inhalt der Variable wird im Standard übergeben. D.h. bei Werttypen arbeitest Du mit einer Kopie des Wertes (neues Element auf dem Stack) und bei Verweistypen arbeitest Du mit einer Kopie des Verweises (auch wieder auf dem Stack. Bei Übergabe mit ref wird mit der Variablen selbst gearbeitet.

So lässt sich einerseits erklären, warum normal übergebene Objekte auch ohne ref geändert werden können. Aber auch, warum Christians Beispiel nur mit ref funktioniert: In der Methode wird ein neues Objekt erstellt und der Verweis in dem übergebenen Parameter gespeichert. Ohne ref kriegt das natürlich die ursprüngliche Variable nicht mit (sie wird ja nicht geändert) und zeigt auf den alten Bereich auf dem Heap, mit ref wird diese Variable auf dem Stack jedoch geändert und zeigt auf das neue Objekt auf dem Heap.

Mit ner Zeichnung ist das anschaulicher, aber ich hoffe, es ist einigermaßen verständlich erklärt und hilft Dir weiter.