Autor Beitrag
RBS2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 18.05.10 10:59 
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):

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


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

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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.

Gruß
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 18.05.10 11:15 
danke, wieder etwas dazugelernt ;)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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: .

_________________
>λ=