[C#] Variable aus Datei in Klasse einlesen

02/25/2014 20:22 €clips3#1
Hallo,
vorgegeben habe ich folgenden Code:


Dieser öffnet mir die Datei "filename" aus dem Programmordner und liest daraus Beispielsweise
Code:
#ignore
x=1
y=2
myValue = 1 aus mithilfe
Code:
string myValue = config["x"];
So...
Jetzt habe ich das ganze als Klasse benutzt um es in mehreren Projekten Dynamisch zu benutzen.
Ebenso möchte ich eine Zweite Klasse anlegen

Jetzt möchte ich, dass er aus Klasse Config.cs die Variable myValue da einsetzt "localhost" steht

Code:
server = "localhost";
steht

Könnte mir jemand erklären wie das genau klappt?
02/25/2014 21:07 Mostey#2
Quote:
Originally Posted by €clips3 View Post
Jetzt möchte ich, dass er aus Klasse Config.cs die Variable myValue da einsetzt "localhost" steht

Code:
server = "localhost";
steht
Was?

Du möchtest eine Datei auslesen in der also die Zeile "server = localhost" vorkommt und diese in die Variable für deine Datenbank Klasse schieben?

Code:
somevar = config["server"];
Wenn man das mit deiner Klasse macht - wo ist das Problem?
02/25/2014 21:08 MrSm!th#3
Ist das dein Ernst? Füg dafür dem Konstruktor nen Parameter hinzu und übergib ihm config["server"] bei der Erzeugung eines MySql Objekts.
02/25/2014 21:08 €clips3#4
Quote:
Originally Posted by Mostey View Post
Was?

Du möchtest eine Datei auslesen in der also die Zeile "server = localhost" vorkommt und diese in die Variable für deine Datenbank Klasse schieben?

Code:
somevar = config["server"];
Wenn man das mit deiner Klasse macht - wo ist das Problem?
Das ich angezeigt bekomme das "config" nicht gefunden wurde.
Ich möchte aus der Datei wo
Code:
server = localhost
steht in der MySql Klasse den Wert "localhost" einsetzen.

Sprich Klasse 1 Läd Config, Klasse 2 benötigt zugriff auf die Config, was mir jedoch den fehler rauswirft.
02/25/2014 21:11 Mostey#5
Config wurde bei der Definition groß geschrieben, kein Wunder das er da nichts findet. Du musst die Klasse schon richtig nutzen - ich habe lediglich dein Beispiel verwendet.

Und der Namespace spielt natürlich auch ne Rolle sofern es sich in der benutzten Funktion nicht um den selben handelt.
02/25/2014 21:15 €clips3#6
Quote:
Originally Posted by Mostey View Post
Config wurde bei der Definition groß geschrieben, kein Wunder das er da nichts findet. Du musst die Klasse schon richtig nutzen - ich habe lediglich dein Beispiel verwendet.

Und der Namespace spielt natürlich auch ne Rolle sofern es sich in der benutzten Funktion nicht um den selben handelt.
Selber Namespace ist es.
Nein, ist schon richtig so.
Schau nochmal genau.
"Config" nennt sich die Klasse selbst.
"config" ist der/die/das was weiß ich... Dictionary.

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    class Config
    {
        Dictionary<string, string> config = new Dictionary<string, string>();
        public void Load(string filename)
        {
            //1) First read the file line by line:
            System.IO.StreamReader sr = new System.IO.StreamReader(filename);
            string line = "";
            while ((line = sr.ReadLine()) != null)
            {
                //2) Ignore lines that start with #
                if (line[0] == '#') continue;

                //3) Split the lines  by = into key and value
                string[] blocks = line.Split('=');
                if (blocks.Length > 1)
                {
                    //4) Trim the key by all spaces ( optional for value)
                    blocks[0] = blocks[0].Trim();
                    //5) Store the value in a dictionary(or a list, but a dictionary has a lot options)
                    config.Add(blocks[0], blocks[1]);
                }
                
                
            }
            sr.Close();
        }
    }
}
Ich möchte jetzt über "config" aus Klasse "Config" in Klasse "MySql" einen Parameter aus der Datei auslesen.
Was mithilfe string myValue = config["x"];

100% funktionieren sollte, jedoch habe ich keinen Plan wie ich dies in Klasse "MySql" definiere.
02/25/2014 21:19 Mostey#7
Behinderte Namensgebung.

Der Zugriff würde (ohne Namespace) via Config.config erfolgen, da hier aber weder public noch private angegeben wurde, hast du keinen Zugriff auf die Variable weil sie automatisch private ist.
02/25/2014 21:21 €clips3#8
Quote:
Originally Posted by Mostey View Post
Behinderte Namensgebung.

Der Zugriff würde (ohne Namespace) via Config.config erfolgen, da hier aber weder public noch private angegeben wurde, hast du keinen Zugriff auf die Variable weil sie automatisch private ist.
Mag sein, das es nicht grad schlau ist, aber dafür lernt man ja um fehler zu machen ;)
Ich probiers einfach mal.
Danke
02/25/2014 21:30 Mostey#9
Quote:
Originally Posted by €clips3 View Post
Mag sein, das es nicht grad schlau ist, aber dafür lernt man ja um fehler zu machen ;)
Ich probiers einfach mal.
Danke
Seit wann lernt man um Fehler zu machen? :confused:

Ich hätte die Klasse vermutlich auch Config genannt und hätte ein Handle zum File in einer Variable _hFile und die Einträge in einer Variable _Records gespeichert - unabhängig vom Datentyp weiß man so nämlich direkt, was gemeint ist.

Mittels Methoden sehen Zugriffe übrigens wesentlich schöner (und sauberer aus)

Code:
Config settings = new Config("somefile.txt");
somevar = settings.Read("key");
02/26/2014 07:58 MrSm!th#10
Quote:
Originally Posted by MrSm!th View Post
Ist das dein Ernst? Füg dafür dem Konstruktor nen Parameter hinzu und übergib ihm config["server"] bei der Erzeugung eines MySql Objekts.
Dies

Quote:
Originally Posted by €clips3 View Post
Mag sein, das es nicht grad schlau ist, aber dafür lernt man ja um fehler zu machen ;)
Ich probiers einfach mal.
Danke
Lass es sein. Es hat einen Grund, warum die Variable implizit private ist. Datenkapselung nennt sich das.

Und ohne ein Objekt der Klasse Config kannst du sowieso nichts mit den Daten machen, weil sie gar nicht da sind.

Wie sieht dein Code drumherum aus? Wie nutzt du die Klassen?

Quote:
Originally Posted by Mostey View Post
Seit wann lernt man um Fehler zu machen? :confused:

Ich hätte die Klasse vermutlich auch Config genannt und hätte ein Handle zum File in einer Variable _hFile und die Einträge in einer Variable _Records gespeichert - unabhängig vom Datentyp weiß man so nämlich direkt, was gemeint ist.

Mittels Methoden sehen Zugriffe übrigens wesentlich schöner (und sauberer aus)

Code:
Config settings = new Config("somefile.txt");
somevar = settings.Read("key");
Dass ein Objekt genau so heißt wie eine Klasse ist durchaus legitim. Allerdings würde man gemäß der Konvention hinter config eher ein Config Objekt erwarten und kein Dictionary innerhalb der Config.

Das schönste für eine Config Klasse wäre wohl das Überladen des Indexoperators, um sie wie ein Dictionary verwenden zu können. Alternativ Properties. Methoden würde ich da nicht verwenden.
02/27/2014 01:00 €clips3#11
Quote:
Originally Posted by MrSm!th View Post
Dies



Lass es sein. Es hat einen Grund, warum die Variable implizit private ist. Datenkapselung nennt sich das.

Und ohne ein Objekt der Klasse Config kannst du sowieso nichts mit den Daten machen, weil sie gar nicht da sind.

Wie sieht dein Code drumherum aus? Wie nutzt du die Klassen?



Dass ein Objekt genau so heißt wie eine Klasse ist durchaus legitim. Allerdings würde man gemäß der Konvention hinter config eher ein Config Objekt erwarten und kein Dictionary innerhalb der Config.

Das schönste für eine Config Klasse wäre wohl das Überladen des Indexoperators, um sie wie ein Dictionary verwenden zu können. Alternativ Properties. Methoden würde ich da nicht verwenden.
Ich war gestern abend echt total durch den Wind. Mir ist heute morgen mal aufgefallen was ich da überhaupt für nen Blödsinn geschrieben habe.

Ich stelle die Tage mal den jetzigen Code rein.
Habe das jetzt 1) viel schöner gelöst. 2) die Config wird nur 1x geladen wie es eig auch sein sollte.
02/27/2014 19:44 x]vIrus[x#12
falls das noch keiner gemacht hat...
hier ist beschrieben wie man in c# settings macht, richtig: [Only registered and activated users can see links. Click Here To Register...]
02/28/2014 10:13 Popicker#13
Je nach Umfang der Konfigurationsklasse kann man durchaus darüber nachdenken Serialisierung zu verwenden. ( [Only registered and activated users can see links. Click Here To Register...] )

Es ist auch nicht zu empfehlen Konfigurationen in einem Dictionary zu speichern oder zumindest alle Konfigurationsindizies als Konstante vorhalten. Es arbeitet sich einfacher statt config["server"] config.Server zu schrieben. Wenn du von deinem Dictionary nicht abstand nehmen möchtest ( bspw. weil es schon implementiert ist ) kannst du auch Properties nutzen. Beispielsweise

public string Server
{
get { return configDictionary["server"]; }
}

LG
02/28/2014 10:52 MrSm!th#14
Quote:
Originally Posted by x]vIrus[x View Post
falls das noch keiner gemacht hat...
hier ist beschrieben wie man in c# settings macht, richtig: [Only registered and activated users can see links. Click Here To Register...]
Meh, die Standardlösung is nicht so bombe.