C# Frage zu Referenz/Adressoperator

Conners

Erfahrenes Mitglied
Hi
Ich hab heute angefangen das Galileo Computing Tutorial von C# durchzuarbeiten und hänge grad am Referenzoperator fest.

2 Fragen.

1.
Gibt es einen Unterschied zwischen Referenz- und Adressoperator ?

2.
In C++ konnte ich, wenn ich z.B. einen Integer durch eine Funktion dauerhaft ändern wollte einfach die Referenz des Integers übergeben und als Zeiger darauf bearbeiten. Geht das in C# nicht mehr?

Da stand im Beispiel was von ref oder so, aber ich krieg nur Fehler, egal bei welcher Methode.

Unten beide meine Beispiele: Beide klappen nicht.

Ich hab schon alle Kombinationen probiert, da kommt irgendwie immer n Fehler mit:
Pointers may only be used in an unsafe context

Was mach ich verkehrt?


Code:
...
public void Init() 
    {
      int intVar = 3;
      Console.WriteLine("intVar vorher = {0}", intVar);
      TestProc(& intVar);
      Console.WriteLine("intVar nachher = {0}", intVar);
      Console.ReadLine();
    }
    public void TestProc( int *intPara) 
    {
      *intPara = 550;
      Console.WriteLine("intPara in TestProc = {0}", *intPara);
    }
...

Code:
...
public void Init() 
    {
      int intVar = 3;
      Console.WriteLine("intVar vorher = {0}", intVar);
      TestProc(ref intVar);
      Console.WriteLine("intVar nachher = {0}", intVar);
      Console.ReadLine();
    }
    public void TestProc( int *intPara) 
    {
      *intPara = 550;
      Console.WriteLine("intPara in TestProc = {0}", *intPara);
    }
...
 
So funktioniert das:

Code:
        static void ZahlAendern(ref int zahl)
        {
            zahl += 2;
        }

        static void Main(string[] args)
        {
            int zahl = 1;

            Console.WriteLine("Zahl vorher: {0}", zahl);

            ZahlAendern(ref zahl);

            Console.WriteLine("Zahl nachher: {0}", zahl);
        }

"*" und "&" gibts nicht mehr, nur "ref" und "out".

http://msdn.microsoft.com/de-de/library/14akc2c7(VS.80).aspx
http://msdn.microsoft.com/de-de/library/t3c3bfhx(VS.80).aspx

Beim einen muss das Argument initialisiert werden vor der Übergabe, beim anderen nicht.
 
Zuletzt bearbeitet:
Bei Objekten die als Klasse (class) definiert sind brauchst du diesen Operator übrigens nicht. Diese werden von Haus aus als Referenz übergeben. ;)
 
Bei Objekten die als Klasse (class) definiert sind brauchst du diesen Operator übrigens nicht. Diese werden von Haus aus als Referenz übergeben. ;)
Dazu will ich noch was anmerken:
Das Objekt selbst wird (ohne Verwendung von "ref") nicht als Referenz übergeben. Nur die vom Objekt verwendeten Daten verweisen auf die dieselben Speicherbereiche, wie das Ursprungsobjekt.
Das bedeutet, dass man das Objekt selbst ohne Auswirkungen auf das Ursprungsobjekt ändern kann (z.B. gleich "null" setzen) allerdings werden Änderungen an den Objektdaten gleichzeitig auch im Ursprungsobjekt ausgeführt.

Gruß
MCoder
 
"*" und "&" gibts nicht mehr, nur "ref" und "out".

Das ist so nicht ganz richtig, es gibt "*" und "&" sehr wohl noch, aber nur im unsafe-Mode.

Du kannst zB eine Klasse sehr wohl so definieren:

Code:
unsafe class Test
{
	public void ChangeNumber(int* intZahl)
	{
		*intZahl = *intZahl + 2;
	}
}
 

Neue Beiträge

Zurück