Entwickler-Ecke

Basistechnologien - Referenzzuordnung in C#


RBS2002 - Di 18.05.10 10:59
Titel: Referenzzuordnung in C#
Hi,

ich habe ein Problem das ich absolut nicht nachvollziehen kann. Ich rufe mit folgendem Befehl eine Funktion auf und gebe dieser das lokale Objekt mit (hier == null):


C#-Quelltext
1:
2:
MySqlConnection connection = null;
   if (Verbindung(connection))


Die Funktion sieht wie folgt aus (eher uninteressant, aber hier wird das Objekt deklariert)


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:
32:
33:
34:
private Boolean Verbindung(MySqlConnection connection)
        {
            if (connection == null)
            {
                if (_datenbank != null)
                {
                    connection = new MySqlConnection("SERVER=" + _datenbank.Server + ";" +
                                                     "PORT=" + _datenbank.Port + ";" +
                                                     "DATABASE=" + _datenbank.Name + ";" +
                                                     "UID=" + _datenbank.Benutzername + ";" +
                                                     "PASSWORD=" + _datenbank.Password + ";");
                    try
                    {
                        if(connection == null)
                        {
                            MessageBox.Show("Connection ist bei Erstellung null");
                        }
                        connection.Open();
                        return true;
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.StackTrace);
                        return false;
                    }
                }
                else
                {
                    MessageBox.Show("Datenbank ist null");
                    return false;
                }
            }
            return false;
        }


Wenn ich beim Quellcode dieses erstellte connect aufrufen will bekomme ich eine Null Exception, aber nicht die bei der Erstellung sondern nachdem das Objekt aufgerufen wurde - theoretisch würde ich erwarten das C# die Adresse überträgt, das Objekt erstellt und diesem Objekt zuweist - sodass ich es auch, so lange es gültig ist, wieder verwenden. Oder habe ich da einen Denkfehler? Im Prinzip müsste ich das ganze nun so machen das ich die erstellte, übergebene Variable zurückgebe. Soweit kein Problem (muss man nur den Quellcode etwas umschreiben :D). Aber wie gesagt, von meinem Verständniss aus dürfte der Garbage Collector diese noch nicht entfernen da ich sie in einer anderen, noch laufenden Funktion, verwende...


danielf - Di 18.05.10 11:08

Hallo,

das hat nichts mit dem GC zu tun, sondern das der Verweis nicht auf das übergebene Objekt zugeordnet wird. Wenn du einen Parameter als Verweis übergeben willst benötigst du das out Schlüsselwort [http://msdn.microsoft.com/de-de/library/t3c3bfhx%28VS.80%29.aspx].

Gruß


RBS2002 - Di 18.05.10 11:15

danke, wieder etwas dazugelernt ;)


Kha - Di 18.05.10 13:51

Wobei es hier einfacher wäre, die Connection direkt im Rückgabewert und bei einem Fehler null zurückzugeben. Und "Connection ist bei Erstellung null" wage ich zu bezweifeln :zwinker: .