[ANFÄNGER] C# - Projekt zum Start der Programmierung

Es gibt 153 Antworten in diesem Thema. Der letzte Beitrag () ist von AtomiX.

    AtomiX schrieb:

    isValidInput = int.TryParse(InputBox("Bitte Zahl eingeben"), out value);


    Das heißt, dass versucht wird einen string in einen Int zu konvertieren und in "value" zu speichern. isValidIput ist true, wenn der string konvertiert werden konnte.

    Du musst solche Sachen einfach ausprobieren, das hilft dir viel mehr. ;) Solche Sachen lernt man viel besser, wenn man sie direkt anwendet; die Beispiele helfen sicher beim Verständnis, aber was dann geht und was nicht, verankert sich erst beim Verwenden - selbiges bei der Sinnhaftigkeit.

    Viele Grüße
    ~blaze~

    AtomiX schrieb:

    Nochmal kurz wegen dem Var x = 0;
    ...wenn man mal nicht auf der übsichtlichkeit achtet...
    Ich sehe das anders als Blaze und viele andere.
    Mit var zu deklarieren schadet der Übersichtlichkeit überhaupt nicht - allenfalls in sehr seltenen Ausnahmefällen (und dann kann man ja explizit deklarieren).

    Man gewinnt aber durch var spürbar an Flexiblität: man kann Ausdrücke verändern (entwickeln halt), ohne ständig die Datentyp-Deklaration nachführen zu müssen.
    Weil der Datentyp ergibt sich aus dem Ausdruck, und ihn extra nochmal zu benennen ist redundant - und zack! - gleich ein kleiner Redundanz-Nachteil: die explizite Deklaration muss immer mitgepflegt werden.

    Es hat ja auch einen Grund, dass MS var ühaupt eingeführt hat (nämlich Redundanz-Verminderung). Die führen solche Features ja nicht ein, wenn man damit Code nur verschlechtern kann.
    var ist ein vergleichsweise junges c#-Feature, und viele Entwickler haben sich noch nicht dran gewöhnt. Brauchen sie auch nicht. Explizit deklarierter Code - wenner fertig ist - ist nicht schlechter als implizit deklarierter.
    Also wer's nicht mag solls halt lassen.

    ~blaze~ schrieb:

    mit dem Ergebnis der Funktion InputBox aufgerufen wird.


    Ist InputBox jetzt eine veraltete Funktion oder nicht? Sie ist zumindest bei dem Thread Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen aufgeführt. Aber trotzdem verwenden sie viele?

    Edit: @Schamash Jep, habs entfernt. Hab noch die vorigen Posts im Kopf gehabt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pascalony“ ()

    @Pascalony Haben wir den gleichen Text gelesen? Ich finde in dem Beitrag von EdR keine Ablehnung von VAR. Im Gegenteil, spricht er sich explizit dafür aus.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Es geht um die InputBox-Funktion, die ich selbst eingeführt habe. Es geht ja auch um C#, insofern gibt es die InputBox-Funktion nicht. In meinem langen Beitrag hatte ich das geschrieben, aber aus dem kurzen wird das nicht ersichtlich.

    Der Unterschied ist, dass ErfinderDesRades sich in Teilen nicht an die Konventionen hält, die z.B. ich so verwende (immer an der Sinnhaftigkeit orientiert, natürlich). Da ich aber zuvor die Konventionen halb ausgebreitet habe und sich ErfinderDesRades dagegen aussprach, wie ich es verwende, geht es wohl schon um "den gleichen Text". So wie ich das sehe, hat Pascalony sich aber auch nicht dagegen ausgesprochen, var zu verwenden...

    Die Konventionen entstehen übrigens auch nicht, nur weil jemand Spaß daran findet, Regeln einzuführen und die Welt mit ihnen zu versklaven oder so, die sind das Produkt langjähriger Erfahrung oder sogar teils von Forschung in entsprechenden Bereichen.

    Viele Grüße
    ~blaze~
    Danke für eure Antworten/Meinungen :)

    Aber ich kann gerade mit dem Namen Konstruktor nichts anfangen?
    Ich habe gerade mal so ein bisschen herum gelesen, soll der Konstruktor der "Name" von der Klasse sein oder verstehe ich das gerad falsch?

    Würde mich auch sehr über eine ausführliche Antwort von @~blaze~ freuen ;)
    Mit Freundlichen Grüßen
    AtomiX
    Ein Konstruktor ist Teil von Klassen oder Strukturen:

    C#-Quellcode

    1. public class X
    2. {
    3. public string S { get; }
    4. public X(string s)
    5. {
    6. S = s;
    7. }
    8. }

    Man nennt ein Objekt von einem bestimmten Typ eine Instanz von diesem. Z.B. sind 1, 2, 3 Instanzen des Typs int, "bla" ist eine Instanz des Typs string.
    Du kannst bei obiger Klasse eine Instanz durch das new-Schlüsselwort erzeugen:

    C#-Quellcode

    1. var instance = new X("bla");

    Was bei new X("bla") aufgerufen wird, ist der Konstruktor der Klasse - eben jener Code, der aufgerufen werden soll, wenn eine Klasse instanziiert wird.

    Im Code hast du gleich mehrere Dinge:

    C#-Quellcode

    1. public class X //Die Deklaration der Klasse
    2. {
    3. public string S { get; } //Eine Eigenschaft, die read-only ist, d.h. es gibt nur get und kein set (siehe unten)
    4. public X(string s) //der Konstruktor, wobei string s ein Parameter ist
    5. {
    6. S = s;
    7. }
    8. }

    Du kannst dir Konstruktoren als Methoden vorstellen, die ein Objekt des jeweiligen Typs erzeugen. Der Unterschied ist mitunter das new-Schlüsselwort.

    Eigenschaften sind prinzipiell eine Gruppe von Methoden, dem "Getter" und dem "Setter" (keine Ahnung, wie die professionell heißen, vermutlich spricht man von der get-Methode und set-Methode einer Eigenschaft, aber vielleicht weiß da jemand mehr/ist gewillt nachzuschauen).

    Beispielsweise sind Width und Height Eigenschaften der Klasse Form. D.h. wenn du FormInstance.Width = 1000 aufrufst, setzt du die Eigenschaft, d.h. der Setter wird aufgerufen. Bei int width = FormInstance.Width wird der Getter aufgerufen.

    Im obigem Fall der Klasse X hat die Eigenschaft S nur einen Getter. Der Compiler macht hier etwas praktisches: Er legt zusätzlich ein Feld an und erlaubt es, im Konstruktor diesem Feld einen Wert zuzuweisen. Der Code sähe, wenn man es selbst programmieren wollte, circa so aus:

    C#-Quellcode

    1. private readonly string _s;
    2. public string S
    3. {
    4. get { return _s; }
    5. }


    und man würde im Konstruktor _s = s; aufrufen.

    Also nochmal kurz zu Eigenschaften:

    C#-Quellcode

    1. public /*Typ*/ /*Name*/
    2. {
    3. get { /*Code, der beim Abfragen des Werts der Eigenschaft ausgeführt werden soll, es handelt sich um eine Funktion*/ }
    4. set { /*Code, der beim Setzen des Werts der Eigenschaft ausgeführt werden soll, es handelt sich um eine Prozedur. Der Parameter "value" enthält den angegebenen Wert*/ }
    5. }

    und get und set sind optional, aber es muss mindestens einen der beiden geben. Write-only Eigenschaften hat man eigentlich nicht.

    Ich hoffe, der Konstruktor ist auch halbwegs klar geworden? Ist jetzt kein solch großes Hexenwerk, da sind die Eigenschaften platzfressender, weil sie dann doch etwas mehr können...
    Ich würde außerdem gerne noch Felder (_s) und Zugriffsmodifizierer (public, private) erläutern, aber das wird dann glaube ich etwas viel.

    Viele Grüße
    ~blaze~
    @AtomiX klar sagt dir das nix. Das kommt auch erst später im Lehrplan.

    Schau mal, jetzt findest du permanent neue Begriffe die du noch nicht kennst. In einem strukturierten Lehrplan würden solche Begriffe erst dann verwendet, wenn das zugehörige Thema behandelt wird. Als nächstes schreibt hier jemand was von Überladung und Signatur und dann haste wieder zwei neue Begriffe die du nicht kennst. Dann schreibt einer von Lambda und zack, wieder was neues. Und so geht es immer weiter bis du plötzlich anfängst dich mit LINQ zu beschäftigen, dabei kannst du noch nicht mal ne Schleife programmieren.

    Was ist dann passiert? Du hast alle Basics übersprungen bzw. Verinnerlicht und eierst nun bei Fortgeschrittenen Themen rum und kommst nicht klar.

    Zudem hilft es, zumindest aus meiner Sicht, nichts einfach Begriffe zu lernen und nen bissl was drüber zu lesen. Du musst das auch anwenden können, und verstehen was/wann/warum passiert. Und zwar nicht nur kurz nach dem einlesen ins Thema, sondern auch nach 3 Wochen noch. Und das ohne zu googlen (zumindest bei den Grundlagen).

    Es hatte einen guten Grund, warum ich damals 1 Jahr lang gebraucht habe besagtes Buch durch zu arbeiten...

    Aber scheinbar fehlt dir die Ernsthaftigkeit und der genaue Plan um richtig und nachhaltig Programmieren zu lernen ...

    Edit: @~blaze~ klasse wie du dich hier bemühst und so ausführlich auf die Fragen des TE eingehst :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Sehe ich nicht so. Es werden nach-und-nach die Elemente eingeführt und ich gebe mir auch Mühe, die zugehörigen Grundlagen zu vermitteln.
    Ich bin aber jemand, der eben genau so lernt: Ich lerne erst, was es gibt und wie es geht und danach arbeite ich mich durch all diese Dinge nochmal explizit durch Tests, Beispiele, usw. durch. Ich würde auch Sprachen so lernen: Erst Grammatik und ein gewisses Grundvokabular, damit ich all jene Dinge an einfachen Beispielen lernen kann und dann würde ich mir mehr Vokabeln aneignen und beginnen, sie zu unterscheiden. Programmiersprachen unterscheiden sich prinzipiell nur in einer Sache von realen Sprachen: Sie sind ausgesprochen eingeschränkt in ihrer Syntax.

    Aber nochmal, warum ist sowas nötig?

    mrMo schrieb:

    Aber scheinbar fehlt dir die Ernsthaftigkeit und der genaue Plan um richtig und nachhaltig Programmieren zu lernen ...

    Das ist eine Unterstellung, die verbreitet negatives Klima und bringt weder dir etwas, noch AtomiX. Du hättest das wunderbar auch positiver formulieren können.

    Aber dennoch danke für dein positives Feedback, ich bemühe mich, es verständlich rüberzubringen. Ggf. hilft es ja nicht nur AtomiX, sondern auch einigen anderen, die hier das Programmieren lernen wollen.

    Viele Grüße
    ~blaze~
    Ah ok.
    Danke für deine ausführliche und gute Antwort!

    D.h. das Schlüsselwort new(); ist an sich nur der Konstruktor bzw damit kann man ihn erzeugen oder?

    Und kann man das Width und Height sich so wie in CSS vorstellen?
    Das gibt es ja dort auch ;)

    Also nochmal vielen Dank für deine Antwort!
    Du könntest ein eigenes Handbuch schreiben :)
    Mit Freundlichen Grüßen
    AtomiX
    Der Konstruktor ist das

    C#-Quellcode

    1. public X(...)
    2. {
    3. }


    Mit new erzeugst du eine Instanz des Typs - in unserem Fall X. Der Konstruktor wird durch new aufgerufen.

    Es handelt sich bei Width und Height lediglich um Eigenschaften, die bspw. ein Fenster hat. Sie heißen zwar gleich, aber es gibt zwischen CSS und C# einige fundamentale Unterschiede. Ich würde ehrlich gesagt nicht unbedingt Parallelen zwischen C# und HTML/CSS suchen, da es zwar um ein ähnliches Thema geht, aber C# eine Programmiersprache und CSS eine Stylesheet-Sprache ist. C# beschreibt einen Programmablauf, CSS deklariert den Stil von Elementen. Eigenschaften können insofern weitaus mehr (sie können halt beliebigen Code ausführen, also bspw. Werte generieren oder dergleichen, wie Funktionen auch).

    Viele Grüße
    ~blaze~
    Ah ok alles klar.

    Das heißt ich kann prinzipiell ausgehen, wenn ich in einer Klasse bpsw. public x oder y ... habe das es ein Konstruktor ist.
    Da hätte ich jetzt noch eine Frage, muss der Konstruktor zwangs läufig Parameter haben?
    Mit Freundlichen Grüßen
    AtomiX