C#: Die Sache mit dem Ctor

In meiner SQLite Datenbank-Klasse hatte ich bis jetzt die Möglichkeit den Connectionstring der DB im Konstruktor mit zu übergeben.
damit konnte ich ein SQLite Objekt wie folgt erstellen:

1
DB.sqlite sqlite = new DB.sqlite("Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "\\database.db3;Version=3;New=false;Compress=false;");

Aus Bequemlichkeitsgründen wollte ich nun einen überladenen Konstruktor einbauen, der genau dieses auch tut, wenn ich KEINEN Connectionstring angegeben habe. Damit wäre selbiges wie oben Möglich, da ich die Einstellungen meist gleich habe, meine Datenbank immer „database.db3“ heißt und im Programmverzeichnis liegt:

1
DB.sqlite sqlite = new DB.sqlite();

Das Ganze sollte dann nach Möglichkeit so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace DB
{
	public class sqlite
	{
 
		public SQLiteConnection sql_conn;
		private string ConnectionString;
 
		public sqlite()
		{
			sqlite("Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "\\database.db3;Version=3;New=false;Compress=false;");
		}
 
		public sqlite(string Connectionstring)
		{
			sql_conn = new SQLiteConnection(Connectionstring);
			this.ConnectionString = Connectionstring;
		}
	}
}

Das dumme an der Sache ist nur – es funktioniert nicht!
Ja – man kann zwar einen Konstruktor Überladen – aber in einem keinen anderen aufrufen.

Aber wie soll man dieses Problem denn dann lösen?
Nun – wie immer bei allen Dingen im Leben gibt es auch hier mehrere Lösungs-Ansätze.

1. Lösung: Man ruft durch die Konstruktoren eine Methode auf, welche die Funktionalität abbildet.

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
namespace DB
{
	public class sqlite
	{
 
		public SQLiteConnection sql_conn;
		private string ConnectionString;
 
		public sqlite()
		{
			sqlite_init("Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "\\database.db3;Version=3;New=false;Compress=false;");
		}
 
		public sqlite(string Connectionstring)
		{
			sqlite_init(Connectionstring);
		}
 
		private void sqlite_init(string Connectionstring)
		{
			sql_conn = new SQLiteConnection(Connectionstring);
			this.ConnectionString = Connectionstring;
		}
	}
}

2. Lösung: Man baut ein Konstrukt, welches wie folgt aussieht:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace DB
{
	public class sqlite
	{
 
		public SQLiteConnection sql_conn;
		private string ConnectionString;
 
		public sqlite()
			: this("Data Source=" + System.AppDomain.CurrentDomain.BaseDirectory + "\\database.db3;Version=3;New=false;Compress=false;")
		{
			// Bevor der Inhalt in den geschweiften Klammern ausgeführt wird, wird der Ctor mit Parmaeter aufgerufen.
			// Nach dem Ctor wird dann dieser Inhalt hier abgearbeitet.
		}
 
		public sqlite(string Connectionstring)
		{
			sql_conn = new SQLiteConnection(Connectionstring);
			this.ConnectionString = Connectionstring;
		}
	}
}

Leider kann ich zu letzterem nicht viel erklären, da ich selbst noch nicht weiß wer dieses Konstrukt erfunden hat und warum es funktioniert.
Aber wenn das einer Liest, der etwas Ahnung davon hat – wir freuen uns alle über eine kleine Erklärung 🙂

One Response to C#: Die Sache mit dem Ctor

  1.  

leave your comment


*

Unterstütze den Frickelblog!