C# Paar wichtige Fragen

Gary12345

Ensign
Registriert
Sep. 2012
Beiträge
246
Hallo,

1.

[...] Hier sei es nur kurz angemerkt, das Klassen Typen darstellen, die aus [...]

Aber meine spezielle Frage dazu: Was genau sind Typen. Sind das Variablen, Methoden, Felder, etc.? Ist ein Typ ein Datentyp, wie zum Beispiel int, double, string ,etc. ? Oder beschreibt ein Typ die Klasse näher?

2.

[...]Wenn Main() mit dem Rückgabewert int deklariert wird, muss sie mit einer return-Anweisung abschließen, die eine Ganzzahl zurückliefert.[...]

Dazu noch ein kleines Codebeispiel:

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

namespace ConsoleApplication1
{
    class Program
    {
        static int Main()
        {
            //...
            return 0;
        }
    }
}

1. Was kann ich genau unter Rückgabewert verstehen? Liefert es eine Zahl zurück? Wozu denn das?
2. Warum muss man eine return Anweisung anwenden? Was bedeuted genau, dass es eine Ganzzahl zurückliefert?
3. Was ist der Zusammenhang zwischen Batch-Datein und der Konsolenanwendung? Batch-Datein ruft doch die Konsole auf, um darauf diese Batch-Befehle ausführen zu können?

3.

[...]Gibt es obligatorische Befehlszeilenargumente prüft die Anwendung in der Regel als Erstes, ob die korrekte (Mindest-)Zahl Argumente übergeben worden wurde. [...]
1. Wozu wird das geprüft? Warum wird denn das geprüft?
2. Was sind obligatorische Befehlszeilenargumente?

4.

Methoden:


Sind praktisch gleichzusetzen mit Befehle, oder verstehe ich das falsch?

5.

Kleines Codeschnipsel:
Code:
try
{
    Console.WriteLine("Geben Sie Ihr Alter ein: ");
    string input = Console.ReadLine();
    age = Convert.ToInt(input);
}
catch(FormatException)
{
   Console.WriteLine("Die Eingabe hatte kein gültiges Zahlenformat");
   Environment.Exit(0);
}

1. Das wird nur gemacht, um grobe Fehler zu vermeiden : Das heißt , wenn ich einen String eingebe (also Text, statt eine Zahl), zeigt es das an: "Die Eingabe hatte kein gültiges Zahlenformat"? Wenn das nicht gemacht wird, würde das Programm abstürzen?
2. Aber was ist genau FormatException?
 
Zuletzt bearbeitet:
1. In C# ist jede Variable ein Typ.
Es gibt dann Referenztypen (Referenzen auf Objekte - Sprich Instanzen der Klasse), und primitive Datentypen (int, float, double,...)

2.1. Rückgabewerte können nicht nur bei Main eingesetzt werden, sondern bei jeder beliebigen Methode.
Methoden sind Schnittstellen. Alles was in der Methode passiert, soll von außen nicht sichtbar sein. Aber es soll auch etwas berechnet werden oder geschehen.
Es kann also hier ein Rückgabewert zurückgegeben werden, der die interne Berechnung wiederspiegelt. Oder es ist auch möglich (Wie bei main), dass zurückgegeben wird, ob die Methode erfolgreich ausgeführt wurde (0 heißt korrekt termininiert. Alles andere heißt Fehler)

2.2. return beendet die Methode. Es ist eben das Schlüsseltwort zum zurückgeben von Daten.
Eine Ganzzahl musst du angeben, weil du in der Methodensignatur von Main den Rückgabewert als int spezifiziert hast.

2.3. Batch-Dateien sind Windows-Skripts. Damit kannst du in einer .cmd Datei angeben, was die Konsole machen soll.
Konsolenanwendungen sind Programme, die in einer Programmiersprache geschrieben sind (z.B: C#) und die Konsole für Eingabe/Ausgabe verwenden.

3.1. Es wird überprüft, um sicherzustellen, dass das Programm korrekt ausgeführt werden kann.
3.2 Obligatorische Befehlszeilenargumente sind Argumente beim Aufruf des Programms, die unbedingt vorhanden sein müssen.
Bsp: Mein Programm myprog muss entwedet mit dem Parameter -c oder -k aufgerufen werden, um zu starten.
Dann wäre ein Aufruf von ./myprog.exe -c in Ordnung
Ein Aufruf von ./myprog.exe hingegen aber nicht, da die obligatorischen Befehlszeilenargumente nicht eingehalten wurden.

4. Methoden sind Teile von Klassen. Eine Methode ist nicht ein atomarer Befehl, sondern eine Reihe von Anweisungen, die zusammengekapselt sind.

5. Wenn du die Basics kannst, würd ich mich auf Exceptions stürzen.
In dem Fall ist die Exception da, falls deine Konvertierung fehlschlägt.
Eine Exception ist ein Objekt, das anzeigt, dass etwas fehlgeschlagen ist.
Diese Objekte können geworfen und gefangen werden.
Falls sie nicht gefangen werden stürzt das Programm ab, ansonsten kann das Programm mit einer Fehlerbehandlung fortgesetzt werden..

Ich hoffe, dass ich dir helfen konnte.
LG Alfadas
 
1. Typ = Datentyp, ja.
2. Eine Zahl wird zurückgeliefert weil das praktisch alle Betriebssysteme seit ca. 30 Jahren mindestens so tun. Von der zweiten MSDOS Version an mindestens. POSIX kompatible OSes sowieso.
3. Es wird als erstes geprüft weil, wenn diese obligatorischen Dinge fehlen, es nutzlos wäre weiterzumachen. Sie also zuerst zu prüfen ist gute Programmierung.
4. Das kommt drauf an was du als "Befehl" interpretierst. Ich kenne keine "Befehle" in C#. Ich kenne keywords, Funktionen, Klassen, etc. Keine Befehle.
5. Es wird nicht nur für grobe Fehler benutzt, es wird für (fast) alle Fehler benutzt. Es würde nicht unbedingt abstürzen, sondern schlimmer: mit falschen, falsch interpretierten Daten weiterrechnen. Zu Formatexception im speziellen: http://msdn.microsoft.com/en-us/library/system.formatexception.aspx
 
Gary12345 schrieb:
2.
Dazu noch ein kleines Codebeispiel:
[...]

1. Was kann ich genau unter Rückgabewert verstehen? Liefert es eine Zahl zurück? Wozu denn das?
2. Warum muss man eine return Anweisung anwenden? Was bedeuted genau, dass es eine Ganzzahl zurückliefert?
Du definierst die Funktion static int Main. Das "int" bedeutet, dass diese Funktion einen Integerwert zurückgibt. return 0 gibt "0" zurück und 0 ist ein Integer.
Die Kombination "int main"+"return 0" ist eine Konvention die besagt "Wenn die Main-Funktion 0 zurückgibt ist das Programm fertig durchgelaufen". "int main"+"return 0" wird dich dein ganzes Programmierleben lang begleiten.

Aber du wirst auch viele andere Funktionen schreiben:
"void Funktion" zum Beispiel. Void bedeutet, dass die Funktion nichts zurückgibt. In so einer Funktion hat ein "return" deshalb nichts verloren.
"double Funktion" bedeutet, dass über return ein double zurückgegeben wird. Das muss nicht "return 0.0" oder "return 5.332" sein sondern kann auch "return a" sein, wenn a eine double-Variable ist.

Einfach nur merken: Wenn du bei einer Funktion einen Rückgabeparameter deklarierst muss die Funktion auch einen solchen Parameter per return zurückgeben.
 
Raybeez schrieb:
"void Funktion" zum Beispiel. Void bedeutet, dass die Funktion nichts zurückgibt. In so einer Funktion hat ein "return" deshalb nichts verloren.

Ein return mit Rückgabewert hat da nichts verloren, ein return an sich ist aber natürlich völlig in Ordnung.
 
Gary12345 schrieb:
Was genau sind Typen. Sind das Variablen, Methoden, Felder, etc.? Ist ein Typ ein Datentyp, wie zum Beispiel int, double, string ,etc. ? Oder beschreibt ein Typ die Klasse näher?

http://en.wikipedia.org/wiki/Typeof

Typ ist im Fall von C# einfach die Klasse. Im Fall von Java wäre das anders, da in Java nicht alle "Dinge" Klassen bzw. Objekte sind. Die normalen "int" zum Beispiel nicht. Das erkennt man daran, dass man nicht

int.toString();

schreiben kann. Bei C# geht das allerdings.

Typisierung ist wichtig, weil es ein Sicherheitskonzept ist, aber auch weil es ein Featurekonzept ist.
 
Vielleicht einer der blödsten fragen :
Was genau ist eine Klasse. Wikipedia und das Fachbuch erläutern mir das etwas zu schwierig.
 
Für den Anfang kannst du dir denken, dass deine Klasse dein Programm ist. Viele werden mich jetzt hängen wollen, aber für den Einstieg ist das einfacher.

Später kannst du dir dann folgende Hierarchie einprägen:
Programm -> 1 oder mehr Klassen -> 1 oder mehr Methoden/Funktionen -> 0 oder mehr Anweisungen/"Befehle"

-> = enthält

Du kannst auch Programme mit mehreren Klassen schreiben. Z.B. kannst du Daten auslagern, indem du in einer Klasse mehrere Konstanten (Variablen z.B. vom Typ int) öffentlich zugänglich speicherst. In deiner anderen Klasse ist dein Hauptprogramm enthalten. Wenn dieses die Konstanten braucht, kann es auf die andere Klasse zugreifen und diese abfragen.

Ein ganz blödes Beispiel:
Klasse A soll einen Kalender darstellen. Klasse B enthält das heutige Datum und die Uhrzeit als Konstanten. Wenn Klasse A jetzt die Zeit bis zum nächsten Termin ausrechnen möchte, dann greift es auf die Daten der Klasse B zu. Die Klasse B könnte aber auch selber verschiedene Methoden enthalten, wie z.B. das Umrechnen der Zeiteinheiten und ähnliches. Oder deine Klasse B aktualisiert einmal in der Minute das Datum und die Uhrzeit. Das wäre jetzt schon eine etwas sinnigere Möglichkeit.
 
Smagjus schrieb:
Für den Anfang kannst du dir denken, dass deine Klasse dein Programm ist.
Naja, ob man das sagen sollte? Es führt auf eine falsche Fährte.

Eine Klasse ist die Angabe eines Objekts als Quellcode. Objekte sind instanzierte Klassen.

Das hängt alles mit der objektorientieren Programmierweise zusammen. Man macht sich Gedanken, was für "Objekte" das Programm benutzt, und dazu schreibt man die Klassen. Um das Beispiel von eben aufzugreifen: Im Idealfall modelliert man für alles eine Klasse: Klasse Kalender, Klasse Datum, ... dazu kann man Vererbung und verschieden andere Techniken benutzen.

Da offensichtlich in der realen Welt auch Objekte vorkommen, hat man so eine gute Möglichkeit um die Realität möglichst anschaulich im Programm nachzubilden.

Statt Klasse könnte man auch "Objektbeschreibung" sagen.
 
Vereinfacht: Klassen sind Baupläne/Vorlagen(aka Templates) für Objekte. Darin sind Struktur und Methoden festgelegt, die Instanzen (Objekte) der Klasse mit sich rumschleppen.

Vereinfacht deshalb, weil nicht jede Klasse instanziierbar sein muss und trotzdem Funktionalität anbieten kann (Stichwort static).

D.h. jede Klasse im scope deines Programmes kannst du instanziieren (Ausnahmen gibt es, wie erwähnt) und dann die erstellten Objekte in deinen Algorithmen nutzen. Mit Klassen kann man dann auch noch tolle Sachen machen, wie Vererbung, d.h. in einer neuen Klasse auf einer alten aufbauen.
 
F_GXdx schrieb:
http://en.wikipedia.org/wiki/Typeof

Typ ist im Fall von C# einfach die Klasse. Im Fall von Java wäre das anders, da in Java nicht alle "Dinge" Klassen bzw. Objekte sind. Die normalen "int" zum Beispiel nicht. Das erkennt man daran, dass man nicht

int.toString();

schreiben kann. Bei C# geht das allerdings.

Typisierung ist wichtig, weil es ein Sicherheitskonzept ist, aber auch weil es ein Featurekonzept ist.

Auch auf die Gefahr hin, dass die Antwort weit über die Kenntnisse des TE hinaus geht, was du geschrieben hast ist schlicht falsch.
In C# sind alle Werttypen Strukturen (struct) und nicht Klassen. Der Grund wieso man in C# trotzdem ToString(), GetType() usw. darauf aufrufen kann, ist die Tatsache, dass in C# (fast) alles von System.Object abgeleitet wird (Interfaces und Zeigertypen nicht, können aber dahin gecastet werden).


Smagjus schrieb:
Für den Anfang kannst du dir denken, dass deine Klasse dein Programm ist. Viele werden mich jetzt hängen wollen, aber für den Einstieg ist das einfacher.

Hab eben erst gegessen und bewegen ist jetzt nicht drin. Wir verschieben das Hängen, ok? ;)
 
F_GXdx schrieb:
Typ ist im Fall von C# einfach die Klasse.

Naja, alles sind Typen, nicht nur Klassen. Klassen, Interfaces, skalare Typen (Werttypen).

F_GXdx schrieb:
Im Fall von Java wäre das anders, da in Java nicht alle "Dinge" Klassen bzw. Objekte sind.

Und trotzdem sind es Typen :) Das Konzept der Typen ist völlig unabhängig davon, ob ein Objekt hinter einer Variablen steckt oder was anderes.
 
Zuletzt bearbeitet:
Ein struct ist allgemein so definiert, dass es keine Methoden haben kann. Es macht einfach keinen Sinn zu sagen, etwas ist ein struct nur zusätzlich mit Methoden. Dann ist es nämlich eine Klasse.

Außerdem hast du ja schon geschrieben, dass alles von Object erbt, also ist auch alles ein Object.

Also, kannst du mir das nochmal erklären?
 
F_GXdx schrieb:
Ein struct ist allgemein so definiert, dass es keine Methoden haben kann. Es macht einfach keinen Sinn zu sagen, etwas ist ein struct nur zusätzlich mit Methoden. Dann ist es nämlich eine Klasse.

Quelle?

F_GXdx schrieb:
Außerdem hast du ja schon geschrieben, dass alles von Object erbt, also ist auch alles ein Object.

Das ist das fundamentale Konzept hinter .NET. Alles ist ein Objekt.



F_GXdx schrieb:
Also, kannst du mir das nochmal erklären?

Du zuerst:
Code:
struct MyStruct
{
    public int Add( int lhs, int rhs )
    {
        return lhs + rhs;
    }
}

static void Main()
{
    Type type = typeof ( int );
    Console.Out.WriteLine( type.IsClass );

    MyStruct s = new MyStruct();
    Console.Out.WriteLine( s.Add( 1, 1 ) );
}

Edit.

Das 'new' oben im Code ist übrigens überflüssig. Lasse es trotzdem mal stehen. Die Speicherallokierung ist für structs nicht notwendig.

Ich geb dir noch einen Tip.
Der Unterschied zwischen 'struct' und 'class' hat etwas mit dem Typsystem zu tun und nicht (zumindest meiner Meinung nach), ob man Methoden verwendet oder nur Daten gruppiert.
 
Zuletzt bearbeitet:
OK ich habs gegoogelt. Bin nun geneigt dir zuzustimmen, weil es bei M$ auch so steht. Allerdings, nicht weil ich es für schön halte, sondern weil C# halt so eine Mischmasch-Sprache ist, die irgendwie alles anbieten will.

In der Doku heißt es auch
Eine Struktur kann als eine kompakte Klasse angesehen werden.

Was für einen Sinn das macht, naja. Irgendjemand wird sich schon was dabei gedacht haben.

Bei C und C++ geht es jedenfalls nicht.
 
Zuletzt bearbeitet:
F_GXdx schrieb:
OK ich habs gegoogelt. Bin nun geneigt dir zuzustimmen, weil es bei M$ auch so steht. Allerdings, nicht weil ich es für schön halte, sondern weil C# halt so eine Mischmasch-Sprache ist, die irgendwie alles anbieten will.

In der Doku heißt es auch

Was für einen Sinn das macht, naja. Irgendjemand wird sich schon was dabei gedacht haben.

Bei C und C++ geht es jedenfalls nicht.

Es geht einfach nur um Referenz- und Werttypen. Das ist der große Unterschied.

Btw. C++

Code:
int giveOne()
{
    return 1;
}

int main(void)
{
    struct Foo
    {
        int (*method) (void);
    } foo;

    foo.method = &giveOne;

Finde ich jetzt nicht unbedingt besser :D

Genauso wenig wie
Code:
struct Foo
{
    int method() const;
}

int Foo::method() const
{
    return 1;
}
 
Also eine Klasse beschreibt ein Bestandteil des Programms näher?zb einer rechnet und die andere Klasse setzt das im Programm um?
 
Zurück
Oben