Allgemeine Frage zur C#-Programmstruktur

Status
Nicht offen für weitere Antworten.

the-cR

Mitglied
Hallo,

ich habe gerade neu mit C# angefangen (wie so viele ;) ) und schreibe eine Konsolenapplikation.

Mir ist aufgefallen, daß der Compiler ständig statisch deklarierte vars und methoden verlangt, beispiel:

Code:
namespace ConsoleApplication2
{
	class Class1
	{
		static int bla = 1;

		[STAThread]
		static void Main(string[] args)
		{
			Console.WriteLine(bla);
			Console.Read();
		}
	}
}

Man sieht, daß die var "bla" als statisch deklariert ist. So verhält es sich auch mit allen anderen (ausser natürlich variablen die innerhalb von methoden/funktionen deklariert wurden) variablen und funktionen/methoden.

Programmiere ich da gerade schrott, oder fehlt mir irgendwo das verständnis? Es kann doch nicht sein, daß alles mit "static" deklariert werden muss... selbst funktionen erwartet mein Compiler als z.b. "private static void blub() {...}".

Sollte ich einfach so weiter machen, oder gibts ne bessere Art und Weise? Wäre dankbar wenn da jemand Licht ins Dunkel bringen würde :-)

Danke
 
Ich nehm mal an, man hat da von Java geklaut.
Dort hat static nämlich nichts mit dem c/c++ Gegenstück zu tun sondern sagt nur, dass die Variable für alle Instanzen einer Klasse gültig ist. Die Klasse, die den Einsprungpunkt für das Programm enthält, muss static sein, weil ja keine Instanzen gebildet werden können bevor das Programm gestartet wird.


Das c/c++ static würde den final heissen :)
(ohne Gewähr, nur ein paar Gedanken dazu...)
 
Ja, was static bedeutet ist mir klar, ich frage mich halt nur, warum es bei _allen_ deklarationen sein muss... Als Eintrittspunkt ist es für mich verständlich, aber die ganzen anderen statics... hmmm.

Vielleicht hat hier ja schon jemand ein etwas größeres Projekt in C# aufgebaut und kann helfen :-)
 
Das die Main Funktion static sein muss ist klar ;)
Sie ist der Haupteintrittspunkt in deine aplikation.

Bei C# ist diese Funktion auch in einer Classe vorhanden da C# zur OOP drängt.

Wenn du in C# codest musst du dich an OOP halten das heisst :

Code:
class Class1
{
 static int bla = 1;
 [STAThread]
  static void Main(string[] args)
 {
   Console.WriteLine(bla);
   Console.Read();
 }
}

Ist insofern falsch das du die Klasse Class1 nicht instanziert hast und somit noch keine Variable bla existiert :-)
Denn klassen sind nur Baupläne der Objekte und nicht existent.
Die ausnahme sind Statische Variablen bzw Methoden. Diese sind der Klasse zugehörig und nicht einem konkretem objekt.

Richtig währe demnach:
Code:
class Class1
{
 class MyClass
 { 
  public int bla = 1;
  [STAThread]
  
 }
 static void Main(string[] args)
 {
   MyClass myobj = new MyClass();
   Console.WriteLine(myobj.bla);
   Console.Read();
 }
}

Da ich davon ausgehe das du C# erst lernst und von OOP noch nicht viel gelernt hast halte dich bitte einfach an volgende Punkte :

Nutze nur Variablen die in der Statischen Mehtode main Deklariert worden sind.

Bitte fang nicht gleich mit Codeschnippsel an die du noch nicht verstehen kannst am anfang sondern geh dein Buch von vorne her an.
 
Danke für die Umfassende Antwort, jedoch habe ich einige Ahnung von OOP, was Klassen angeht, was Vererbung, Instanzen, Interfaces usw.. bedeuten (was Du natürlich nicht wissen kannst ;) )

Die Frage ist eher allgemein gehalten, wie man bei größeren Projekten halt vorgeht. Ich habe beispielsweise ein Programm eher Prozedural aufgebaut, weil es sich im Grunde nicht "lohnte" eine Klasse aufzubauen. Mir fiehl dann eben auf, daß ich ständig dabei war, statische variablen und methoden zu erstellen, und mir kam es irgendwie 'merkwürdig' vor ;-)

Naja, wahrscheinlich weiß ich selbst nicht genau, was ich will *gg* Ich muss mich sicherlich noch anb diese typische Dauer - OOP - Situation von C# gewöhnen.

Mal ne andere Frage (von der ich diesmal keine Ahnung habe ;) ): Wie verhält es sich mit großen Projekten, bindet man sie verschiedenen Teile auch besser mit include ein, oder reicht es z.b. in einer seperaten datei eine Klasse zu bauen mit einem Namespace, und diesen Namespace im Hauptprogramm dann mit "using" zu benutzen?
 
Original geschrieben von the-cR
Danke für die Umfassende Antwort, jedoch habe ich einige Ahnung von OOP, was Klassen angeht, was Vererbung, Instanzen, Interfaces usw.. bedeuten (was Du natürlich nicht wissen kannst ;) )

Sorry dann kann ich nicht verstehen das du den fehler nicht siehst.

Du versuchst auf nicht statische Membervariablen aus einer Statischen Methode zuzugreifen und wunderst dich das dies nicht funktioniert.
Ich würde das thema noch etwas vertiefen ist nicht bös gemeint aber das ist etwas das zu OOP Grundlagen gehört.

Zu deiner 2. Frage:
Das kommt jenach deiner OOA OOD an welche vorgehensweise, welches Projekt.
Schau dir am besten mal Design Muster an eines ähnlichen Projektes an.
Das wie die Files eingebunden werden wie namespaces aufgeteilt werden usw
ist nicht so einfach pauschalisierbar und richtet sich nach den anforderrungen
 
Aber mein Code mit den statisches vars funktioniert doch, meine Frage war nicht "wieso funktioniert das nicht" - mein geposteter code geht ja :-)

Ich hab mir nur gewundert, ob es denn so richtig ist, das ich irgendwie alles statisch mache... naja vielleicht habe ich mich ja auch nur etwas schlecht ausgedrückt... sorry :)
 
Ich legs dir dennoch ans herz mal das betreffende Kapitel über Statische Elemente zu lesen.
Denn einfach alles Statisch machen ist nicht wirklich eine lösung :rolleyes:
aber wie gesagt ist nur ein tip :)
 
Ja da hast Du wohl recht. Aber ist schon krass wie C# einen zur OOP zwingt; bietet sicher Vor- aber auch Nachteile.
 
Status
Nicht offen für weitere Antworten.

Neue Beiträge

Zurück