Transkripte
1. 0-1. Ist dies der Kurs für dich und über den Kursleiter: Also heiße alle willkommen. Willkommen zu meinem C
Sharp-Video-Tutorial-Kurs. Hier habe ich ungefähr
11 Stunden Filmmaterial Ihnen alles
von den absoluten Grundlagen her
beibringt. Dies setzt voraus, dass Sie überhaupt keine
Programmierkenntnisse haben. Und am Ende werden
Sie dasselbe,
wenn nicht sogar mehr Wissen
über Programmierung
und C Sharp haben wenn nicht sogar mehr Wissen als ein typischer
Universitätsstudent. Wenn Sie also C
Sharp als Hobby lernen möchten ,
ist das kein Problem. Das wirst du aus diesem Kurs
herausholen. Wenn
Sie jedoch im Anschluss an
diesen Kurs einen Job oder möglicherweise eine Karriere anstreben, dann werden Sie auch damit
kein Problem haben . Und für diejenigen unter Ihnen
, die vielleicht
eine Auffrischung von C Sharp oder eine Auffrischung der
generischen Programmierung wünschen , dann ist dieser Kurs auch
gut dafür geeignet Ist dieser
Shop-Video-Tutorial-Kurs also gut für Sie? Nun, möchtest du Einkaufen lernen? Dann lautet die Antwort ja. Aber vielleicht ist eine bessere
Frage, warum ich diesen
Kurs allen anderen vorziehen
sollte? Nun, das Geheimnis des
Lernens ist in erster Linie der Lehrer, und so vermittelt
der Lehrer
die Informationen. Und Nummer zwei, der
Lernprozess. Ist der Kurs fesselnd? Ja, ist es. Ist es langweilig? Nein, gewiss nicht.
Ist es verwirrend? Nein, weil ich
Prinzipien nicht nur auf eine,
sondern vielleicht auf zwei oder
drei verschiedene Arten erkläre . Am Ende werden
Sie also
alle Techniken, die ich vollständig verstehen Ihnen in diesem Kurs
beibringe, vollständig verstehen. Und das Tempo, ist
es schnell? Nein, es ist überhaupt nicht
schnelllebig. Dieser Kurs ist
für absolute Anfänger konzipiert. Das Tempo ist also bestenfalls langsam. Für wen ist dieser Kurs gedacht? Dieser Kurs ist für
absolute Anfänger. Es wird davon ausgegangen, dass Sie keine
Programmierkenntnisse und
keine Kenntnisse in der
Softwareentwicklung haben keine Kenntnisse in der
Softwareentwicklung und
mit der C-Sharp-Programmierung beginnen möchten. Vielleicht möchtest du
ein paar Spiele in Unity machen. Vielleicht möchten Sie
Softwareanwendungen,
mobile Apps und Websites im C-Shop entwickeln . All das ist möglich, diesen
Video-Tutorial-Kurs
ansehen Dieser Kurs setzt voraus, dass Sie
wissen, wie man einen Computer benutzt. Im Allgemeinen wissen Sie, dass
Sie eine Maus bewegen, vielleicht Ihre E-Mails abrufen und eine Datei herunterladen Aber der Punkt ist, es setzt überhaupt keine
Programmierkenntnisse
voraus Also die
Lernerfahrung, naja, in meiner Freizeit mag
ich Psychologie,
also verstehe ich, wie
der menschliche Geist funktioniert,
besonders wenn es darum geht, Informationen zu lernen
und zu behalten. Aber vielleicht ein neues und
entmutigendes Thema. Das bringt mich also zum
nächsten Punkt, dem Tempo. Wie ist das Tempo
des Kurses? Nun, Programmieren hat viele große und komplizierte
technische Wörter Aber keine Sorge, ich führe technische Begriffe
im Laufe des Kurses nur sehr langsam ein. Viele Lehrer verwenden komplizierte
Wörter sofort, was zu großer
Verwirrung führt und die Fähigkeit
beeinträchtigt, das Thema im Griff zu
behalten Ich halte das für einen sehr wichtigen Schritt, um
Ihren größten Feind,
die Informationsflut, zu verhindern die Informationsflut Machen Sie sich also keine Sorgen,
Sie werden
die komplizierten und
technischen Wörter lernen , aber nicht vor dem eigentlichen
Thema. Ich werde
es langsam einführen, damit die Lernerfahrung sehr angenehm
ist. Im Laufe des Kurses werde
ich also langsam damit beginnen, die richtigen Branchenbegriffe
und Fachjargon einzuführen , wenn mir die Videos
aus diesem Ich schätze es, dass Sie
nicht da sind, um sofort
Fragen zu stellen und direktes Feedback zu erhalten Also was ich mache, ich erkläre Themen
auf verschiedene Arten, nicht nur auf eine Art,
und so
können Sie das jeweilige Thema vollständig verstehen. Meiner Meinung nach ist diese
Lernmethode weitaus besser als Videos
zu machen, in denen Sie nicht genügend Informationen
bereitstellen. Wenn nicht genügend
Informationen zur Verfügung gestellt werden, fühlt man sich verloren
und frustriert und es ist kein Lehrer
da, der Fragen stellt Das wirst du in meinem Kurs nicht erleben. Und das garantiere
ich,
denn auch wenn ich ein kompliziertes
Thema zum Beispiel auf zahlreiche verschiedene Arten erklärt zahlreiche verschiedene Arten habe, können
Sie
mir bei Fragen gerne eine Nachricht oder einen Kommentar hinterlassen. Und ich
freue mich sehr, auf alle Fragen oder Bedenken einzugehen, die Sie jedem Zeitpunkt
während dieses Kurses
haben. Und zu guter Letzt: Wenn ich Ihnen
ein Programmierprinzip beibringe, bringe
ich
Ihnen nicht nur die Informationen bei. Ich erkläre sogar,
warum sie nützlich sind, warum man sie
im täglichen Leben anwendet und warum es bei der Entwicklung von
C++ wichtig ist ,
dieses spezielle Prinzip anzuwenden. Darin
unterscheidet sich mein Kurs von vielen anderen
Kursen. Man lernt das Wie und das Was, aber auch das Warum, was sehr wichtig ist. Engagement und Motivation sind einer der
größten Hindernisse beim Erlernen neuer Informationen Beides geht Hand in Hand. Also was ich mache, ich
verwende lustige Beispiele. Außerdem verwende ich auch
Trendbeispiele , um die
Dinge interessant zu halten Ich verstehe, wie es sich
anfühlt, die Motivation und das Engagement zu
verlieren und sich ein bisschen zu langweilen, wenn man ein neues Thema
lernt Deshalb versuche ich, die
Dinge frisch und
aktuell zu halten , damit Sie
nie die Motivation verlieren. Und du wirst dich immer
mit den aktuellen Themen beschäftigen. Was werde ich also
davon haben, diesen Kurs zu lernen? Warum sollte ich von dir lernen? Was ist das Endergebnis? Was kann ich erreichen? Nun,
sehr gute Fragen. Ich werde dir alles beibringen, was
du über Shop wissen musst, aber nicht nur über
C-Shop-Programmierung im Allgemeinen. Die Tools, Techniken und Prinzipien, die
dich zu einem guten Entwickler,
einem guten Programmierer machen ,
vor allem im Shop Und es wird ähnlich,
wenn nicht sogar besser, sein als ein Student mit
Hochschulabschluss Wie garantiere ich
diese kühnen Behauptungen? Nun, ich war an der Universität, ich war ganze vier Jahre dort. Und ich kann garantieren
, dass der Inhalt dieses Kurses genau dem entspricht, was
ich an der Universität gelernt habe. Aber nicht nur das, sondern mehr. Und ich bringe Ihnen auch
die Tools, Techniken und Best Practices bei, die ich mir auch in der
Industrie angeeignet habe , also beruflich. Egal, ob Sie eine
Universität besuchen oder nicht, Sie haben einen Vorteil, weil
Sie nicht in
einem Klassenzimmer voller Menschen sitzen, in dem viele Ablenkungen herrschen Dies ist eine einzigartige
Eins-zu-Eins-Erfahrung. Abschließend möchte ich
zusammenfassen, dass
es egal ist, welcher
Lerntyp Sie sind,
ob Sie ein visueller Lerner sind oder kein visueller Lerner,
Sie können sich diesen
Kurs ansehen, indem Sie zum Beispiel auf
einem Stuhl sitzen und eine
Pizza essen Wenn Sie jedoch interaktiver
sein
möchten, stelle ich die vollständigen
Projektdateien zusammen
mit diesem Kurs zur Verfügung , den
gesamten Quellcode, den Wenn Sie also an
Ihrem Computer
mitverfolgen möchten , können Sie das tun. Überhaupt keine Probleme. Dieser Kurs bietet
mehrere
Lernmöglichkeiten für verschiedene Lerntypen Also über mich, wer bin
ich, wie ist mein Name? Also, ich bin Sean und es ist
schön, euch alle kennen zu lernen. Ich bin ein professioneller,
selbständiger Softwareingenieur. Aber nicht nur das, ich unterrichte Softwareentwicklung
und Programmierung. Ich arbeite mit vielen verschiedenen
Programmiersprachen und auch mit vielen verschiedenen
Architekturen Aber weil ich regelmäßig Schüler
unterrichte, habe ich nicht die Fähigkeit verloren mit neuen Lernenden
zu kommunizieren, insbesondere auf Anfängerniveau Ich habe
jetzt im Jahr 2007 mein Studium abgeschlossen. Ich habe über 20 Jahre
Berufserfahrung in der Softwareentwicklung. Ich habe sogar neben
meinem Studium
in demselben Bereich gearbeitet . Ich unterrichte jetzt seit 2003
Programmieren. Vor langer Zeit nutzte
ich es also, um
mein Studium an der Universität zu finanzieren , bevor es
YouTube überhaupt gab. Ich zeige Ihnen jetzt meine sehr
alte Website ich
Video-Tutorial-Kurse in Visual Basic,
sechs C plus Java,
Direct X und verschiedenen Dingen erstellt habe sechs C plus Java, . Sie können also sehen, dass
ich jetzt vielen
Leuten Programmieren beigebracht habe. Und sie kommen immer später zu mir
zurück, weißt
du, zehn Jahre
später, 15 Jahre später. Und erzählen Sie mir alles über
ihre Erfolgsgeschichten, die Unternehmen, in denen sie gerade
arbeiten, und die Projekte, an denen sie beteiligt
waren. Es ist also wirklich gesund
und interessant, diese Erfolgsgeschichten
von meinen früheren Studenten zu hören Und ich liebe es, wenn Schüler zu mir
zurückkehren
und mir von
ihren Erfolgsgeschichten erzählen und
wie sich ihr Leben verändert hat Lernen,
Programmieren, das ist wirklich interessant und das
Beste am Unterrichten. Ich bin jetzt selbständig, habe
aber in der Vergangenheit für viele
Unternehmen gearbeitet. Kleine und auch
große Unternehmen, vielleicht haben Sie von einigen gehört. Ich habe für The Guardian gearbeitet
, eine Zeitungsfirma mit
Sitz im Zentrum Londons. Ich habe für das britische
Verteidigungsministerium gearbeitet, wo wir an
CAD-Software zur
Modellierung ihrer
Überwasserschiffe und U-Boote gearbeitet Modellierung ihrer
Überwasserschiffe und U-Boote Ich habe für Pfizer gearbeitet, ein Pharmaunternehmen, von dem Sie
in letzter Zeit sicher alle
gehört haben Aber als ich dort gearbeitet habe, haben
nicht viele Leute von diesem
Unternehmen gehört Und ich habe für
verschiedene kleine Agenturen gearbeitet , von denen
Sie vielleicht noch nie gehört haben. So kann ich meine
Erfahrungen aus der Arbeit in kleinen Teams und auch in
sehr großen Teams teilen. Und Beispiele für
diese beiden unterschiedlichen Arten von Erfahrungen werde ich
in diesem Kurs ebenfalls vorstellen. Falls Sie sich also fragen, woher
mein Akzent kommt, nun, ich wurde in Großbritannien geboren und meine Programmierabenteuer haben mich um die ganze Welt
geführt. Ich bin mit
25 nach Amerika gezogen und habe dort die Staatsbürgerschaft bekommen. Und jetzt lebe ich
in Südamerika. Aber eine Sache, die konstant
geblieben ist
, und nicht etwa mein Zuhause
und mein Akzent, ist, dass ich schon
immer
Programmieren unterrichtet habe und dass ich immer Softwareentwicklung gemacht habe. Also genug von mir. Lass uns jetzt über C Sharp
sprechen.
2. 0-3. Was ist C# im Spieldesign? und Warum C# lernen?: Also, was ist C Sharp? Nun, C Sharp ist
eine sogenannte objektorientierte
Programmiersprache. Und mach dir keine Sorgen, darüber werden wir später
sprechen. Es wurde von Microsoft erstellt und läuft auf dem
sogenannten.net Framework C Sharp hat seine Wurzeln
in der C-Familie. Ich weiß also nicht, ob Sie von C oder C Plus Plus
gehört haben, aber es ist diesen Sprachen ziemlich
ähnlich, und aus diesem Grund
wurde es entwickelt. Es ist
populären Sprachen wie
C plus Plus und Java sehr ähnlich . Und die erste Version von C Sharp wurde
im Jahr 2002 veröffentlicht. Jetzt ist es also über 20 Jahre alt. Und die neueste
Version zum Zeitpunkt der Dreharbeiten ist C Sharp Version 11. Die C Sharp-Sprache
entwickelt sich also langsam so ziemlich wie
alles andere im Leben Warum sollte ich also C
Sharp lernen? Wofür wird es verwendet? Nun, Sie können
mobile Anwendungen,
Desktop-Anwendungen,
Webanwendungen wie
Websites, Videospiele,
Virtual-Reality-Spiele
, maschinelles Lernen,
Software, Datenbankanwendungen
und vieles mehr erstellen Desktop-Anwendungen, Webanwendungen wie
Websites, Videospiele, Virtual-Reality-Spiele
, maschinelles Lernen, . Es ist eine der beliebtesten Programmiersprachen
der Welt. Und deshalb ist es
wirklich gut,
eine Sprache wie C
Sharp zu lernen , weil es mehr
Beschäftigungsmöglichkeiten
geben
wird und Sie mehr
Möglichkeiten haben, Ihr Wissen anzuwenden. Sie ist leicht zu erlernen und
einfach zu benutzen. Es hat eine enorme Unterstützung durch die Community. Wenn Sie C
oder C plus plus oder Java bereits kennen oder sie vielleicht in Zukunft
lernen möchten, dann sind sie sich sehr ähnlich. Die Prinzipien, die ich
Ihnen in diesem Kurs beibringe, können
Sie auf C plus plus und
Java anwenden , wenn Sie in Zukunft eine
neue Sprache lernen möchten. Eines der
derzeit angesagtesten Dinge ist die Entwicklung von
Videospielen in einem
Softwareentwicklungspaket namens Unity Unity unterstützt C Sharp
hinter den Kulissen. Wenn Sie möchten, dass Ihr
Videospiel Dinge tut, dass sich Ihre Charaktere bewegen, dann können Sie C Sharp verwenden,
um dies zu erreichen. Im Moment
lernen die Leute also mehr denn je Scharf, nur damit sie
Videospiele in Unity erstellen können. Es gibt also eine Menge
Gründe, C
Sharp zu lernen und warum Sie
C Sharp besser lernen sollten als vielleicht
andere Sprachen. Hoffentlich habe
ich Sie durch
meine bisherigen Erklärungen davon überzeugt, Ihre Reise damit zu
beginnen C Sharp zu
lernen und
vielleicht ein professioneller Programmierer oder sogar ein Hobbyprogrammierer Lassen Sie uns nun unsere
Abenteuer in C Sharp beginnen und die Tools herunterladen, die wir für den Einstieg
benötigen
3. 0-4. Herunterladen und Installieren von Visual Studio (C#IDE): Wie fangen wir an, in C Sharp zu
codieren? Nun, der einfachste Weg, um
loszulegen , ist die Verwendung
einer sogenannten IDE. Dies steht für Integrated
Development Environment. Und die Umgebung, die
wir
verwenden werden , heißt Visual Studio. Wir werden also nicht in
Notepad oder so etwas
Gruseliges programmieren Notepad oder so etwas
Gruseliges Wir werden
benutzerfreundliche Tools für Anfänger
verwenden, die von Microsoft bereitgestellt
werden Und nicht nur das,
sie sind kostenlos. Lassen Sie mich Ihnen zeigen
, wie Sie Visual Studio herunterladen und damit beginnen können. Lassen Sie uns jetzt mit dem Herunterladen von
Visual Studio beginnen. Wenn wir zu Google kommen und einfach Visual
Studio Community eingeben, können wir hier auf das
erste Ergebnis klicken. Die neueste Version
zum
Zeitpunkt der Dreharbeiten ist
Visual Studio 2022. Aber selbst wenn Sie
eine frühere
oder eine neuere Version haben , viele der Techniken, die
wir in
diesem Kurs behandeln werden , funktionieren. Keine Probleme. Also werden wir hier auf
diesen ersten Link klicken. Hier können wir
die IDE gleich
hier herunterladen , wenn Sie beispielsweise einen
Apple Mac verwenden. Dann kannst du hier oben auf
diesen Button klicken. Und dann gibt es Visual Studio
in drei verschiedenen Varianten. Wir haben hier den für
Windows, den für Macos und auch einen leichten
für Mac, Windows und Linux. Abhängig von Ihrem
Betriebssystem sollten
Sie also ziemlich gut abgesichert sein. Aber ich verwende einen
Windows-Computer und das passt nicht wirklich zusammen. Wenn Sie einen Mac verwenden, können Sie den Tutorials trotzdem folgen,
kein Problem. Also werde ich hier auf
diesen Download-Link klicken und dann
wird Visual Studio mit dem Herunterladen beginnen. Es ist nur eine 34-Megabyte-Datei, also ist sie sehr klein, aber alles
wird
in der Setup-Datei selbst heruntergeladen in der Setup-Datei Kurz bevor wir
Visual Studio installieren, möchte
ich eine Sache erwähnen Visual Studio ist nicht nur
an die Entwicklung von C Sharp gebunden. In Visual Studio können Sie so viel tun. Visual Studio arbeitet mit
HTML, CSS, Javascript. Sie können sogar
mobile Anwendungen,
Php, Python, Spot, Net erstellen . All diese verschiedenen Dinge, Tools, Technologien und
Programmiersprachen können
Sie in Visual Studio ausführen. Wenn Sie also bereits
eine andere Sprache beherrschen
oder vielleicht
in Zukunft andere Sprachen
ausprobieren möchten, nachdem
Sie sich C Sharp angesehen haben,
dann wird Visual Studio Sie auch bei dann wird Visual Studio diesen Bemühungen
unterstützen Es ist also eine sehr leistungsstarke
Software, und auch hier ist sie kostenlos Lassen Sie uns die Visual
Studio-Setup-Datei öffnen, die wir gerade heruntergeladen haben und mit der Installation von
Visual Studio
erhalten. Klicken wir also hier auf Weiter. Jetzt bereitet es nur
das Installationsprogramm vor und lädt eine
etwas größere Datei herunter. Jetzt ist dies das Fenster
, das Sie
sehen werden, sobald das
Setup initialisiert ist Also viele verschiedene
Dinge, die Sie hier für die Zwecke
dieses Kurses
tun können hier für die Zwecke
dieses Kurses
tun Das einzige, womit wir arbeiten
werden, ist C Sharp. Das Einzige, was wir brauchen, ist
das.net-Desktop-Environment genau hier. Sie klicken also einfach hier auf
dieses Feld
und dann können wir
mit der Installation dieser Komponenten beginnen. Sonst noch etwas? Dies ist völlig
optional, und es liegt an Ihnen, wir haben verschiedene Dinge für die
Entwicklung von Websites in Aspet Wir haben auch Azure Node, Python. Nochmals, Desktop- und Mobilgeräte,
Sachen in C Plus Plus. Und Sie können
Unity sogar über
das Visual Studio-Installationsprogramm und verschiedene
Datenkomponenten installieren. Es gibt also viel zu
tun, viel zu installieren
und viel zu lernen, was das Programmieren und Arbeiten
mit Visual Studio angeht . Aber was wir brauchen, ist nur
diese einfache Box hier. Wenn Sie eine andere Sprache sprechen oder mit
einer anderen Sprache besser vertraut sind, können
Sie sie hier auswählen. Das ist überhaupt kein Problem. Wenn wir jetzt hierher kommen, ist
das alles,
was hier installiert werden wird. Um ehrlich zu sein,
glaube ich nicht, dass wir
Live-Share-Modelbuilder oder Blend brauchen . Es wird nur unsere
Anlage kaputt machen. Aber ich denke, das ist eine gute
Einrichtung für den Anfang
und sie wird dir alles
geben, was
du brauchst, um
diesem Kurs zu folgen , und
noch etwas mehr. Also, was wir jetzt tun werden, ist einfach auf diese Installationsschaltfläche zu klicken. Hier haben Sie ein
paar Optionen. Sie können alles herunterladen und
dann installieren, oder Sie können es während des Herunterladens
installieren. Das ist nicht wirklich wichtig,
es hängt nur von Ihren Vorlieben und vielleicht von
Ihrer Internetverbindung ab. Klicken wir also auf die
Schaltfläche Installieren und legen Sie los. Die Installation kann einige Minuten
dauern, aber sobald Sie diesen
Bildschirm hier sehen, bedeutet
das, dass Visual Studio erfolgreich installiert
wurde. Sie verwenden, befinden sich möglicherweise auch Symbole auf Ihrem Desktop oder in Ihrem Programmmenü Je nachdem, welches
Betriebssystem Sie verwenden, befinden sich möglicherweise auch Symbole auf
Ihrem Desktop oder in Ihrem Programmmenü. Aber im Grunde genommen haben
Sie Visual
Studio installiert, sobald es in dieser Liste
erscheint . Was wir tun können,
wir können jetzt einfach auf
diese Schaltfläche klicken und Visual Studio
starten und dann mit unserer
Softwareentwicklung
in C. Sharp beginnen .
4. 1-1. Hello World (Mr. Beast-Logo): In dieser Lektion
werden wir
eine sehr einfache
Software erstellen, eine sehr einfache
Software die als
Konsolenanwendung bezeichnet wird. Sie
zeigt jedem, der
unsere Software öffnet, das Mr. Beast-Logo an. Lass uns jetzt loslegen. Visual Studio wurde
frisch installiert. Wir werden
unsere allererste
Softwareanwendung erstellen . Es wird
unsere allererste sein. Es wird
anfängerfreundlich sein und wir werden es
von oben angehen. Lass uns gehen. Sobald Visual Studio geöffnet ist, klicken
wir auf
Datei, Neues Projekt. Dann haben wir ein Fenster
, das dem ähnelt. Wenn Sie
Visual Studio 2022 nicht haben, ist
das die Version, die
ich gerade verwende. Es kann etwas anders aussehen. Möglicherweise werden Einstellungen
an verschiedenen Stellen angezeigt. Die Dinge könnten
etwas anders genannt werden. Aber das allgemeine
Prinzip gilt immer noch. Jetzt, unsere allererste
Softwareanwendung, wird
es eine Konsolen-App sein. Und das wird durch
diese Projektvorlage hier dargestellt. Was eine Konsolenanwendung ist, sie ist wie
ein schwarzes Fenster. Es ist nur Text drauf. Und der Grund, warum ich das benutze, ist
, dass es sehr
anfängerfreundlich ist. Es gibt keine Schaltflächen, Listen, Bilder oder irgendetwas Kompliziertes. Das ist sehr anfängerfreundlich und deshalb verwende ich
eine Konsolenanwendung. Wenn Sie das nicht wirklich in dieser Liste
sehen, können
Sie hier
danach suchen, indem Sie
Konsolen-App oder
Konsolenanwendung eingeben . Und Sie können sehen, dass all diese
Vorlagen hier geladen werden. Wir wollen das, weil
wir in C Sharp schreiben. Es wird tatsächlich
unter Linux, Mac, Windows laufen. Wir werden diesen verwenden,
wir werden auf Weiter klicken. Wir können es nennen, wie
wir wollen. Es liegt an dir. Sie können es
so lassen oder etwas
Beschreibenderes
wählen Also nennen wir es das
erste Programm, den Standort. Sie können ein
Verzeichnis wählen, in dem Sie alle
Ihre Projektdateien speichern
möchten. Das liegt an dir.
Also lass uns auf Weiter klicken. Nun zu diesem Framework,
ich werde
in einem späteren Tutorial über
alles über Frameworks sprechen . Ich möchte
es
sehr einfach halten, diese Liste könnte 4567 enthalten,
alles verschiedene Zahlen Wir
lassen es einfach bei sieben stehen. Wenn deine vier in Ordnung sind, wird
es trotzdem funktionieren. Wenn Sie
hier dieses Kästchen mit der Aufschrift „ Verwenden
Sie keine Anweisungen auf oberster Ebene“ sehen. Stellen Sie sicher, dass es aktiviert ist. Das ist sehr wichtig. Lass uns auf Erstellen klicken. Und
das sehen wir genau hier. Jetzt hat Visual Studio tatsächlich all diesen Code für uns zur Verfügung
gestellt, und der Grund, warum sie das
tun, ist,
ihn benutzerfreundlicher zu machen ,
damit wir loslegen können. Als Erstbenutzer haben
Sie wahrscheinlich keine
Ahnung, was das bedeutet. Das ist nicht wirklich wichtig. All diese Zeilen hier werde ich in einem späteren
Tutorial
behandeln und du wirst lernen, was sie bedeuten rechtzeitig
lernen, was sie bedeuten, um diesen
Anfänger freundlich zu halten. Die einzige Zeile,
mit der
Sie sich momentan befassen müssen, ist diese hier in diesem Tutorial. Wir werden unseren
gesamten Code zwischen dieser geschweiften Klammer hier und
dieser hier platzieren , alles
in der Mitte Und wir können hier mehr Zeilen
einfügen, wenn wir wollen. In diesem Tutorial
sprechen wir hier nur über diesen Abschnitt. Mach dir darüber keine Sorgen. Lassen Sie uns all
diese Komplexität entfernen. Lassen Sie uns darüber sprechen.
Was macht es? Auf der rechten Seite
der Konsole steht Hello World. Um dieses Programm tatsächlich zu testen
und auszuführen, muss
ich über einen sogenannten Compiler sprechen Nun, Visual Studio, hat einen eingebauten Compiler, weil
wir C Sharp schreiben Da ist ein
Sharp-Compiler drin. Was der C Sharp-Compiler macht, er nimmt unseren gesamten Code hier, das ist alles in diesem
weißen Fenster, kompiliert Wenn wir zum Beispiel
Windows verwenden, wird
es eine
EX-Datei für uns erstellen, was eine E-Datei wird Binärdatei genannt, vielleicht
müssen Sie das jetzt nicht wirklich wissen, aber sie wird Binärdatei genannt. Wenn wir
dieses Programm zum Beispiel auf
einem Mac ausführen wollen , dann wird es eine Binärdatei
erstellen , die ein Mac verstehen würde. Wenn wir möchten, dass es auf einem Android-Gerät läuft, wie auf einem Android-Telefon, wird eine Binärdatei erstellt , die das
Android-Telefon verstehen kann. Das ist wirklich das, was ein Compiler tut, in einer sehr kleinen,
unkomplizierten Nussschale Er nimmt unseren gesamten
Code und kompiliert ihn in eine Um das zu tun,
um den Compiler auszuführen, siehst
du
hier oben diesen kleinen
grünen Play-Button , auf dem unser
Projektname First Program steht Wenn wir auf diese Schaltfläche klicken, sagen wir hier,
oh, hey, Visual Studio Können Sie unserem
Compiler sagen, dass er unseren
gesamten Code in eine Datei umwandeln soll, damit wir die Software
ausführen können Das ist genau das, was er tut, also werden wir hier darauf
klicken Was passiert, ist, dass unser
kleines schwarzes Fenster erscheint und sofort
wieder verschwindet. Zwei Dinge hier, all
das Zeug hier unten,
du hast gesehen, wie der ganze
Text verrückt wurde. Das ist der Compiler. Der Compiler sagt,
okay, ich habe das gemacht, das, kann ich
diese
EXE-Datei am Ende ausspucken Das liegt daran, dass ich Windows
verwende. Es hat eine EXE-Datei für mich erstellt. Jetzt
wurde die EXC-Datei erstellt. Die Software wird ausgeführt. Es versucht,
die EC-Datei für uns zu öffnen. Das war das schwarze Fenster
, das gerade aufgetaucht ist. Aber dann ist es sofort
verschwunden. Es ist sofort verschwunden, weil wir ihm nicht wirklich
sagen, dass es offen bleiben soll. Visual Studio hat diesen
Beispielcode
gut für uns eingefügt, aber es hält auch die Software offen, sodass wir tatsächlich sehen
können,
was vor sich geht. Ich gebe noch eine
Zeile ein und das
hält das schwarze
Fenster für uns offen. Also werde ich Konsole eingeben, weil Konsole
das schwarze Fenster ist. Also wollen wir sagen, oh, hey, Konsole liest Zeile, richtig? Das ist es also, was ich
dort einfüge und das wird das
Konsolenfenster offen halten. Lass uns ganz schnell über diese
Zeile sprechen. Was das macht, es
wartet auf Benutzereingaben. Haben
Sie zum Beispiel eine Software gesehen,
irgendeine Software, die sagt,
hey, wie ist Ihr Name Und dann tippst du deinen Namen ein? Wenn
wir also diese Codezeile ausführen, wartet
das schwarze Fenster auf unsere Eingabe. Und das hält
das Fenster einfach offen. Lassen Sie uns
diese Software jetzt einfach ausführen. Jetzt können Sie sehen, dass das
Fenster geöffnet ist. Es ist tatsächlich offen geblieben,
es wird nicht verschwinden. Das liegt nur daran, dass es
auf unsere Benutzereingabe wartet. Aber es ist irgendwie eine
etwas dreckige, hackige
Art der Aufbewahrung Damit wir sehen können, was vor sich geht. Dieses schwarze Fenster hier ist
unsere Konsolenanwendung. Es ist unsere allererste
Software. Klopft euch auf das
Rudel. Es macht nicht viel. Das Einzige, was es tut,
ist Hallo Welt zu sagen. Es sagt dir, dass es lebt. Es sagt Hallo zur Welt. Das ist alles, was es momentan tut. Sehr einfach, aber
verkaufen Sie sich nicht zu wenig, es ist Ihre allererste
Software. Wir können es entweder schließen, indem die Eingabetaste drücken,
oder es hier abhaken. Und das ist es auf den Punkt gebracht, unsere allererste
Softwareanwendung Wie erweitern wir das nun? Nun, lassen Sie uns zuerst über
eine andere Sache sprechen, nämlich die Groß- und
Kleinschreibung in Sharp C. Und auch ein paar kleine
Vorbehalte. Sie haben bemerkt, dass hier, wo
rote Linie und rechte Linie stehen,
zwischen Kleinschreibung unterschieden wird Das heißt, wenn ich
dieses große L in ein kleines L
ändere , können
Sie sehen, dass ich diese rote Linie
darunter habe , die besagt, oh, ich kann das nicht wirklich im System finden .
Es existiert nicht. Das liegt daran, dass ein
Kleinbuchstabe L und ein
Großbuchstabe L in Sharp C zwei
sehr unterschiedliche Dinge sind. Behalte das im Hinterkopf. Es
muss Groß- und Kleinschreibung beachtet werden. Die letzte Sache ist, dass alle Zeilen mit einem Semikolon enden
müssen. Wenn du das Semikolon vergisst, dann wird uns
etwas Ähnliches passieren. Du siehst diesen kleinen
roten Kringel hier. Wenn wir mit der Maus darüber fahren, heißt
es,
dass Semikolon erwartet Es sagt
dir also tatsächlich, was das Problem ist. Wenn Sie jemals eine
Ära haben, in der Sie die rote Linie haben und
versuchen, das Programm auszuführen, werden
Sie
so etwas bekommen Und Sie werden sich bei Ihren
Programmierprojekten
sehr gut mit
diesem Dialog vertraut machen , Und dann wird es dir sagen, was
das Problem hier unten ist. Sie können darauf doppelklicken
und es macht Sie darauf aufmerksam. Und das heißt nur, dass
das Semikolon fehlt. Nun, ich habe sehr
kurz darüber gesprochen, was diese bewirken. Lassen Sie uns hier einfach
über diesen Teil sprechen. Wir wollen sagen,
oh, hey, schwarzes Fenster. Schreiben Sie die Zeile ins Fenster und wir wollen Hello World
schreiben. Das ist alles, was es tut. Das hast du dir komplett selbst ausgedacht. Aber jetzt habe ich dir gesagt, dass wir das tatsächlich erweitern
können. Wir können tatsächlich sagen, oh, hey, stimmt,
Drei Hallo-Welten. Wir speichern das, klicken auf die Schaltfläche und jetzt haben wir drei davon. Jetzt sehen Sie in unserem Beispiel, wohin das
führt. Gleich zu Beginn habe ich
gesagt, dass wir das Mr. Beast-Logo
anzeigen werden. Jetzt habe ich eine
Ask-Datei für das Mr. Beast-Logo. Ski ist nur eine
Textdarstellung eines Bildes. Ich zeige dir jetzt
, was das bedeutet. Es wird alles Sinn ergeben. Sie können es
hier sehen, ich habe ein Mr. Beast-Logo hier im Notepad Und ich habe die Konsole
direkt davor hinzugefügt, sodass wir das hier sehen können Ich werde das alles einfach
kopieren. Und ich werde es zwischen
diese geschweiften Zahnspangen
einfügen , wie ich bereits erwähnt habe.
Ich werde das speichern Ich werde
den grünen Knopf drücken. Ich werde dieses
Fenster öffnen, damit wir es sehen können. Und ich werde nach oben scrollen. Das ist unsere allererste
Software. Sobald jemand
Ihre Software öffnet, wird
er
das Mr. Beast-Logo sehen. So einfach können wir diese Botschaft
modifizieren und ein ganz neues Bild
erstellen. Wenn wir uns den Code hier ansehen, sind
es nur mehrere Anweisungen in der rechten
Zeile, die all diese Ms hier und
ein sehr schönes
Charakterdesign auf dem Logo hier
erzeugen . Bevor ich diese Lektion beende, werde
ich Ihnen nur zeigen,
wie das alles zusammenhängt. In deinem Kopf ergibt das Sinn. Erinnerst du dich, als wir
ein brandneues Projekt erstellt haben und wir dieses Standortfeld haben? Nun, ich gehe jetzt einfach
in diesen Ordner. Jetzt bin ich in diesem Verzeichnis
auf unserem Computer. Wir können sehen, dass Visual
Studios
eine Reihe von Ordnern
und Dateien für uns erstellt hat. Hier drin haben wir eine
sogenannte Lösungsdatei, und es wurde ein weiterer Ordner erstellt. Also gehen wir da rein. Es
wurden noch mehr Dateien erstellt. Dieser hat unsere Codierung. Aber wenn wir in
diesen Bin-Ordner hier schauen und dann in diesen
Debug-Ordner hier, in diesem, können
Sie sehen, dass es hier
in der Mitte
ein paar Dateien gibt . Das ist unsere Binärdatei, und weil ich Windows verwende, wurde eine EXE-Datei erstellt, Fas Wenn wir darauf doppelklicken, können
wir es zum Beispiel sogar an
einen Freund schicken Sie können darauf doppelklicken. Wenn Sie es maximieren, können
Sie das Mr.
Beast-Logo sehen . Sie können sehen, dass
das alles so zusammenhängt. Visual Studio sagt
dem Compiler, oh hey, nimm den ganzen Code,
erstelle eine EXE-Datei, Fas, und lege ihn hier in diesen
Ordner Über all die anderen Dateien werde ich zu einem späteren Zeitpunkt
sprechen. Aber
der Einfachheit halber erstellt
es unsere EXE-Datei schnell, und das ist unsere
allererste Software
5. 1-2. Variablen: Jetzt werden wir darüber sprechen, ob ich
eine sehr einfache Variable einführen werde. Ich werde
Ihnen zeigen, wie es funktioniert, was Variablen sind
und wie sie
davon profitieren können und
solche Dinge, Variablen. Lassen Sie uns darüber sprechen, was sie sind. Zunächst haben wir hier eine
Beispielanwendung. Da steht nur „Hallo
Welt“ in einem schwarzen Fenster. Und das ist alles, was es tut, wie
Sie genau dort sehen können. Jetzt werde ich
eine sogenannte Variable
vorstellen und darüber sprechen,
wie sie uns helfen können. Lassen Sie uns einfach eine Variable einführen. Ich kann in einer Sekunde
darüber sprechen. Ich nenne es Test. Wir werden ihm
den Wert Hello World geben. Ich werde hier nur
den Variablennamen eingeben. Lassen Sie uns also darüber sprechen
und darüber, was das bewirkt. Also, was ich hier mache, ich initialisiere eine
sogenannte Variable Das ist jetzt die Variable. Es heißt Test, also ist dies
der Name unserer Variablen. Jetzt kann diese Variable beliebig
genannt werden. Es könnte Schinken-Sandwich genannt werden. Es spielt wirklich keine Rolle. Aber der Punkt ist, dass Sie ihm einen Namen geben
müssen wo er für
Sie Sinn macht, Sie können sich darauf beziehen. Denn wenn Sie
eine Softwareanwendung haben , die Tausende von Variablen hat, werden
Sie sehr
verwirrt wenn Sie sie alle
verschiedenen Arten von
Sandwiches oder zufällige Namen
wie Test oder
ähnliches nennen Sandwiches oder zufällige Namen wie Test oder
ähnliches Also muss es für dich Sinn
machen. Also
nenne ich es einfach Hello World. Also das ist
der Name unserer Variablen, das ist
der Wert unserer Variablen. Das ist es also, was wir hier
in unsere Variable einfügen. Nun, dieser Teil hier ist ein
sogenannter Typ. Das ist jetzt eine Zeichenkettenvariable. Was eine Zeichenkettenvariable ist, sie ist ein Container für
Wörter, Sätze. Sie können hier ein ganzes Buch
hineinlegen, wenn Sie möchten. Es sind alles alphanumerische Buchstaben und Zahlen, aber als Zeichenfolge es keine Zahlen an sich, es ist kein Dezimalwert, es ist kein Datum oder eine Uhrzeit
oder so etwas
Kompliziertes Das ist eine Zeichenfolge. Das ist ein
sogenannter Variablentyp. Das ist der Variablentyp, der
besagt, hey, Computer, wir wollen eine neue Variable starten
und sie in den Speicher legen. Der Name unserer
Variablen ist dieser. Das Gleichheitszeichen gibt an, wie
wir es initialisieren, also ihm einen Wert geben Wenn Sie
mit Zeichenketten arbeiten, setzen
wir den Wert immer
in doppelte Anführungszeichen Wie in den doppelten Anführungszeichen steht der Wert für unsere Variable. Wir beenden jede
Zeile immer mit einem Semikolon. Jetzt heißt unsere Variable Hello World. Lass uns das Programm
ausführen. Sie können sehen, dass es
Hello World im Fenster ausgibt. Es macht genau das
Gleiche wie zuvor. Das ist zu erwarten , weil wir nichts
geändert haben. Wir haben gerade
eine Variable deklariert
und initialisiert und
geben sie wie zuvor in das
schwarze Fenster aus Genau das Gleiche, was
wir hier tun. Eine Sache ganz schnell,
bei Variablennamen, was ich immer mache, ist, die
Groß-/Kleinschreibung zu verwenden , immer mit einem
Kleinbuchstaben am Anfang. Jetzt liegt es an Ihnen, aber im Allgemeinen neigen die
Leute dazu, Variablen so zu verwenden. Wenn Sie in Zukunft in einem
Unternehmen arbeiten und das möchten, werden
andere Leute vielleicht das möchten, etwas Ähnliches
tun. Es ist gut,
gute Praktiken einzuführen. Nun, das ist der einzige
Grund, warum ich das mache. Dann jedes nächste
Wort, hallo Welt. Dann wird es Großbuchstaben geben. Wenn wir hier ein anderes Wort haben, dann wird dieses mit Großbuchstaben
beginnen. Das nennt man einfach
Standards, es ist optional. Lassen Sie uns darüber sprechen, was
Deklaration ist und was Initialisierung bedeutet, um diese beiden Begriffe
abzudecken Ich werde hier auf
unser kleines Beispiel näher eingehen. Ich werde jetzt darauf eingehen, wie
geht es dir so? Und dann werde ich die Variable erneut auf
dem Bildschirm ausgeben . Dann werde ich die Anwendung
ausführen. Damit du sehen kannst, was vor sich geht. Sie können hier im
Fenster sehen, dass es Hallo Welt heißt. Wie geht's dir?
Schau dir an, wie das funktioniert? Sie können hier sehen, wir haben unsere Variable
definiert, wir haben ihr einen Typ gegeben. Jetzt geben wir der
Variablen nur einmal einen Typ. Wir sagen, oh, hey, Computer, das ist unsere Variable, die
ich benutzen möchte. Das ist übrigens unsere neue Variable, es ist eine
Zeichenkettenvariable. Das haben wir jetzt einmal gemacht. Wir müssen
dem Computer nicht mehr sagen, dass es sich um eine Zeichenfolge handelt, der Computer weiß es bereits
und merkt sich das. Jetzt überschreiben wir jedes Mal, wenn
wir unsere Variable
ändern ihr einen neuen Wert
geben, und ihr einen neuen Wert
geben, einfach das,
was schon drin ist Wenn diese Zeile auftaucht, wird
dieser Teil durch „Wie geht's dir?“
ersetzt Und dann stellen wir
es wieder hier raus. Wir müssen unsere
Variable nicht in einer Zeile deklarieren und initialisieren Schauen wir uns
dieses Beispiel hier an. Ich könnte das genauso machen. Das Gleiche wird passieren. Was ich hier mache, ich
deklariere unsere Variable, deklarieren heißt hey, Computer, ich möchte eine neue Variable erstellen Ich weiß, dass es eine Zeichenfolge sein wird
, aber ich weiß noch nicht, was der
Wert sein wird Vielleicht entscheide ich mich zu einem späteren
Zeitpunkt. Zu einem späteren Zeitpunkt. Okay, ich habe entschieden, was
der Wert sein wird. Es wird Hello World sein. Dann möchte ich
es auf dem Bildschirm ausgeben. Und dann initialisiere ich es hier erneut und gebe
es auf dem Das ist Deklaration oder
Deklaration einer Variablen. Das ist Initialisierung
oder Zuweisung. Es gibt einige Wörter, die Sie in
Zukunft hören werden, wenn Sie weiterhin mit C Sharp
programmieren Sie können sehen, dass wir
das in zwei Zeilen machen und die Ausgabe genau
dieselbe ist wie zuvor, was zu erwarten war. Eine letzte Sache: Wenn wir hier
eine Variable deklarieren und versuchen, sie auszugeben ohne
sie zu initialisieren oder zuzuweisen, dann wird ein Fehler
ausgegeben Wir können diese
rote, verschnörkelte Linie sehen. Wenn wir mit der Maus
über die rote Linie fahren, haben
wir eine kleine Ahnung, wo das
Problem liegt Und es heißt nur, Verwendung einer nicht zugewiesenen Variablen, Es sagt uns, was
das Problem ist. Jedes Mal, wenn wir einen Fehler haben, können
wir das Programm nicht ausführen, da wir diese Fehler immer
beheben müssen. Das ist eine sehr grundlegende Ansicht darüber wie Variablen in C Sharp funktionieren.
6. 1-3. Datentypen: Okay, lassen Sie uns über
Datentypen sprechen, was sie sind, wie sie uns helfen können, warum wir sie verwenden können und alles dazwischen. Also ich habe hier eine
Beispielanwendung. Es macht nicht wirklich viel. Wir deklarieren und initialisieren hier
zwei Zeichenkettenvariablen und geben sie
in unserem schwarzen Fenster aus. Wenn ich die Anwendung hier starte, heißt
es nur Sponge
Bob Square Pants Mir ist ein Beispiel eingefallen
, wie man Datentypen viel einfacher erklären kann. Ich habe mir ein Beispiel ausgedacht. Hast du jemals
Top-Trumps-Karten oder
Pokémon-Karten oder Ausrüstung
oder etwas Ähnliches gespielt , wo du den
Namen des Charakters hast, vielleicht einige Attribute wie Alter,
Gewicht, Größe, Seltenheit
oder Ich denke, das würde
Datentypen ziemlich gut repräsentieren. Und hilf mir, sie zu erklären damit du
sie viel einfacher verstehst. Stellen Sie sich eine Karte vor, die einen Namen hat
und möglicherweise ein Alter hat. Dies ist zum Beispiel das
Alter des Charakters. Jetzt ist Sponge Bob einer
dieser Charaktere , die alle Altersstufen überschreiten Ich werde 21 setzen. Das ist eine Variable vom Typ String, das ist ein Datentyp. Ein anderer Datentyp, den wir verwenden können,
ist ein sogenannter Integer. Was nun eine Ganzzahl
ist, ist eine Zahl. Wir können tatsächlich mit der Maus darüber fahren und Visual Studio
gibt uns tatsächlich mehr
Informationen darüber Es stellt eine
32-Bit-Ganzzahl mit Vorzeichen 32 Bit bedeutet nur die Größe Wie viele Informationen können
Sie hier eingeben. Ich denke, es liegt irgendwo
zwischen minus 2 Milliarden und positiven 2 Milliarden. Ich denke, das Alter
passt ganz gut dazu, es wird nur 23 Ziffern sein. Wenn wir Variablen
vom Typ Integer verwenden, brauchen
wir diese doppelten
Anführungszeichen nicht wie bei Zeichenketten. Wir brauchen nur eine
Zahl genau hier. Noch eins, vielleicht das Gewicht, und das wird in Pfund sein. Vielleicht wiegt dieser Schwamm
etwa 120 Pfund, so
etwas in der Art.
Noch eine Höhe. Jetzt werden wir die
Höhe in Fuß und Zoll angeben. Ich werde es
in Fuß und Zoll angeben, damit ich Ihnen einen neuen Datentyp zeigen kann. Das nennt man Double. Was nun ein Double ist, es steht für Dezimalzahlen. Geben wir hier die Höhe ein. Nehmen wir zum Beispiel an, unser Schwamm
ist drei Fuß, 4 Zoll groß.
So etwas in der Art. Das ist also die Höhe
unseres Schwamms. Wenn wir hier einen Wert von mehr als dem Doppelten haben, entspricht
das einer
Gleitkommazahl mit doppelter Genauigkeit. Sehr kompliziert, nicht wahr? Und deshalb
lernen die Leute aus Tutorials, ein Doppel steht für eine Dezimalzahl. Das ist alles mit einem
Dezimalpunkt. Jetzt Dezimalzahlen Lassen Sie uns ganz schnell über
Dezimalzahlen sprechen. In C Sharp können wir
eine Dezimalzahl auf
drei Arten darstellen eine Dezimalzahl auf
drei Arten Ein anderer wird Float genannt. Lassen Sie uns danach Zahlen setzen. Wenn Sie eine Variable verwenden, müssen
sie alle eindeutige Namen
haben. Lass uns Dezimalzahlen machen. Das ist eine andere Art, wie
wir Dezimalzahlen berechnen können. Dies sind die drei Arten, wie wir Dezimalzahlen in C
darstellen können Dezimalzahlen in C
darstellen Der Hauptunterschied
ist die Präzision. Jetzt ist Float, glaube ich, 32-Bit. Es sind nur sieben Ziffern. Sie können ihm mehr
als sieben Ziffern geben, aber dadurch wird er abgeschnitten. Kürzen Sie es bei sieben. Nach sieben Ziffern verliert man alles, was die ganze Genauigkeit hier ausmacht. Jetzt ein 64-Bit. Etwas mehr, glaube ich. 15 Ziffern, 15 bis 16 Ziffern.
Es ist also genauer. Also können wir hier bis zu 15 reinstellen. Standardmäßig wird ein Double
verwendet, wenn Sie
Dezimalzahlen in C Sharp verwenden. Wenn ich Standard sage,
erkläre ich das gleich. Die letzte ist dezimal. Dieser ist,
glaube ich, 128 Bit,
viele, viele Ziffern. Ich glaube, 28 Ziffern, ziemlich lang. Wir verwenden Dezimalzahlen, wenn wir
über Dinge sprechen , die mit Geld zu tun haben Wenn Sie zum Beispiel einen
Antrag
für die Verwaltung von
Steuern als Regierungsbehörde schreiben , möchten wir
sicherstellen, dass jeder seine Steuern
zahlt, bis sicherstellen, dass jeder seine Steuern
zahlt Dezimalpunkt wirklich weit über dem Wenn man mit Geld zu tun
hat, muss es wirklich,
wirklich genau sein , und dafür würden wir eine Dezimalzahl verwenden. Sie können hier sehen
, dass ich beim Initialisieren dieses Float-Datentyps mit
variabler Höhe eins ein kleines F ans
Ende setze. Das sagt C scharf. Hey, ich möchte
einen Float-Wert initialisieren. Das liegt daran, dass standardmäßig
Double verwendet wird. Sie können sehen, wenn ich ein Double
initialisiere, muss
ich
keinen Buchstaben am Ende platzieren Jedes Mal, wenn ich hier einen
Dezimalwert eingebe, geht C Sharp davon aus, dass
es sich um einen doppelten Wenn ich hier
einen Float initialisieren möchte, muss
ich sagen, oh,
das ist übrigens ein Float-Datentyp Denn wenn ich das nicht mache, kannst
du sehen, dass es eine rote Linie gibt Ich bewege den Mauszeiger drüber. Da steht, dass buchstäbliche Typ Double nicht implizit
kompliziert
sein kann , oder? Es heißt im Grunde, verwende ein Suffix, um ein
Literal dieses Typs zu erstellen Es heißt im Grunde, hey, du hast einen Float-Datentyp, setzt ein F ans Ende
und dann sind wir zufrieden Gleiche gilt für Dezimal, ich
weiß nicht, ob Sie nicht ein D oder etwas
Beschreibenderes verwenden, es wird wahrscheinlich
von etwas anderem verwendet Dieser will ein M. Und
wenn wir kein M eingeben, sagt er Ihnen,
dass Sie ein M eingeben sollen.
Deshalb heißt IDEs IDE,
genau wie Visual Studio, wirklich gut Es sagt dir eigentlich, was dir fehlt und
was du tun musst. Wenn Sie etwas
wie Notepad verwenden, wird
es Ihnen das nicht sagen Es hilft dir,
viel schneller zu programmieren. Das sind also die drei
Arten, wie wir
Dezimalzahlen darstellen können , und wir werden
nur das
Doppelte für die Höhe verwenden. Die Höhe unseres
Schwamms ist drei Punkt, ich weiß nicht, drei Fuß, 4 Zoll, so etwas in der Art. Ich denke, das wäre
gut. Nun, der nächste, den ich vorstellen
möchte, ist ein
Bolen, dargestellt durch bool Was könnte das Booling sein? Ob unsere
Sammelkarte die erste Ergänzung ist? Also werde ich seine erste
Ergänzung hinzufügen. Ich werde wahr sagen. SpongeBob ist eine sehr
seltene Sammelkarte und es ist die erste Ergänzung,
also wird es wahr sein Nun können boolende Datentypen den Wert true oder den Wert false
haben Nur einer dieser
beiden Werte ist wahr. Wenn es ja oder falsch ist. Nein. So verwenden wir
Boolings in C So ist es wahr oder falsch.
Nur zwei Wertsachen. Wenn Sie nach einer Variablen suchen, die drei oder vier Werte haben
kann, dann verwenden Sie kein Booling Booling gilt nur für zwei Werte. Das Letzte, über das ich jetzt sprechen werde
, ist, dass es viele
Datentypen in C Sharp
gibt Wir können Datumsangaben, Uhrzeiten,
verschiedene komplizierte Dinge wie
Listen und solche Dinge machen verschiedene komplizierte Dinge wie Listen und solche Dinge Aber um ehrlich zu sein, was
Zeichenketten, ganze Zahlen Dezimalwerte wie die doppelten
Boolings und Zeichen
angeht, hier können wir
so ziemlich alles schreiben, jede Menge Software nur
mit diesen Vielleicht werden wir in Zukunft
mehr behandeln. Der letzte, über den ich sprechen werde
, Charaktere, die
von Shah repräsentiert werden, genau hier. Dafür nenne ich
es Klasse. Ist die Note unserer Karte ausgezeichnet? Also das könnte ein oder ist
es schlecht? Das könnte ein sein. Dann könnte eine durchschnittliche Karte
so aussehen, als ob Sie eine Prüfung ablegen. Unsere Note könnte also
ungefähr so sein. Und das ist eine sehr gute Karte. Die Erstausgabe ist
neuwertig und hat die Note A. Wenn Sie
Zeichenvariablen initialisieren, verwenden
wir hier einfache Anführungszeichen, keine doppelten Anführungszeichen. Visual Studio macht hier
einen guten Job. Wenn Sie die Anführungszeichen vergessen, wird
es
Ihnen wahrscheinlich sagen, dass Sie
sie benötigen , oder es wird Ihnen ein kryptischer
Fehler wie dieser Ja, jetzt haben wir all unsere verschiedenen Variablen
mit all ihren verschiedenen Typen
deklariert und initialisiert mit all ihren verschiedenen Jetzt möchte ich
sie nur noch auf dem Bildschirm ausgeben. Sie können sehen, dass sie
gerade die grüne
Linie unter jedem haben , wenn ich hier das Alter verwende. Beobachten Sie, wie die grüne Linie mit zunehmendem Alter
verschwindet, und das liegt daran, dass
wir sie jetzt verwenden. Ich werde hier
durch die Möglichkeiten der Bearbeitung eine für
jede andere Variable einfügen hier
durch die Möglichkeiten der Bearbeitung eine für
jede andere Variable . Wir können hier jetzt sehen, dass
wir all das auf dem Bildschirm ausgeben , wenn
wir
diese Anwendung ausführen Jetzt können wir
all unsere verschiedenen Werte für
all unsere verschiedenen Variablen sehen all unsere verschiedenen Werte für
all unsere verschiedenen Variablen Wir sehen den
Vornamen, den Nachnamen, das Alter, das Gewicht, die Größe. Stimmt, weil es die
erste Ausgabe ist und auch eine sehr
gute Sammelkarte ist.
7. 1-4. C# - Eine stark statisch getippte Sprache: Ich möchte jetzt über zwei
Dinge sprechen, die mit C Sharp zu tun haben,
nachdem wir verstanden haben,
was Datentypen Nun ist C Sharp
eine so genannte stark typisierte Sprache und auch eine statisch
typisierte Lassen Sie uns darüber sprechen, was
diese beiden Begriffe sind. Eine stark typisierte Sprache, das heißt, sobald wir eine Variable namens
Vorname
definiert und
ihr den Datentyp Zeichenfolge gegeben
haben, eine Zeichenfolge sein muss
sie während der gesamten Lebensdauer
der Anwendung Wir können zum Beispiel nicht Vornamen
nehmen und ihm dann
einen ganzzahligen Wert geben , weil
er das nicht mag Das liegt daran, dass es sich um eine
stark typisierte Sprache handelt. Wenn Sie jedoch eine
Sprache wie Python verwenden, können Sie dies tun, ist überhaupt kein Problem. Das liegt daran, dass es sich nicht um eine
stark typisierte Sprache handelt. In diesem Fall ist das eine
stark typisierte Sprache. Sobald Sie eine Zeichenfolge definiert haben, haben
Sie ihr einen eindeutigen Namen gegeben Sie können hier dann keinen
anderen Datentyp hineinstopfen. Du kannst nicht sagen, oh, jetzt möchte ich sagen, dass es wahr ist, zum Beispiel, es wird
nicht funktionieren. Es wird
dir sagen, dass es sich um stark typisierte Sprache
wie C Sharp handelt, die letzte ist eine so genannte statisch typisierte Wenn wir zum Beispiel einen Fehler machen, der
mit einem dieser Datentypen zusammenhängt, haben wir den Vornamen Daher erwartet es eine
Zeichenfolge in doppelten Anführungszeichen, wie hier, wenn wir ihr
eine Ganzzahl geben ,
wird sie sich beschweren. Es wird eine rote
Linie darunter angezeigt. Immer wenn wir eine
rote Linie darunter haben, etwa dieser Fehler hier, können
wir
die Anwendung nicht kompilieren. Es geht nicht um Buchstaben, es geht nicht um Buchstaben. Wenn
Sie beispielsweise Windows verwenden, kompilieren Sie Ihren Code in eine EXC-Datei und geben Sie ihn einem Freund zur Ausführung. Es wird
nicht funktionieren Das liegt daran, dass diese Fehler bei der Kompilierung erkannt
werden. Und genau das ist eine statisch
typisierte Sprache. Wenn wir einen
solchen Fehler machen, werden
wir ihn nicht
zu
einem späteren Zeitpunkt entdecken , wenn ein Benutzer die
Software verwendet Das ist ein ziemlich guter
Vorteil von C Sharp und auch Sprachen wie C
Plus Plus, die sich sehr ähnlich sind. Sobald wir eine Zeichenfolge vom Datentyp haben, benötigt
sie einen Zeichenkettenwert. Diese Fehler werden bei der Kompilierung
erkannt. Und dann drücken wir hier diese grüne kleine Play-Taste. Das ist eine stark
typisierte Sprache. Und auch eine statisch
typisierte Sprache, C Sharp ist beides
8. 1-5. Mit Strings und Teilzeichenfolgen arbeiten: Okay, schauen wir uns an,
wie wir mit
einigen
Variablen vom Typ String in C Sharp arbeiten können einigen
Variablen vom Typ String in C Sharp Hier haben wir eine
Beispielanwendung. Wir haben nur
Vorname und Nachname, und wir geben beide in unserem Konsolenfenster aus Nun, wie können wir tatsächlich zwei Zeichenketten miteinander
verbinden? Ich habe einen variablen Vornamen, einen variablen Nachnamen. Im Moment werden sie getrennt
auf zwei verschiedene Zeilen verteilt. Aber wie füge ich
diese zusammen? Was wir hier tun können, das heißt,
zwei Zeichenketten zu verketten, und das ist nur eine ausgefallene
Art zu sagen, verbinde Verkettung, das könnte
kurz Concat sein. Diese Worte werden Sie vielleicht in
Zukunft hören, wenn Sie
Ihre Reise mit
dem Scharfen C fortsetzen Schauen wir uns an, wie wir diese
beiden Saiten miteinander verbinden. Was ich
tun werde, ich werde einen sogenannten Operator verwenden . Sie können dieses Plus also hier sehen. Und was das macht,
es nimmt einfach diese, diese Zeichenfolge und verbindet sie miteinander. Sehr einfach, nicht wahr? Jetzt führen wir die Anwendung aus. Wir können sehen, dass wir Sponge Bob und eckige Hosen in einer Zeile haben. Aber Sie können sehen, dass es hier keinen
weißen Raum dazwischen gibt. Schauen wir uns also an, das hinzuzufügen. Was wir hier tun können, ist eine weitere Zeichenfolge
hinzuzufügen und das Plus-Symbol zu
verwenden. Auch hier nehmen
wir die erste
Variable, den Vornamen. Wir verketten es und verbinden
es mit diesem leeren Y-Leerzeichen, das ebenfalls eine Zeichenfolge ist Und dann verbinden wir es
mit dem Nachnamen, eine
Variable ist Nun, das ist keine Variable, wir brauchen hier keine Variablen. Wir könnten das leicht machen, und es ist genau dasselbe. Auf diese Weise
verwenden wir diese Variable nicht einmal, aber die Ausgabe wird genau dieselbe
sein. So können wir
zwei Zeichenketten miteinander verbinden. Nur damit du es vollständig verstehst, können
wir hier sogar
eine Variable erstellen und wir können Vorname
plus Nachname machen. Dann können wir
hier den vollständigen Namen eingeben und wir werden
genau das gleiche Ergebnis haben. Vergessen wir hier nicht unseren
weißen Raum. Es sieht ansehnlich aus und wir werden
die Anwendung ausführen Sie können hier sehen, dass wir
genau das gleiche Ergebnis haben. Wir verwenden
hier nur eine Variable namens vollständiger Name. Und das ist nur das
Zusammenfügen Verketten,
Leerraum So können wir
zwei Zeichenketten miteinander verbinden,
ganz einfach Teilstrings ganz einfach Was ist eine Teilzeichenfolge? Nun, eine Teilzeichenfolge ist nur eines von vielen verschiedenen Dingen, die Sie mit Zeichenketten in C Sharp
machen können Hier ist ein Beispiel. Hier
haben wir eine Variable namens Name. Es hat Sponge Bob Square
Pound gibt den Wert an. Und wir sind gerade dabei, es auf
den Bildschirm zu bringen,
sagen wir zum Beispiel, ich möchte einen
bestimmten Teil dieser Zeichenfolge extrahieren. Ich möchte das
Wort Schwamm daraus extrahieren. Ich will den
Rest nicht,
ich will nur diesen
Teil hier haben. Nun, was wir tun können, wir
können
eine sogenannte Teilstring-Methode verwenden , um
einen Teil unserer Zeichenfolge zu extrahieren Und genau das ist eine Teilzeichenfolge. Es ist ein Teil einer Zeichenfolge. Ich könnte das nehmen,
ich könnte das nehmen. Ich könnte nehmen, was ich will. Ich könnte sogar einen
Brief annehmen, wenn ich wollte. Schauen wir uns an, wie wir eine Teilzeichenfolge
tatsächlich verwenden können. Was ich tun werde, ich möchte Schwamm, die Variable,
extrahieren Wir können es nennen, wie wir wollen, nennen
wir es Schwamm. Warum nicht? Wir möchten Sponge initialisieren,
sodass wir unser Gleichheitszeichen verwenden. Wenn wir mit einer Variablen arbeiten, können wir hier den
Namen der Variablen angeben, also den Namen
, in
diesem Fall, wenn wir
einen Punkt oder einen Pfeil verwenden , wie auch immer
Sie es nennen möchten Danach haben wir all diese verschiedenen
Dinge, die wir damit machen können Einige der
häufigsten sind immer
oben mit diesem schwarzen
Stern neben ihnen. Einer von ihnen ist Substring. Wir können viele
Dinge tun, die wir ersetzen können. Wir können die Anzahl der Zeichen verringern. Wir können es aufteilen, wir können viele
verschiedene Dinge tun. Wir wollen Substring verwenden. Wir können darauf doppelklicken, wenn
wir hier Klammern öffnen.
Wir haben einige Optionen, die
wir damit machen können Jetzt werde ich
viel später
über dieses Zeug sprechen , wenn ich über Methoden
spreche Aber in den meisten Fällen werde ich hier nur zwei Dinge reinschreiben. Und genau das
möchte ich hier tun. Jetzt, in Sharp C, fängt
alles bei Null an. Der Index ist bei Null. Diese Zeichenfolge hier,
dieses Zeichen hier, das ist Position Null. Das P ist Position 123. Alles fängt bei Null an. Denken Sie daran, dass das Vorwärtsgehen Zeichenposition Null
unserer quadratischen
String-Sponge-Bob-Hose ist. Der erste Wert hier ist also Null, weil wir an Position Null
beginnen wollen. Dann gibt der nächste Wert wie viele Buchstaben Sie aus
der Zeichenfolge Sponge 12345 extrahieren
möchten .
Es sind tatsächlich sechs Jetzt wollen wir hier
die ersten sechs Zeichen aus dem
Schwamm extrahieren . Das sind die Werte, die
wir hier eingegeben haben. Wenn das für Sie verwirrend ist,
lassen Sie uns zu dem zurückkehren, wo wir
über die rechte Zeile der Konsole gesprochen haben . Wir hatten die rechte Zeile der Konsole und haben die Klammern
geöffnet Wir wollen unsere Variable
auf das schwarze Fenster setzen. Nun substring, in diesem Beispiel wollen
wir ihr zwei Werte geben Und wenn wir ihr zwei Werte geben, trennen
wir sie durch
ein Komma, also wollen wir
das erste Zeichen
und wir wollen sechs Zeichen vorwärts zählen, was
wir dann als Sponge extrahieren sollten Jetzt wollen wir Sponge auf
unser Konsolenfenster setzen , damit wir das Ergebnis
tatsächlich sehen können Lassen Sie uns unsere Anwendung kompilieren. Das können wir mit Output
Sponge genau hier sehen. So funktioniert der Teilstring sehr vereinfacht. Wenn wir zum Beispiel Bob extrahieren
wollen, beginnen wir bei Position sechs und zählen drei Dann können wir sehen,
dass
wir Bob extrahiert haben . So funktioniert eine Teilzeichenfolge Eine andere Sache, die wir tun können, ist ein
sogenannter Ersatz. Wir haben hier
quadratische Sponge-Bob-Hosen. Nehmen wir an, wir wollen Sponge
Bob durch etwas anderes ersetzen, sagen wir Patrick oder
so. Lassen Sie uns eine neue Variable erstellen. Wir nennen es Pat for Patrick. Es spielt keine Rolle
, wie wir es nennen. Wir arbeiten hier mit unserer Namensfolge.
Wir lassen das hier stehen Wenn wir den Punkt erneut drücken, bekommen
wir all diese Dinge, die wir damit
machen können , und wir werden doppelklicken,
ersetzen durch, ersetzen. Wir können alles durch etwas
anderes ersetzen. Was ich tun möchte, ich
möchte Sponge Bob ersetzen. Ich will ihm den
neuen Wert geben, Patrick. Immer mit einem Semikolon enden. Das bedeutet, den Namen zu
nehmen,
alles, was in dem Namen steht ,
es nimmt all das, wir wollen
jedes Vorkommen durch den Typ
SpongeBob ersetzen , dass wir es durch
Patrick ersetzen wollen Dann wird das Ergebnis dieser
Operation in Pat gespeichert. Dann können wir Pat hierher bringen. Wenn wir die Anwendung ausführen, können
wir jetzt sehen, dass dort
Patrick Square Pants steht. liegt daran, dass wir
jedes Vorkommen von
Sponge Bob durch Patrick ersetzen . Und wenn ich jedes Vorkommnis
sage, versuchen wir das, starten wir
die Anwendung. Es hat jedes Vorkommen
von Sponge Bob durch Patrick ersetzt . So
funktioniert der Ersatz in C Sharp. Und auch hier
müssen Sie
das Ergebnis dieser Berechnung nicht
in einer ganz neuen Variablen speichern . Wir können das abkürzen, es
einfach dort ablegen, und das
wird genauso gut funktionieren. Sie können sehen, wie Patrick das
Quadrat wiegt. Patrick Patrick. Sie können sehen, wie das Ersetzen funktioniert, wenn es um Zeichenketten geht. Eine andere Sache, die wir mit
Zeichenketten machen können , ist, die
Länge der Zeichenfolge zu berechnen. Das ist sehr einfach. Hier habe ich eine Variable
namens Beispiel. Das ist alles in dieser Variablen
, mit dem man arbeiten kann. Beispiel: Ich setze danach einen kleinen
Pfeil und gebe Länge ein,
um das Ganze schneller zu
machen Sie können
darauf doppelklicken oder die Tabulatortaste
auf der Tastatur
drücken Das könnte für
Sie in Zukunft viel schneller sein, diese Werte einzugeben , wenn ich
die Anwendung
kompiliere. Jetzt können wir sehen, dass dieser Satz hier
44 Zeichen lang ist. Das ist sehr nützlich,
wenn Sie Teilstrings verwenden , um bestimmte
Dinge aus einer Teilzeichenfolge zu extrahieren Lassen Sie uns über eine andere
Methode namens Index of sprechen. Was Index of nun tut, ist, wenn Sie ein Wort
wie Sponge Bob angeben, wird
es Ihnen
tatsächlich sagen wo es
sich in der Zeichenfolge befindet. Anstatt beispielsweise
1-234-567-8910,
Zeichenposition
22, zu zählen , müssen
wir nicht zählen, sondern können eine Methode namens index of verwenden Wenn ich Index einfüge, dann möchte ich zum Beispiel Sponge Bob eintragen dann möchte ich zum Beispiel Sponge Bob eintragen. Das wird in doppelten Anführungszeichen
stehen, weil Sponge Bob eine Zeichenfolge ist, wir wollen
das Ergebnis davon speichern. Wenn wir nun den Mauszeiger über den Index von bewegen, können
Sie hier
neben diesem rosafarbenen Würfel sehen, dass dort „t“ steht. Das bedeutet, dass
das Ergebnis eine ganze Zahl
sein wird , s
definiere eine neue Ganzzahl Ich nenne es einfach Index. Dann gebe ich
den Index im Fenster aus. Lass uns das ganz schnell machen. Sie können sehen, dass
Sponge Bob hier offenbar auf Charakterposition 22 ist . Das sind 22 Zeichen im Index von Das ist eine weitere Methode, die sehr
nützlich ist , um den Index eines
beliebigen Wortes zu ermitteln. Sie könnten zum Beispiel
einfach so etwas eingeben. Wenn wir das ausführen, erhält es das erste Vorkommen
, von dem dieses hier ist, 012, das ist das
erste Vorkommen Auch hier gibt es viele
verschiedene Dinge, die Sie mit dem Index von tun
können,
aber das ist ein Beispiel
9. 1-6. Mit Zahlen arbeiten: Okay,
schauen wir uns einige
Beispiele für die Arbeit mit
Zahlen in C Sharp an. Wir werden uns
Multiplikation, Addition,
Subtraktion, Division ansehen ,
all das gute Zeug Also lass uns loslegen. Schauen wir uns ein Beispiel für
eine Ergänzung an. Also, wie wir Zahlen scharf addieren. Wir haben hier eine
Beispielanwendung. Wir definieren einfach eine Variable, setzen sie auf Null und
geben sie auf dem Bildschirm Also
ist hier nicht wirklich viel los. Wir werden unsere Variable verwenden. Ich mache einfach fünf plus vier,
was, wie wir wissen, neun ergibt Ich
führe das Programm einfach und wir bekommen
die Ausgabe von Neun. Das Hinzufügen ist sehr einfach, Sie können damit weitermachen usw.
Sehr einfach Gleiche gilt auch für die Subtraktion, wir können so ziemlich das Gleiche
tun Fünf minus sechs ist minus eins. Sie können sehen, dass die Subtraktion
auch sehr einfach ist. Auch das können Sie
tun, indem Sie beide mischen. Es ist nicht wirklich wichtig. Es wird das
für dich regeln. Multiplikation Lassen Sie uns drei mit
vier multiplizieren , um
Zahlen in C zu multiplizieren Benutze hier diesen Asterix, den kleinen Stern, und wir
sollten 12 als Ergebnis bekommen Auch hier können wir Multiplikation mit
Addition und Subtraktion
kombinieren, so
wie Sie es zum Beispiel in der
Mathematik tun Nun, hier
gibt es ein paar Fallstricke. Bei
der Division ist
das Dividenzeichen ein Vorwärts,
lassen Sie uns ein einfaches 13/3 machen. Lassen Sie uns die Anwendung als ist
das Dividenzeichen ein Vorwärts,
lassen Sie uns ein Eins
ausführen Weil es eins gibt, gibt es
13,3. Das Ergebnis ist eins. So teilen wir
Zahlen jedoch auf. Okay? Hab einen. Nummer
eins ist dividiert durch Null Wir können eigentlich nicht durch Null
teilen. Du kannst es jetzt tatsächlich sehen. Wie dem
auch sei, damals vor ein paar Jahren, wenn Sie drei mal Null machen würden, konnten
Sie die Anwendung ausführen
und es wurde eine Fehlermeldung angezeigt. Da es sich nicht eine realistische Berechnung
handelt, kann sie sie nicht ausrechnen. Jetzt haben wir eine rote
Linie darunter, und wenn wir den Mauszeiger darüber bewegen, heißt es Division
durch Konstante Null Damit können
wir unser Programm nicht wirklich ausführen, aber da das
Variablenergebnis Null ist, wir es einfach
dort ein und führen das Programm Und wieder schlägt es
genauso fehl wie es sollte. Der erste Fehler, den wir bei der Kompilierung festgestellt haben, als wir versuchen
, die Anwendung auszuführen, weil wir hier Null verwenden, sagt uns, dass wir die Anwendung nicht
ausführen konnten. Aber als ich ihr eine
Variable gegeben habe, deren Ergebnis ebenfalls Null ist, können
wir sie austricksen, um das Programm auszuführen,
aber wir erhalten immer noch den Fehler, wenn wir versuchen, durch
Null zu dividieren, was wir nicht tun können Das sollten
Sie also immer berücksichtigen , wenn Sie
mit Division arbeiten Sie sollten niemals durch Null teilen. Wenn wir in Zukunft über
If-Anweisungen sprechen, werde
ich Ihnen zeigen, wie
Sie
Ihr Programm davor schützen können , durch Null zu
dividieren und das andere Problem in
Bezug auf die Division ist die Verwendung von
Dezimalzahlen Schauen wir uns ein Beispiel für eine
Dezimalzahl an. Wir werden hier einen
doppelten Datentyp verwenden und ihn einfach auf Null
initialisieren Lassen Sie uns jetzt einfach ein Beispiel machen. Lass uns 3.45 0.6 machen, was gut funktionieren
sollte. Sie können hier sehen,
hier ist
das Ergebnis im Dezimalformat Wenn wir jedoch
200/3 sagen , handelt
es sich nicht um eine
ganze Ganzzahl, sondern um eine
Dezimalstelle Wenn wir
die Anwendung ausführen, können
Sie jedoch sehen, dass sie
hier tatsächlich gerundet Ich glaube, es ist bis zur
nächsten Ganzzahl heruntergefahren ,
die 66 ist Wenn wir jedoch
0,0 am Ende hinzufügen und die Anwendung ausführen, können
Sie sehen, dass dies hier
die richtige Antwort ist, 66,666 kommt immer wieder Dann wird auf sieben gerundet. Darauf sollten Sie
achten , wenn Sie
mit Dezimalzahlen arbeiten C sharp geht davon aus denn wenn Sie hier
zwei Zahlen haben, ist
diese 200 eine Ganzzahl, drei ist eine Ganzzahl. Keine
dieser Dezimalzahlen,
es ist nur das Ergebnis, das eine
Dezimalzahl ist Was C-Sharp
tut, ist zu sagen, oh, hey, hier ist
eine Ganzzahl Oh, hey, hier ist eine Ganzzahl. Ich gebe dir das
Ergebnis als Ganzzahl. Das ist ein bisschen nervig. Was Sie tun müssen, ist
mindestens eine davon in eine Dezimalzahl
zu ändern . Wenn Sie das tun, können Sie
sehen, dass wir hier das wahre Ergebnis erhalten. Das ist nur etwas, was Sie wirklich beachten
sollten wenn Sie mit der
Division von Dezimalzahlen arbeiten. Der nächste Operator, den ich Ihnen
zeigen werde, ist der
Modulus-Operator Setzen wir das einfach als Ganzzahl
zurück. Nun, was der
Modulo-Operator
macht, gibt Ihnen den Rest
einer Berechnung Lassen Sie mich ganz schnell ein Beispiel machen. Der Modul wird
durch eine Prozentmarke dargestellt. Hier, was das bedeutet, steht
da, wie oft
wird drei zu sechs Nun, aus drei wird
zweimal sechs und dann
gibt es keinen Rest. Das Ergebnis wird
Null sein , weil es der
Rest ist. Auch hier gilt: Wenn ich 22 mache,
kommt 63 Mal zusammen, wieder
perfekt,
es bleibt kein Rest übrig. Wenn ich hier jedoch vier einfüge, wird aus
vier einmal sechs. Es gibt jedoch einen
Rest von zwei, also wird das Ergebnis zwei sein. Was der Modulus macht, gibt Ihnen den Rest einer Berechnung Nachdem Sie diese Zahl
in diese aufgeteilt haben, wird aus
14 einmal
sechs und der Rest ergibt zwei Wenn ich die
Anwendung starte, erhalten wir zwei, genau wie im
allerersten Beispiel, drei wird zweimal zu sechs
und es gibt keinen Rest, das Ergebnis sollte Null sein. Modulus ist sehr nützlich
, wenn wir wissen wollen, ob eine Zahl genau
in eine andere Zahl passt Wenn das Ergebnis Null ist, wissen
wir, dass es perfekt durch diese
Zahl teilbar Das ist Modulus
oder Modulo, wie auch immer
Sie es nennen wollen Und es wird durch
einen einzigen Prozentsatz repräsentiert ,
einfach so Jetzt möchte ich
über die Reihenfolge der
Operationen sprechen , wenn man
mit Multiplikation,
Addition, Subtraktion und
all dem guten Zeug arbeitet Addition, Subtraktion und
all dem guten Zeug Lassen Sie mich Ihnen ein Beispiel zeigen. Ich habe ein Ergebnis, das ist unsere Variable fünf multipliziert mit vier -2/7. Ich möchte das Ergebnis
von fünf plus eins
addieren Schauen wir uns dieses Beispiel
an. Wenn Sie in der Vergangenheit viel
Mathematik gelernt haben, können Sie diesen Abschnitt vielleicht
überspringen. Es mag für Sie ziemlich
offensichtlich sein, aber C sharp funktioniert
ziemlich genau so wie Mathematik
in der realen Welt. Wenn du diese Dinge jemals
auf Facebook oder Instagram gesehen auf Facebook oder Instagram und sie sagen, oh, was
ist die Antwort darauf? Und die Leute geben
die falschen Antworten, weil sie
die Reihenfolge der Abläufe nicht verstehen. Hier haben wir dieses Ding in der Mathematik, das
Bid Mass oder Bodmass genannt wird Lass mich dir das jetzt zeigen. Bid Mass, manche Leute
nennen es Bodmass. Es ist nicht wirklich wichtig.
Der einzige Unterschied ist das Ich hier und das O hier. Aber sie bedeuten dasselbe. Also das Erste sind Klammern. Wenn wir eine
Berechnung wie diese haben, passiert
alles, was in den
Klammern steht, zuerst. Fünf plus eins. Das passiert
zuerst, also sechs. Und dann können wir das entfernen und es wird durch sechs ersetzt. Das nächste, was
passiert, ist das I oder das O, das mit
oder mit der Quadratwurzel von potenziert wird. Das Zeug
haben wir hier nicht , also können wir das überspringen. Das nächste Ding ist Division. Als nächstes passiert die Division, und das ist 2/7.
Ich bin mir nicht sicher, was 2/7 ist,
es ist eine Dezimalzahl, aber das wird als Nächstes passieren Diese Berechnung hier. Das nächste, was
passiert, ist Multiplikation. Das hier,
das wird berechnet, als nächstes fünf
multipliziert mit vier, was 20 ist Dann alle Additionen danach, dann wird
das Ergebnis zu sechs addiert,
gefolgt von einer Subtraktion, bis
das allerletzte
, was passiert, das hier ist Das ist die Reihenfolge, in der
das berechnet wird. Es passiert nicht
von links nach rechts. Fünf mal vier zum Mitnehmen, zwei. Es passiert immer
in der Reihenfolge
der Symbole, genau
wie in der Mathematik Wenn wir zum Beispiel das Programm
ausführen, nun, es kann alles geklärt werden. Für uns ist das Ergebnis 26. Das ist die Reihenfolge der Operationen. Etwas, das Sie beachten sollten , wenn Sie
damit in C Sharp arbeiten. Das Letzte,
worüber ich bei der
Arbeit mit Zahlen sprechen werde , ist zwei hoch
zwei, also vier. Falls Sie sich mit Mathematik nicht sehr gut
auskennen, bedeutet
die Potenz von einfach, wie oft sie mit sich selbst
multipliziert wird Zwei hoch zwei ist dasselbe
wie
zwei multipliziert mit 22 zur
Dreier zu sagen, bedeutet im Grunde zwei mal
22 multipliziert mit zwei multipliziert
mit zwei Auch das ist es, was die Macht von ausmacht. Der Grund, warum ich Ihnen die Macht
von
zeige , ist, dass die
Potenz von
kein Symbol wie
Multiplikation oder Subtraktion Wir müssen den
sogenannten mathematischen Namensraum verwenden Schauen wir uns das jetzt an.
Wenn ich Ergebnis sage, was die Variable ist, die
wir hier definiert haben, dann sage ich Mathe MAT H mit einem Großbuchstaben M. Wenn ich hier auf
das Punktsymbol drücke, gibt es viele verschiedene
Dinge, die wir tun können. All dies ist hier in
unsere C-Sharp-Bibliothek integriert, und wir können jedes davon verwenden. Schau, das Schild, die Autos, hellbraun,
gekürzt, logarithmisch,
all das ausgefallene Zeug Aber was ich einfach
einsetzen werde, ist Macht, Kriegsgefangene repräsentiert wird Wenn wir hier Klammern öffnen, wird nach unserer
ersten Zahl gefragt.
Es heißt, dass eine
Gleitkommazahl
mit doppelter Genauigkeit potenziert wird. Nehmen wir
an, wir wollen zwei hoch zwei betrachten. Es wird nach einem Doppelten gefragt, was eine Dezimalzahl ist. Ich werde 2,0 eingeben, weil es das
im Dezimalformat haben will. Ich möchte es wieder auf
die Potenz von zwei erhöhen es mit einem Semikolon
beenden. Zwei hoch zwei heißt
zwei, multipliziere mit zwei. Die
Antwort sollte vier sein. Sie können hier sehen, dass
die Antwort vier ist. Wenn wir zwei mit
der Potenz von Drei machen wollen , sollte
es acht sein. Sie können sehen, wohin das führt, 163264128. Da hast du's. So macht man die Macht von, aber nicht nur die Macht von. Sie können in diesem Matheunterricht hier tatsächlich viele
Dinge
anwenden , alle verschiedenen Dinge hier. Aber das ist ein Beispiel dafür,
wie man die Macht von
Zahlen nutzt und mit ihnen im Geschäft arbeitet.
10. 1-7. Benutzerinput erhalten: Werfen wir einen Blick auf die
Interaktion mit unserer Software. In den meisten Fällen können
wir, wenn wir unsere Anwendung ausführen, nur die
Ergebnisse auf dem Bildschirm sehen. Aber jetzt möchte ich, dass Sie mit Ihrer Software
interagieren. Sie können ihm
einige Informationen geben. Schauen
wir uns zum Beispiel an, wie man das
mit einer Konsolenanwendung macht. Im Moment haben wir eine
Beispielanwendung, sie druckt nur
Ihren Namen auf den Bildschirm. Wenn ich das starte,
heißt es nur, wie heißt du? Ich möchte hier
meinen Namen eingeben können , zum
Beispiel Robert. Und wenn ich dann die Eingabetaste drücke, möchte
ich, dass es
zum Beispiel Hallo Robert sagt .
So etwas in der Art. Wir können die
Lesezeile genau hier verwenden. Bisher haben wir diese Zeile
nur
benutzt, um die Anwendung anzuhalten, damit unser Fenster
nicht geschlossen wird. Denn denken Sie daran, dass
das Fenster ohne dies sofort verschwindet. Es hat jedoch
eine Funktion, was Read Line tut. Es erfasst tatsächlich
einige Eingaben von uns. Was passiert, wenn wir den
Mauszeiger darüber bewegen? Es sagt dir tatsächlich, dass es die nächste
Zeichenzeile aus dem
Standardeingabestream
liest Zeichenzeile aus dem
Standardeingabestream Ziemlich kompliziert ist
das nicht. Im Grunde genommen unsere Eingaben erfasst, wenn wir die
Eingabetaste
auf der Tastatur drücken. Das Ergebnis davon
können wir in einer Zeichenfolge speichern. Wenn wir darüber nachdenken, können
Sie die Zeichenfolge hier sehen. Das kommt zu uns zurück. Wir können eine neue Variable definieren. Wir nennen es Ergebnis. Wir
könnten es Benutzereingabe nennen. Wir können es nennen, wie
wir wollen. Was wir
jetzt tun, wir erhalten das Ergebnis dieser Operation, das ist eine Lesezeile
, alles aufnimmt
, was wir dort
eingeben, nachdem wir die
Eingabetaste gedrückt haben , und
es in dieser Variablen hier speichert Dann möchte ich zu dem
Namen, den Sie hier eingegeben haben,
Hallo sagen Namen, den Sie hier eingegeben haben,
Hallo Denken Sie daran, wie man
Zeichenketten verkettet. Wir haben hier unsere erste
Zeichenfolge, hallo. Zeichenketten sind in doppelte
Anführungszeichen eingeschlossen. Dann wollen wir eine Zeichenfolge mit
dem Ergebnis dieser Operation
verbinden , die ebenfalls eine Zeichenfolge ist. Das
werden wir dort machen. Wir wollen
wirklich begeistert klingen. Wir werden auch ein
Ausrufezeichen setzen. Wir verbinden drei
Fäden. Hallo, das
Ausrufezeichen und das Ergebnis, eine Zeichenkettenvariable aus dem Ergebnis
der Benutzereingabe Lassen Sie uns diese Anwendung ausführen. Jetzt heißt es,
was ist dein Name? Ich werde Robert setzen. Wenn ich die Eingabetaste drücke, haben
wir nichts daran liegt
, dass wir ihm nicht gesagt
haben, dass das Konsolenfenster geöffnet bleiben
soll. Lass uns das wieder da
hinstellen. Drücken Sie die Play-Taste,
geben Sie unseren Namen Hit ein und jetzt
heißt es Hallo Robert. Es ist ziemlich einfach, nicht wahr? Und so erfasst man Benutzereingaben in einer
Konsolenanwendung.
11. 1-8. Übung - Das Zahlenmultiplier-Spiel: Okay, schauen wir uns jetzt
ein kurzes Beispiel an. Eine kleine praktische
Anwendung, um
Ihr Wissen über die Arbeit
mit Zahlen in C Sharp zu testen . Ich werde auch
einige der Kenntnisse testen , die
Sie bisher gelernt haben. Und ich werde das Konzept
der
Konvertierung von Datentypen vorstellen , Konvertieren einer Zeichenfolge
in eine Ganzzahl. Schauen wir uns das jetzt an. Also was wir
tun werden, wir werden einen Beispielrechner
bauen, aber unser Rechner wird
nur zwei
Zahlen miteinander multiplizieren. Es ist kein sehr schicker
Taschenrechner. Fangen wir hier an. Wir heißen unsere Zahlenzange
willkommen. Wir möchten dem
Benutzer sagen, was das ist. Wir werden sagen, oh, hey, willkommen zu unserem
Zahlenmultiplikator Dann werden wir
nach ihrer ersten Zahl fragen. Das ist die erste
Zahl, sie werden mit einer anderen Zahl
multipliziert. Was ist deine erste Zahl? Wir fragen den Benutzer nach
seiner ersten Nummer. Um Benutzereingaben zu erfassen, verwenden
wir die Konsolenlesezeile. Dann
müssen wir das Ergebnis in einer Variablen speichern, wir nennen diese erste Zahl. Jetzt enthält die erste Zahl
die erste Nummer des Benutzers. Jetzt sehen Sie sofort diese rote Linie unter der
Leselinie der Konsole. Wenn wir mit der Maus darüber fahren, was wir hier sehen können
, kann die
Typzeichenfolge nicht implizit in int konvertiert werden Das heißt, okay,
schau, die Lesezeile gibt dir eine Zeichenfolge, weil wir
nach der Eingabe des Benutzers fragen Und sie könnten einen Satz schreiben, sie könnten viele Buchstaben schreiben. Wir wissen im
Grunde nicht, was der Benutzer
hier eingeben wird, aber wir
wollen eigentlich eine Ganzzahl daraus ziehen. Der Benutzer könnte Hallo eingeben und wir versuchen,
Hallo in eine Ganzzahl zu
setzen, also wird es dort ein Problem geben. Was wir tun wollen, ist die Convert-Bibliothek zu
verwenden. Das heißt, wenn Sie
convert to a capital C eingeben und dort Punkt
drücken, dort Punkt
drücken, bekommen
wir viele Optionen, die
wir hier machen können. Was konvertiert?
Es gibt uns viele verschiedene Methoden zur
Konvertierung von Datentypen. Wir möchten
eine Zeichenfolge konvertieren, da dies die Eingabe
des Benutzers ist. Wir wollen das Ergebnis
als Ganzzahl, die unsere erste Zahl sein wird. Wenn ich hier drücke, will
ich zwei int int 32. Vielleicht habe ich das noch nicht
erklärt, aber ein Standard-INT wird
auch als Int 32 betrachtet. Es ist eine 32-Bit-Ganzzahl. Sie können eine längere
Ganzzahl verwenden, die
mehr Ziffern unterstützt, oder sogar
eine kleinere Ganzzahl. Int 32 ist eine
Standard-Ganzzahl in C Sharp. Wenn ich dazu Klammern öffne,
wird nach einem Zeichenkettenwert gefragt Dies ist die Zeichenfolge
, die in eine Ganzzahl umgewandelt
wird , und
unser Zeichenkettenwert,
nun, das ist das Ergebnis
der Benutzereingabe Das ist die rote Linie der Konsole. Das stellen wir
da hin. Wir schließen unsere Klammern und
setzen einen samischen Doppelpunkt ein Jetzt können Sie sehen, dass die
rote Linie weg ist. In ähnlicher Weise könnten Sie
das Ergebnis einfach
in einer neuen Variablen,
einer Zeichenkettenvariablen, speichern das Ergebnis einfach
in einer neuen Variablen, und diese hier einfügen. Es ist nicht wirklich wichtig, aber wir machen alles in einer Zeile. Als Nächstes
wollen wir uns
die zweite Nummer vom
Benutzer holen , die zweite Nummer. Das wird eine neue Variable sein, die zweite Zahl
genannt wird. Wir möchten den Benutzer fragen, wie
seine zweite Nummer lautet. Jetzt haben wir hier die erste Zahl des
Benutzers in dieser Integer-Variablen
und hier die
zweite Nummer des Benutzers. Jetzt wollen wir das Ergebnis, das das Ergebnis der Berechnung der ersten Zahl sein wird.
Denken Sie daran,
dass
die Multiplikation das Semikolon
der zweiten
Zahl von Asterix ist Asterix Dann wollen wir dem Benutzer sagen, was
das Ergebnis ist.
Lass uns das machen. Wir sagen,
das Ergebnis ist, dann werden wir die Zeichenketten miteinander verketten ,
was
das Dann wollen wir das, damit sich das
Fenster nicht schließt. Lassen Sie uns die Anwendung hier ausführen. Schau, willkommen zu unserem
Zahlenmultiplikator. Was ist deine erste Zahl? Warum nicht Nummer vier? Was
ist deine zweite Zahl? Wie wäre es mit Nummer fünf?
Und das sollte 20 ergeben. Es heißt, das Ergebnis ist 20. Ziemlich cool, nicht wahr? Auch hier können wir verschiedene
Zahlen verwenden, aber das ist eine sehr
vereinfachte Ansicht darüber, wie wir Benutzereingaben
mithilfe der Leseleitung der Konsole abrufen können, wie wir Datentypen konvertieren können Wir konvertieren also eine Zeichenfolge
, die die Eingabe des Benutzers ist, eine Ganzzahl, die hier
unsere Variable ist Wenn wir dann
unsere ganzen Zahlen miteinander multiplizieren, erhalten
wir das Ergebnis und teilen
dem Benutzer nur das Ergebnis Das ist eine sehr vereinfachte
Art , mit
Zahlen in C. Sharp zu arbeiten
12. 2-1. Methoden: Jetzt möchte ich
über Methoden in Sharp sprechen. Wir haben bisher tatsächlich
viele Methoden verwendet. Zum Beispiel ist die rechte
Zeile eine Methode, Lesezeile ist eine Methode, bei
der der
Math-Helfer eine Methode war. Jetzt werden wir unsere eigene Methode
erstellen. Bei der Erstellung von
Methoden in C Sharp haben
sie alle einen Zweck. Wenn Sie einen Job haben
, der normalerweise
mehr als einmal ausgeführt wird , oder
einen komplizierten Job, können
Sie ihn in
eine separate Methode einfügen. Wenn ich Methode sage, finden Sie hier
ein Beispiel für eine Methode. Dies ist die Hauptmethode. Alles innerhalb dieser Methode ist
in
diesen geschweiften Klammern enthalten Hier ist die Hauptmethode eine spezielle Methode, wenn unsere Software standardmäßig
ausgeführt wird Das.NET Framework, das
alles ist , worauf C Sharp aufgebaut
ist, sucht nach einer speziellen
Methode namens main, und sie muss diesen Namen haben Und alle Methodennamen sind einzigartig, sodass sie nicht denselben
Namen haben können, genau wie Variablen Sobald es die Hauptmethode gefunden hat, führt
es den gesamten Code in
diesen beiden geschweiften Klammern aus Hier sind der einzige Code, den
wir haben, zwei Zeilen. Wenn wir die Anwendung ausführen, können
wir Hello World sehen. Und in der nächsten Zeile bleibt
dieses Fenster für uns geöffnet. Schauen wir uns nun die Erstellung
einer brandneuen Methode an,
bei der Static Void steht. Ich werde das in
einem späteren Tutorial behandeln. Lassen Sie uns
es vorerst sehr einfach halten. Nachdem wir static void geschrieben haben. In diesem Fall wollen wir der Methode einen Namen
geben. Denken Sie daran, dass ich gesagt habe, dass Methoden den Zweck
haben müssen ,
die Dinge zu organisieren. Im Allgemeinen sollten sie einen Zweck
haben. Unsere neue Methode, was
ich will,
ihr Zweck, ihre Aufgabe ist es , dem Benutzer Hallo Welt zu
sagen. Das ist das einzige, was
sie tun wird. Jetzt weiß ich, was es ist, was es bewirken soll. Ich kann meine Methode mit einem Namen benennen, der für Worte
Sinn ergibt. Ich nenne
es, sag Hallo Welt. Das wird
unser Methodenname sein. Der nächste Abschnitt ist nun das
, was als Parameter bezeichnet wird. Ich werde später
darüber sprechen. Ich werde
es vorerst einfach halten. Machen Sie eine offene
und eine geschlossene Klammer. Öffnen Sie als Nächstes die Curbrace und schließen Sie die Curbrace
. Einfach so, du kannst
sehen, dass es das nachahmen kann. Unser gesamter Code für unsere
Methode wird hier in diesem hervorgehobenen Abschnitt
zwischen diesem und diesem gespeichert Alle unsere Funktionen für
diese Methode finden Sie hier. Wir möchten dem Benutzer Hallo
Welt sagen. Nun, wir wissen, wie das geht, wir haben es schon einmal behandelt. Das ist diese Codezeile
genau hier. Unsere Methode sagt Hallo Welt. Ihre Aufgabe ist es, Hallo Welt zu sagen. Das wird das also einfach
auf das schwarze Fenster drucken. Im Moment,
wenn wir unsere Software
ausführen ,
wird sie eigentlich nichts bewirken. Warum ist das so? Das liegt daran, die Hauptmethode standardmäßig
ausgeführt wird. Also dieser Abschnitt hier, und das ist
das einzige, was von unserer Hauptmethode ausgeführt wird . Davon wissen wir nichts. Was wir
hier tun müssen, ist zu sagen, oh, hey, kannst du unsere Methode ausführen um unsere Methode auszuführen?
Das machen wir einfach. Wenn wir die Anwendung starten, wird
die Hauptmethode ausgeführt. Es geht runter, diese
Zeile wird ausgeführt. Wenn diese Zeile ausgeführt wird, geht
der Code hier rein. Diese Zeile wird ausgeführt. Die Methode
hat ihre Arbeit beendet. Es geht zurück bis hierher und endet dann
mit diesem Abschnitt hier. Wenn Sie eine
Methode haben, geht sie raus, dann wieder rein
und geht weiter. Wenn wir die Anwendung ausführen, können wir
jetzt Hello World sehen. Das liegt daran, dass wir
jetzt unsere Methode aufrufen. Nur um noch einmal zusammenzufassen, ob ich zu schnell
gegangen bin oder es
ohne diese Zeile kompliziert ist, unsere Methode wird
niemals ausgeführt Wenn wir unsere Software ausführen, können
wir viele davon erstellen 3.000 5.000 1.000 Auch hier müssen
sie alle
einen eindeutigen Namen haben. Aber wenn wir die Software ausführen, wird
nichts davon ausgeführt. Und das liegt daran, dass wir
dem Computer
nicht wirklich sagen , dass er sie
ausführen soll, um eine Methode auszuführen. Auch hier machen wir das wieder, wenn
wir diese Methode ausführen wollen, sehr ähnlich usw. So führt man die Methode aus, so
definiert man die Methode Und das ist eine sehr vereinfachte
Ansicht darüber, wie wir eine sehr einfache
Methode in C Sharp
einrichten können eine sehr einfache
Methode in C Sharp
einrichten
13. 2-2. Methodenparameter: Jetzt möchte ich über
Methodenparameter sprechen. Ein Parameter ist nur
eine ausgefallene Art einer Methode einige
Informationen zu
geben. Bitteschön. Hier sind ein paar Informationen.
Arbeite damit. Wir werden ein Beispiel verwenden. Hier ist ein Beispiel. Wir sagen dem Benutzer nur Hallo Welt
. Sehr einfach. Aber was ist, wenn wir wollen, dass diese
Methode Hallo John,
Hallo Harry oder Hallo Roberto sagt ? Diese Namen kann uns
der Benutzer zur Verfügung stellen. Hier ist ein Beispiel. Wir werden dem Benutzer eine Frage stellen. Wir werden sagen,
wie heißt du? Was ist dein Name. Und dann wollen wir die Benutzereingabe
erhalten , die als Konsolenpunkt lesbar ist. Auf diese Weise erhalten wir
die Eingabe des Benutzers. Und wir speichern das in einer Zeichenfolge. Ich nenne es einfach einen Namen und frage nach dem Namen des Benutzers. Der Benutzer gibt einige
Informationen ein und wir fügen sie in
eine Variable namens Name Nun, unsere Methode hier, ich möchte Hallo sagen, und dann möchte ich, dass sie
das Ergebnis dieser Variablen anzeigt, die der Name des Benutzers
sein wird Wir wissen nicht, was das ist. Der Benutzer kann
alles eingeben, was er will. Jetzt hat sich die Aufgabe dieser
Methode geändert. Ich will nicht,
dass es Hallo Welt heißt. Ich möchte, dass es dem Benutzer
Hallo sagt. Jetzt werde ich Hallo Benutzer sagen. Ihre Aufgabe hat sich geändert, als
ich die Methode aufgerufen habe. Auch hier müssen wir sicherstellen
, dass das hier passt. Es
heißt nicht mehr Hallo Welt. Ich möchte, dass es Hallo
zum Namen des Benutzers sagt. Das ist unsere Variable namens Name. Aber schauen Sie, Sie können sehen,
dass sich hier unten eine rote Linie befindet. Und das liegt daran, dass unsere Methode hier
von dieser Methode isoliert ist. Sie weiß nichts
über diese Variable , weil sie innerhalb dieser Methode,
dieser Methode,
definiert wurde , sie weiß nicht
wirklich davon. So können wir Parameter verwenden
, um dieses Problem zu lösen. Was ein Parameter ist, wir können ihn
innerhalb dieser Klammern definieren. Genau hier werden wir
den Namen der Zeichenfolge eingeben. Jetzt können Sie sehen, dass diese
rote Linie verschwunden ist. Jeder Parameter,
den Sie
hier in eine Methode eingeben , steht in
diesen offenen Klammern Sie können diese Hauptmethode sehen. Nun, dieser Abschnitt hier, , der hat einen Parameter, er hatte die ganze
Zeit einen Parameter. Auch hier können wir, wenn wir
eine Methode definieren, unsere eigenen Parameter hinzufügen. Ich habe
einen so genannten Parameter hinzugefügt und
er heißt Name, es ist eine Typzeichenfolge. In dieser Methode verwenden
wir nun diese Variable,
diesen Parameter, wenn wir unsere Methode von
der Hauptmethode aus
aufrufen. Sie können jetzt sehen, dass es hier
eine rote Linie gibt. Wenn wir mit der Maus darüber fahren, können
Sie sehen,
dass es kein Argument
gibt Jetzt ist Argument gleichbedeutend mit Parameter. Es ist
dasselbe Es wurde kein Parameter angegeben, der dem
erforderlichen Parameternamen
entspricht. Es heißt im Grunde, dass
diese Methode jetzt eine Zeichenfolge benötigt. Wir können es nicht mehr
so nennen. Was wir tun, wir nehmen
unsere Namensvariable, die das Ergebnis
der Benutzereingabe ist, und fügen sie dort ein. Und jetzt können Sie sehen, dass wir die Informationen des
Benutzers
sammeln. Wir geben die Informationen dieses
Benutzers an unsere neue Methode namens
say, hello user weiter. Also geben wir ihr
den Namen des Benutzers. Dann kommt der Code hier rein. Der Name entspricht jetzt dem Wert
, der ihm übergeben wird. Und das ist unser Parameter. Jetzt verwenden wir unseren Parameter indem wir ihn in
das schwarze Fenster ausgeben Dann
kommt die Codeausführung wieder raus. Und dann lassen wir
das Fenster wieder offen, nur damit es nicht verwirrend ist. Wir könnten es nennen,
wie wir wollen. Wir könnten den Namen des Benutzers sagen. Wir könnten es Schinken-Sandwich nennen. Es spielt keine Rolle. Sie können hier die rote Linie
sehen, weil sie dieselbe sein muss. Aber du kannst hier sehen,
dass es hier keine rote Linie gibt. Und das liegt daran, dass
wir es genau hier definieren. Auch wenn der Wert hier
in der Methode enthalten ist, wir ihn nennen,
wenn
wir hier ankommen können wir ihn nennen,
wenn
wir hier ankommen,
wie wir wollen. Es wird immer noch diesen Wert haben, aber es muss nicht
derselbe Name sein, wie hier. Es muss nicht so
sein und genau denselben Namen haben. Es kann sein,
muss es aber nicht. Das
sollten Sie im Hinterkopf behalten. Wenn der Parameter übergeben wird, wird
der Wert übergeben, es wird hier eine ganz
neue Variable neu definiert Aber mit diesem Wert hoffe
ich, dass das Sinn macht, wenn
wir die Anwendung ausführen Jetzt sagen wir,
wie heißt du? Roberto. Jetzt kannst du sehen, dass
es Hallo sagt, Roberto. Wir können das noch einmal ausführen. Wir können Hallo sagen, Henry. So funktionieren Parameter
in einer sehr einfachen Ansicht. Eine letzte Sache: Wir müssen keinen Parameter
haben.
Wir können viel haben. Wir könnten noch
einen anderen Typ haben , wie
Alter, der eine Ganzzahl ist. Jetzt möchte ich nach
dem Alter des Benutzers fragen. Was ist dein Alter? Denken Sie daran, dass das Alter eine Ganzzahl ist, weil
es eine Zahl ist. Ich nenne es einfach Alter. Jetzt haben wir die rote
Linie, weil das
eine Zeichenfolge ergibt und wir sie in eine Ganzzahl
setzen wollen, was nicht funktionieren wird, aber wir haben das schon einmal behandelt. Wir werden es verwenden, wir wollen es
in eine Ganzzahl umwandeln, die 32 Bit
ist, und dann alles in Klammern setzen
. Jetzt haben wir die Zeichenfolge
vom Benutzer in eine Ganzzahl umgewandelt vom Benutzer in eine Ganzzahl Wir setzen es in eine
Integer-Variable namens Alter ein. Jetzt haben wir wieder unsere rote Linie,
das liegt daran, dass wir zwei
Parameter in unserer Methode haben. Jetzt nenne ein Alter. Wenn wir den Mauszeiger über
diese rote Linie bewegen, können
Sie sehen, dass sie jetzt
eine Zeichenfolge und eine Ganzzahl erfordert Wenn wir diese Methode aufrufen, müssen
wir diese
Informationen hier hinzufügen, und wir können ein Komma verwenden Jetzt fragt sie sogar, sie sagt
uns sogar, was wir brauchen Alter, wir nehmen unser
Alter und tragen es hier ein. Jetzt haben wir eine Methode
mit zwei Parametern. Und wir übergeben ihr zwei
Parameter. Wir machen jetzt
nichts damit. Lass uns etwas damit machen. Wir werden jetzt sagen, Alter ist Alter, wenn wir die Software
ausführen. Lass uns das machen.
Wie ist dein Name? Harry. Wie alt bist du? Ich bin 67 Jahre alt. Hallo Harry. Du bist 67 Jahre alt. Auch hier können wir zehn
Parameter haben, wenn wir wollen. Wir könnten verschiedene
Datentypen in B haben, alles verschiedene Dinge. Auch hier gilt: Wenn du mehr hinzufügen willst, ist
es nur eine weitere Sache und
wie du sie weitergibst. Auch hier verwendest du A. So
funktionieren Parameter im Allgemeinen mit
Methoden in C. Sharp.
14. 2-3. Methodenrückgaben: Lassen Sie uns darüber sprechen Informationen
aus einer Methode zurückzuholen. Um das zu tun,
verwenden wir das Schlüsselwort return. Schauen wir uns an, wie
Informationen aus einer Methode zurückgegeben werden. Wir haben hier eine
Beispielanwendung. Es fragt nach dem Namen des Benutzers. Es speichert den
Namen des Benutzers in einer Variablen sagt dem Benutzer
dann
Hallo. Was ich jetzt tun möchte, ist eine Methode zu
erstellen, deren Aufgabe es ist, nach
dem Namen des Benutzers zu fragen und den Namen des Benutzers zu ermitteln und ihn uns
zurückzugeben. Das wollen wir tun.
Um das zu tun, werden
wir jetzt eine neue Methode
entwickeln. Am einfachsten ist es, diese
zu kopieren, alles daraus zu
löschen und ihr einen eindeutigen Namen zu geben. Ihre Aufgabe ist es, nach dem Namen eines Benutzers zu fragen
. Wir wissen, wie das geht.
Wir haben es genau hier. Wir fragen nach
dem Namen des Benutzers und speichern ihn hier in
einer Variablen. Als wir zuvor über
Parameter gesprochen haben
, geht es darum,
Informationen in eine Methode einzubringen. Wir definieren sie hier und
geben Informationen von main ein. Informationen aus Main
zurückzuholen,
das ist es, womit wir uns gerade
befassen, und das wird als Return-Schlüsselwort bezeichnet
. Wir geben Informationen aus einer Methode
zurück, sodass wir sie hier verwenden können. Wenn wir unsere Anwendung starten, werden
wir nach dem Namen eines Benutzers fragen
. Wir erhalten den Namen des Benutzers und
setzen ihn in die Variable ein. Jetzt müssen wir den Namen des
Benutzers wieder
rauswerfen und ihm dann Hallo
sagen. Im Moment können wir das nicht
tun, weil es nicht versteht, was
diese Variable bedeutet, weil sie
in unserer Methode definiert ist. Also müssen wir das hier
rausholen und es hier definieren. Um das zu tun, richten
wir standardmäßig einen
sogenannten
Rückgabedatentyp ein. Hier können Sie sehen, dass es einen
auf Main Even und einen hier gibt. Es heißt Void. Void
ist wie ein schwarzes Loch. Es ist wie das Nichts. Es ist nichts. Aber
was wir tun wollen, ist, unsere
Zeichenkettenvariable hier zurückzugeben, zurück aus der Methode. Wir ersetzen unser Nichts als
Leere durch eine Zeichenfolge. Jetzt haben wir hier einen
Rückgabedatentyp für diese Methode eingerichtet, eine Zeichenfolge, und wir möchten diese Variable hier
zurückgeben Was wir tun, wir
nehmen unsere Variable, wir verwenden das Return-Schlüsselwort. Wir geben ein Leerzeichen ein, setzen unsere Variable und dann
alle Zeilen mit einem Semikolon. Was passiert hier? Wir
fragen nach dem Namen des Benutzers, wir stopfen ihn
in eine Variable und dann geben wir die
Variable aus dieser Methode zurück Sie können sehen, wenn wir die Variable hier
zurückgeben, diese Variable vom
Datentyp Zeichenfolge ist dass
diese Variable vom
Datentyp Zeichenfolge ist,
die mit unserem Methodenheader übereinstimmen muss
, der genau diese
Zeile hier ist Sie können also sehen, dass wir eine Zeichenfolge vom Datentyp
zurückgeben, was hier unsere Variable ist. Jetzt,
zurück zu unserer Hauptmethode. Wir nennen das,
aber wir bekommen
eigentlich keine Informationen daraus. Wir haben das tatsächlich schon einmal gemacht. Sie können die Zeile mit den
Punkten auf der Konsole lesen sehen. Das ist eine Methode, aus der wir tatsächlich
Informationen gewinnen. Und genau
so machen wir das. Wir können das einfach machen und
alles funktioniert wieder. Denken Sie daran, als ich gesagt
habe , dass das nicht dasselbe
sein muss, wir könnten zum Beispiel einfach
einen Namen sagen. Sie können sehen, dass es
immer noch funktioniert, weil Main nur über
alles Bescheid weiß, was in Maine definiert ist. Fragt nach dem Namen eines Benutzers, weiß
nur über die hier
definierten Dinge Bescheid, es sei denn, Sie übergeben einen Parameter oder
geben etwas zurück. Lass uns das noch
einmal durchgehen. Lassen Sie uns
die Anwendung tatsächlich ausführen. Wir können also sehen, dass wir die Anwendung
ausführen. Wie ist dein Name? Bob.
Und hallo Bob. Ziemlich einfach? Nun, es sieht einfach aus, bis ja. Schauen wir uns noch
einmal an, was
passiert , damit es absolut Sinn macht. Wir führen die Anwendung aus und fragen nach
dem Namen des Benutzers. Die Codeausführung erfolgt also hier, es gibt keinen Parameter, also
machen wir weiter. Was ist dein Name? Der Benutzer gibt seinen Namen ein, hier speichern
wir ihn in einer Variablen
namens Name des Benutzers. Wir geben diese Informationen aus der Methode
zurück, die dann im Namen gespeichert wird. Das ist das Ergebnis
dieser Methode. Name des Benutzers,
wir geben ihn zurück Es ist das Ergebnis
dieser Methode, das jetzt in dieser
Variablen namens name
gespeichert ist . Wir geben dann einfach
den Namen für
das schwarze Fenster aus und lassen
das schwarze Fenster geöffnet So funktionieren Rückgaben
mit Methoden in C Sharp.
Denken Sie daran, dass Parameter
Informationen eingeben und
bei Rückgabe
Informationen wieder ausgegeben
15. 2-4. Methoden-Overloading: Jetzt schauen wir uns
etwas
an, das als
Methodenüberladen bezeichnet wird Was bedeutet das?
Schauen wir uns dieses Beispiel an. Hier definieren wir hier
zwei Variablen, beide vom Datentyp Integer namens Nummer eins
und Nummer zwei. Was wir tun, wir
rufen eine Methode namens ad auf, die wir hier erstellt haben. Sie akzeptiert zwei
Integer-Parameter und addiert nur
die Zahlen zusammen. Es gibt das Ergebnis zurück, das hier eine Ganzzahl
ist. Und dann geben wir das Ergebnis auf
dem Bildschirm aus. Sehr einfach. Die Antwort
sollte 20 2022 lauten. Wir haben die richtige Antwort. Was ich jetzt sagen möchte, ist,
was ist , wenn ich
zwei Doppelgänger zusammenzählen möchte Lassen Sie uns diese
ganzen Zahlen in Doppelzahlen umwandeln. Jetzt habe ich hier zwei Doppelgänger. Das könnten 6,4 sein und das
könnte zum Beispiel 16,2 sein. Sie können jetzt sehen, dass wir hier
unten eine rote Linie haben. Weil unsere Parameter ganze Zahlen
sind. Es werden hier ganze Zahlen erwartet. Aber wir wollen immer noch diese Methode, wir wollen immer noch ganze Zahlen
addieren können Ich denke, wir könnten zum Beispiel eine Methode aufrufen und dann vielleicht eine andere Methode und dann vielleicht eine andere Methode
namens Double Und dann würde das zwei Doppelgänger
erfordern. Dann würde die andere zum Beispiel
zwei ganze Zahlen annehmen. So könnten wir das Problem
umgehen. Dann
hätte das natürlich einen Rückgabetyp als Double. Sie können sehen, wohin das führt,
aber was ist , wenn wir
zum Beispiel zwei Dezimalzahlen oder zwei Gleitkommazahlen
zusammen addieren wollen zum Beispiel zwei Dezimalzahlen oder zwei Gleitkommazahlen zusammen Dann können Sie sehen, dass
wir für jeden von diesen
eine Methode haben müssen für jeden von diesen
eine Methode Das ist ziemlich mühsam und
kann unser Programm wirklich aufblähen Aber wir können
etwas verwenden, das als Methodenüberladen bezeichnet wird Das
ermöglicht es uns,
eine Methode zu haben, ihr aber
unterschiedliche Parameter zu geben , aber mit demselben Namen Jetzt kann eine Methode nur dann
denselben Namen haben wenn
beispielsweise die Parameterdatentypen
oder die Anzahl der Parameter unterschiedlich sind. Kehren wir zu unserem
vorherigen Beispiel zurück, in dem wir hier zwei ganze Zahlen
zusammenaddiert
haben Was wir dann tun können,
ist diese Methode zu kopieren. Wir behalten zum Beispiel den gleichen
Namen bei, aber hier addieren wir
eigentlich zwei Doppelzahlen und
nicht zwei ganze Zahlen Sie können sehen, was ich hier jetzt habe,
sind zwei Methoden mit
genau demselben Namen, außer dass diese zwei
ganze Zahlen akzeptiert und eine Ganzzahl zurückgibt Und diese nimmt zwei
Doppelungen und gibt eine Verdoppelung zurück. Wenn wir jetzt unsere Methode hier
aufrufen, wenn ich nur diese
Klammern öffne, haben wir
jetzt diese
kleinen Das hatten wir
vorher nicht, weil wir nur eine Methode mit
einem Satz von Parametern
hatten Und das zeige ich dir jetzt. Wenn ich hier die Klammern öffne, siehst
du, dass es
keinen schwarzen Pfeil gibt Wir haben nur eine Definition
für die Methode add. Aber sobald ich die
zweite hier hinzufüge, stehen uns
jetzt mehr
Optionen zur Verfügung. Jetzt können wir zwei ganze Zahlen
addieren und wir können auch zwei Doppelzahlen
addieren Dies ist ein Beispiel für das
Überladen von Methoden in C Sharp. Es ermöglicht Ihnen lediglich,
verschiedene Optionen für eine
Methode mit demselben Namen zu haben verschiedene Optionen für eine
Methode mit demselben Namen Sie können sehen, dass C Sharp bereits Methoden eingebaut
hat , die dies
nutzen. Wenn wir zum Beispiel
etwas in die Konsole schreiben, können
Sie sehen, ob ich genau
dasselbe mache, diese Methode ist tatsächlich schon 18-mal
überlastet Sie können also sehen, dass es
ein sehr beliebtes Prinzip in der Shop-Programmierung ist, also hoffe ich, dass Ihnen das geholfen hat, und dies ist ein Beispiel für das Überladen von
Methoden in C-Shop
16. 3. Kommentare und XML-Zusammenfassungs-Tags: Jetzt möchte ich über
etwas sehr Wichtiges sprechen. Wenn Sie
Ihr Leben viel
einfacher machen oder das
Programmieren ernster nehmen möchten, dann
müssen Sie Kommentare verwenden. Was sind also Kommentare? Wenn Sie eine sehr
komplexe Anwendung
oder eine sehr komplexe Codezeile haben , ist
sie wirklich lang und vielleicht wussten Sie zu der Zeit, was
das bedeutet. Aber wenn Sie ein oder zwei Jahre später
darauf zurückkommen, haben
Sie vielleicht völlig
vergessen, was das
bedeutet oder wie verrückt Sie zu der Zeit
getippt Deshalb
sind Kommentare sehr nützlich. Es ist
hauptsächlich eine Erinnerung für Sie selbst, aber wenn Sie
mit einem Team von Leuten zusammenarbeiten, erfahren
sie auch, was
der Code macht, ohne dass
sie die ganze Komplexität lesen und
verstehen müssen. In C Sharp können wir Kommentare auf
drei Arten machen. Der erste ist ein einzeiliger
Kommentar. Das könnten wir tun. Du kannst zum Beispiel sehen, wenn ich einen
Kommentar hinterlasse, er grün ist. Nun, dieser Kommentar hier, er wird nicht von
der Software ausgeführt , wenn Sie Ihre Software
produzieren, wie z. B. ein EXC für Windows Er wird nicht hineinkompiliert, sodass Sie mit den Kommentaren weder Speicherplatz noch
Megabyte verschwenden Diese sind wirklich nützlich. Auch hier gilt: Wenn Sie
etwas wirklich Komplexes haben, sagt
es Ihnen nur, was
die nächste Zeile bewirkt. So können wir Kommentare zu so
ziemlich jeder Zeile hinzufügen, die wir wollen. Wir können sie hinter eine Zeile setzen. Auch hier werden sie nicht überfahren, also gibt es keine rote
Linie darunter. Und es sagt dir einfach wirklich
, was die nächste Zeile bewirkt. Im Allgemeinen
platzieren die Leute den Kommentar über dem Code und
nicht daneben, aber Sie können ihn daneben platzieren
, wenn Sie möchten. Lassen Sie uns hier einfach ein paar
Kommentare platzieren. Sie können hier ungefähr sehen,
wie es funktioniert. Ich würde sagen, wir
wissen, dass diese Leitung das schwarze Fenster offen hält. Also kann ich einen Kommentar abgeben, der
besagt, dass das Fenster geöffnet bleibt. Hier heißt es,
sag Hallo zum Benutzer. Ich könnte einen Kommentar hinterlassen
, in dem Hallo gesagt wird. Wenn ich ein Jahr später
darauf zurückkomme und
alles über das Einkaufen vergessen habe, weil das bei Sprachen immer
passiert. Sie können das öffnen und
wissen sofort , was jede
dieser Zeilen bewirkt. Du willst mit Kommentaren nicht
verrückt werden. Sie möchten nicht, dass jede
Zeile einen Kommentar enthält. Aber auf jeden Fall, wenn du etwas nicht
verstehst, dann füge
dort auf jeden Fall einen Kommentar ein, denn das wird dich wieder
daran erinnern und du kannst viel schneller
darauf zurückkommen. Das ist ein einzeiliger Kommentar. Als Nächstes können Sie einen
mehrzeiligen Kommentar , der aus einem Schrägstrich
gefolgt von einem Asterix besteht Wenn ich dann die Eingabetaste drücke, können
Sie sehen, dass
Asterix in jeder Zeile bis ich sie mit einem weiteren Schrägstrich beende Jetzt
ist alles, was ich hier eintippe, alles im Kommentar. Dies ist nützlich, wenn Sie vielleicht eine Methode
oder eine sogenannte Klasse
vorstellen möchten. Das ist die ganze Sache, mit der wir gerade
arbeiten. Nehmen wir an, Sie arbeiten in einem Team von zehn Personen, die
ganz oben in der Akte stehen. Sie wollen sagen, wer es gemacht hat, denn wenn es ein Problem gibt, dann können sie sagen, okay, Bob hat den ganzen
Abschnitt der Software geschrieben. Wir wissen es, weil der
Autor Bob ist, dann kann Bob, wenn er diesen
Teil des Programms macht, wenn er diesen
Teil des Programms macht,
sagen: Ich habe
das gemacht, hasse mich nicht. Dann kann er zusammenfassen,
was es ist. Es ist ein Musikplayer,
es ist großartig, alles, was
er will, da drin Es liegt also wirklich an dir. Aber so macht man
einen mehrzeiligen Kommentar. Sie sind nützlich, um
zu sortieren, um vielleicht herauszufinden, wer die Datei
geschrieben hat und vielleicht
ungefähr, was sie tut. Auf diese Weise müssen die Leute
nicht
jede Methode lesen und versuchen
herauszufinden, was diese Datei macht. Im Allgemeinen stehen mehrzeilige Kommentare am Anfang von
Dateien, vielleicht auch hier oben, sodass die
Leute das Erste sehen können oder es kann über
etwas sehr Kompliziertes gehen, wie eine Methode oder
etwas Ähnliches, dort
würden
die Leute im Allgemeinen einen mehrzeiligen Kommentar verwenden. Wenn Sie zum Beispiel viele
einzeilige Zeilen schreiben möchten , ist
der letzte Kommentar, über den ich sprechen möchte ,
ein sogenanntes XML-Zusammenfassungs-Tag Nun, es ist nicht wirklich wie ein
Kommentar wie dieser an sich, aber er gibt dir
wichtiges Feedback Es gibt dir in einfachem
Englisch Feedback darüber, was vielleicht die nächste
Codezeile tut. Aber wir können diese
vielleicht für Methoden oder
ähnliches verwenden. Wenn Sie eine
komplizierte Methode haben, vielleicht ist sie etwa 100 Zeilen lang, sie macht all diese ausgefallenen Sachen. Vielleicht wird der Name der Methode ihr
nicht wirklich gerecht. Es könnte heißen,
nach dem Namen des Benutzers fragen, aber es macht viele
andere Dinge da drin. Vielleicht gibt es etwas zurück, das vielleicht etwas kompliziert ist oder es hat viele Parameter und Sie wissen
vielleicht nicht unbedingt,
was sie bedeuten. Wir können
ein sogenanntes XML-Zusammenfassungs-Tag verwenden um dies zu erweitern, wobei ich meine Methode nenne. Hier bewege ich den Mauszeiger
darüber,
Sie können sehen, dass es nicht wirklich viel
aussagt. Da steht Schnur Programm, frag nach dem Namen des Benutzers. Wenn ich jedoch über diesen
einen Punkt auf der Konsole höre,
sehe ich mir all die
Informationen dort an. Es heißt, liest die
nächste Zeichenzeile, es sagt mir, was es zurückgibt. Es sind viele verschiedene
Informationen. Ich denke, oh, nun,
wo ist das auf meinem? Wie richte ich das ein? Und das ist ein
sogenanntes XML-Zusammenfassungs-Tag. hier über unserer Methode Sie hier über unserer Methode drei Schrägstriche 12 Und wenn Sie die dritte machen, erstellt
sie diese nette
kleine Vorlage für uns Es ist im XML-Format. Hier ist der Tag mit der offenen Zusammenfassung, hier der abschließende Tag, der die Informationen
hier
darstellt und
besagt, dass der die Informationen
hier
darstellt und
besagt, die nächste
Zeichenzeile aus der Standardeingabe gelesen wird. Hier definiere ich grob
, was diese Methode macht. Wenn jemand mit der
Maus hierher fährt, kann
er schnell sehen,
was das macht,
ohne 100 Codezeilen
lesen zu müssen. Zum Beispiel Es gibt den anderen Entwicklern Informationen darüber, was
diese Methode tut. Sie möchten ihr zum Beispiel
eine sehr aussagekräftige Beschreibung geben . Wenn ich jetzt mit der Maus
drüber fahre, oh, okay. Es fragt nach dem Namen eines Benutzers. Oh ja, ich habe vergessen, dass ich hier einen
geheimen Bitcoin-Miner gebaut habe. Sie können hier zum Beispiel
alles hineinlegen, was Sie wollen, aber es ist zu Ihrem Vorteil Stellen Sie sich vor, Sie legen Ihre
Software für zehn Jahre weg. Sie kommen zehn Jahre später zurück. Du hast alles vergessen. Aber jetzt kannst du
einfach deine Maus
hierher fahren lassen und oh, das, ja, das
habe ich natürlich vergessen. Es ist also gut für Sie, aber es ist auch gut für andere Entwickler,
vielleicht in Ihrem Team. Zum Beispiel haben
wir hier zwei Return-Tags. Und das ist ungefähr das
, was zurückgegeben wird. Also geben wir
den Namen des Benutzers zurück. Denken Sie daran, Sie können
hier einen kleinen Hinweis eingeben , wenn wir den Namen
des Benutzers bekommen, wir sagen, oh, denken Sie daran, dass
es nur sein Vorname ist. Wenn wir mit der Maus darüber fahren, können
wir sehen, dass
der Name des Benutzers zurückgegeben wird, aber wir erinnern uns daran, es nur sein Vorname ist diesem Grund sind diese
XML-Zusammenfassungs-Tags nützlich, denn wenn Sie die
Maus Handumdrehen hierher bewegen, wissen
Sie in einfachem Englisch genau,
was sie tun Diese sind also wirklich nützlich. Und Sie können hier sehen, dass diese Methode einen Parameter
hat. Wenn ich hier dasselbe mache, haben
wir hier eine zusätzliche Sache. Auch hier können wir unsere Zusammenfassung verwenden. Es sagt Hallo, sag
Hallo zum Benutzer. Der Parameter definiert, was
unser Parameter tut, z. B. welche Informationen
wir ihm geben Es wird der Vorname des
Benutzers sein. Das heißt, sag Hallo zu uns. Wenn ich
darüber hinweg bin, können wir hier sehen, grüßen Sie den Benutzer Wenn ich die Klammer hier öffne, sagt
sie mir, was sie
erwartet, aber was
ist der vollständige Name Ist es ein Vorname? Nachname? Spitzname. Aber wenn ich hier runter
schaue Oh, das
ist natürlich
der Vorname, ja. Weil wir uns selbst
daran erinnern, sagen
wir unserem Benutzer, wenn wir unsere Methode aufrufen,
genau, was unsere Methode tut, was sie als Parameter erwartet
und auch, was sie zurückgibt Das sind also die
drei verschiedenen Arten von Kommentaren, die Sie in C Sharp
verwenden können
17. 4-1. If- und Else-Statements: Schauen wir uns etwas
Neues in C Sharp an. Wir werden uns
die if-Anweisung und
auch die el-Anweisung ansehen . E L S E für L. Was für eine Bedingung ist etwas, das als wahr oder falsch
bewertet wird. Schau dir das an. Bist
du Bob? Ist dein Name Bob? Nun, die Antwort ist
entweder ja oder nein. Hast du einen? Entweder hast einen Hund oder du hast keinen Hund. Bist du sechs Fuß groß? Entweder bin ich es oder ich bin es nicht. Sie haben also immer
eine Ja- oder Nein-Antwort. Die Bedingung
ist in diesem Fall Bob, das ist die Bedingung. Sie könnten diese Bedingung erweitern. Bist du Bob, hast du einen Hund? In welchem Fall? All
das ist die Bedingung. Wenn
Sie Bob heißen, aber keinen Hund haben, dann lautet die Antwort nein. Andernfalls ist es ja, wenn Sie zum Beispiel beide
haben, weil es
hier ein Ende gibt, das ist eine Bedingung. Das ist unsere Bedingung. Damit beschäftigen wir uns
täglich, mehrfach. Und wir können sie in
Sharp C darstellen , indem wir eine
sogenannte if-Anweisung verwenden. Lass uns einen Blick darauf werfen.
Eine sehr einfache. Wir werden
eine kleine
Software namens Are you, Bob? entwickeln Software namens Are you, Bob? Was es tut, es fragt
nach dem Namen des Benutzers. Wir nehmen den Namen des Benutzers auf. Wenn der Name des Benutzers Bob ist, werden wir ihn umwerfend grüßen, weil
wir Bob wirklich mögen. Wenn ihr Name nicht Bob ist, dann geben wir ihnen vielleicht ein normales Hallo, Roberto oder etwas Ähnliches. Schauen Sie sich das Format
der if-Anweisung an. Es beginnt mit If,
das ist das Schlüsselwort, den offenen Klammern, genau
wie wir es bei einer Methode tun Öffnen Sie zum Beispiel Klammern innerhalb der Klammern
. Hier stellen wir die Bedingung. Unsere Bedingung ist,
nun, bist du es, Bob? Wir wissen, dass die Namensvariable alles
enthält, was
der Benutzer eingegeben hat, also geben wir einen Namen ein. Dann wollen wir den
Gleichheitsoperator , der
durch zwei Gleichheitszeichen dargestellt wird Wenn Sie
etwas in Sharp C zuweisen, verwenden
wir ein Gleichheitszeichen Aber wenn wir
etwas vergleichen wollen, verwenden wir zwei. Wir sagen, wenn der
Name des Benutzers Bob entspricht, dann müssen wir
etwas in C Sharp tun. Sharp liebt diese lockigen Zahnspangen. Wenn wir eine lockige Klammer als
Methode haben,
wenn wir eine geschweifte Klammer mit einer
If-Anweisung haben, wenn wir eine geschweifte Klammer öffnen, schließen wir immer eine geschweifte Klammer . Sie können sehen, dass diese hier mit diesen hier übereinstimmen. So ist die Sprache einfach. Das ist unsere if-Aussage hier. Dies ist der Inhalt
unserer if-Erklärung. Alles zwischen
den lockigen Zahnspangen. Nun, wie ich schon sagte, wenn der Name des Benutzers Bob ist, wollen
wir ihn umwerfend
grüßen Lass uns versuchen, Englisch zu tippen. Wir wissen, dass sie Bob heißen. Wir könnten genauso gut Bob einsetzen. Hallo Bob. Diese, die heißen Bob, grüßen sie
unglaublich. Schau mal. Wenn
sie jedoch nicht Bob heißen, vielleicht Roberto oder Henry, dann müssen wir ihnen
eine andere Botschaft geben. Wenn wir dieses Programm
jetzt ausführen , können Sie sagen,
wie lautet Ihr Name? Geben wir Henry ein. Es gibt uns ein
normales Hallo Henry. Es ignoriert das sogar komplett, weil
der Name nicht Bob ist Wenn ich die Anwendung
jetzt starte, wie lautet Ihr Name? Nun, ich heiße Bob. Und denken Sie an C Sharp, Groß- und
Kleinschreibung beachten. Deshalb haben wir in
unserer if-Anweisung nur nach einem Widerhaken in Kleinbuchstaben gesucht, also stellen Sie sicher, dass es dem entspricht
. Klicken Sie also auf „Antworten“ Jetzt haben wir unseren
tollen Begrüßungs-Look, aber wir haben ein Problem. Schau. Es sagt auch Hallo Bob. Er bekommt also zwei Grüße. Und das liegt daran, dass die Bedingung der
if-Anweisung, die in diesem Abschnitt
steht, erfüllt ist. Sie wird als wahr ausgewertet. Daher wird diese
Codezeile ausgeführt. Sobald die if-Anweisung beendet ist, führen wir dieses Bit immer noch aus. Aber vielleicht möchten wir
diesen Gruß zum Beispiel
Henry vorbehalten . Deshalb führen wir ein
sogenanntes L-Statement ein. E VERLIEREN, wieder, geschweifte Klammern. Dieser Abschnitt ist Bob
vorbehalten. Dieser Abschnitt ist
für alles reserviert, was nicht Bob ist. Dies wird als wahr ausgewertet, wenn
der Name des Benutzers Bob ist. Es wird als falsch ausgewertet,
wenn es etwas anderes ist. Sonst, all das andere
Zeug gehört hier rein. wollen wir allen
den
üblichen Gruß geben Außer Bob wollen wir allen
den
üblichen Gruß geben. Und so funktioniert die
Else-Anweisung. Also, wenn das hier alles als wahr bewertet
,
wenn es hier alles als
falsch bewertet,
zum Beispiel, wenn ich das Programm
starte, wie ist dann dein Name? Mein Name ist Bob. Jetzt erhalte ich
die Standardbegrüßung, und dieser Abschnitt wird
komplett ignoriert , weil
ich Bob heiße. Aber wenn ich das Programm starte jetzt etwas eintippe, erhalten
wir die Standardbegrüßung weil dieser Teil ignoriert wird, er fällt hier in den Abschnitt „
Andere“. Es kann nicht existieren ohne
ein Wenn wir das nicht tun können
, macht das keinen Sinn. Else braucht immer ein
Ob dazu. Wenn wir versuchen, es auszuführen, wird
es einen Fehler geben. Du kannst nichts anderes alleine haben. Es braucht immer eine
Begleitung, wenn es darüber hinausgeht. Es ist eine sehr vereinfachte Ansicht
einer Beispielbedingung,
nämlich der if-Bedingung
in C. Ich möchte nur ein
kurzes Beispiel durchgehen, damit Sie vollständig verstehen, wie
diese Bedingungen funktionieren Wenn Sie nun
eine If-Anweisung haben, hat
sie eine Bedingung
und eine Aktion Wenn das Ergebnis wahr
ist, wird dieser Abschnitt hier ausgeführt Wenn die Auswertung „Falsch“ ergibt, dieser Abschnitt hier ausgeführt Als wir über Variablen sprachen, hatten
wir eine Bolen-Variable Bolen-Variablen ergeben entweder „
wahr“ oder „falsch“. Was wir tun können, ich
werde nur Klammern verwenden. Klammern sind optional,
aber ich denke, sie verbessern Jetzt speichern wir das Ergebnis in einer Variablen
namens Bob Dann können wir angeben, ob Bob
hier der Name ist, den der Benutzer Bob
gegeben hat. Und wenn ich sage, meine ich, ist es gleich dem
Gleichheitsoperator, ja oder nein, wahr oder falsch? Dann
wird wahr oder falsch in dieser Variablen
namens Bob
gespeichert. Wenn die Anweisung dann ausgeführt wird, wird
sie sagen, dass sie wahr und
falsch ist. Wenn nicht falsch. Wenn ich die Software hier starte, tippe ich Bob ein, hey
Bob, du bist unglaublich. Es ist genau dasselbe. Es gibt Ihnen mehr Klarheit darüber was vor sich geht, falls
das Sinn macht. Ich habe nicht viel über
Boolesche Werte gesprochen, aber es geht im Grunde darum, ob das wahr oder falsch Und das wird
entweder wahr oder falsch sein ,
denn so stellst du es als Booling
dar Und wenn wir dann
die If-Anweisung ausführen ,
ist Bob entweder
wahr oder falsch Und es wird
die passende Version ausführen. Und wenn wir nicht Bob sind, sind wir Henry. Dann heißt es,
hey, zufällige Person.
18. 4-2. Else-If-Anweisungen: Lassen Sie uns nun unser Beispiel für eine
if-Bedingung in unserem letzten Tutorial näher erläutern und
über die el-if-Klausel sprechen. Hier haben wir unseren
Standardgruß für Bob. Aber was wäre, wenn wir einen
besonderen Gruß für Henry haben wollten? Bob erhält seine eigene benutzerdefinierte Nachricht. Henry hat vielleicht
seine eigene benutzerdefinierte, dann
bekommen alle anderen eine Standardnachricht. Hier führen wir zum Beispiel
die Else-If-Anweisung ein. Lass uns hier runter gehen.
Das bedeutet, dass wir Bob ändern wollen, weil wir diesen Zustand bereits
haben Diese Bedingungen müssen wirklich einzigartig
sein. Sonst macht es keinen Sinn. Es wird wirklich überflüssig sein. Also sagen wir jetzt, bist
du Bob oder bist du Henry? Denken Sie daran, lassen Sie uns dafür sorgen, dass unsere
Kommentare Sinn ergeben. Also, ist dein Name Bob? Hallo Bob. Ist dein Name Henry? Oh, hallo Henry. Aber er bekommt mehr
Ausrufezeichen, weil er angerufen hat. Aber wenn du nicht Bob bist, bist
du nicht Henry, dann bist
du alle
anderen ganz unten Geben wir also zum Beispiel
Henry ein. Jetzt bekommen wir den
Henry, weil wir Henry heißen. Ganz einfach. Sobald du verstanden hast, wie
das „Wenn und das Andere“ funktioniert, ist „
Anderes wenn“ einfach etwas anderes. Nochmals, wir können
das sogar erweitern und einen anderen
Namen hier haben, vielleicht Scott oder
so. Sie können das
entsprechend Ihren Wünschen ändern. So funktioniert die
Elif-Anweisung. Auch hier brauchst du kein
El, du brauchst kein anderes. Wenn ich
das zum Beispiel ganz gerne habe, wenn ich etwas anderes eintippe, werden
sie überhaupt keine Nachricht
bekommen weil wir ihr nichts gesagt
haben. Das ist die Stärke der Anweisung el if, wenn
die if-Bedingung verwendet wird. Jetzt werde ich dir
ein paar Ratschläge geben. Jetzt haben wir die Aussage von El
If behandelt. Das heißt, wenn Sie eine Bedingung
haben, zum Beispiel mit nur einer
Codezeile darunter. Wir haben also diese Bedingung,
eine Codezeile. Dann diese Bedingung,
eine Codezeile. Wenn wir eine Codezeile haben, dann sind diese geschweiften Klammern
hier optional Was das bewirkt, indem es
diese entfernt , erhöht es Dadurch wird Ihre Software weniger aufgebläht
. Das ist genau das Gleiche
wie das, was wir zuvor hatten. Wenn wir jedoch beispielsweise zwei oder
mehr Codezeilen unter jeder Bedingung
haben ,
liegt ein Problem vor. Und das liegt daran, dass es diese lockigen Zahnspangen
braucht. Genau hier können Sie sehen, dass es dort
eine kleine rote Linie gibt, und der Fehler ist nicht
sehr Das liegt daran, dass es
versucht, all das in
einer Zeile zu lesen , und es wird ein rätselhafter Fehler ausgegeben Wenn Sie unter jeder Bedingung eine
Codezeile haben, sind die
geschweiften Klammern optional Aber das können Sie zum Beispiel nicht
mit Methoden tun. Nur Dinge wie if, else, if, else und einige andere Dinge haben
wir noch nicht besprochen. Aber das ist ein kleiner
Tipp, mit dem Sie die
Lesbarkeit Ihres Codes in Zukunft
verbessern können Lesbarkeit Ihres Codes in Zukunft
verbessern
19. 4-3. Gleichheits- und Ungleichheitsoperatoren: Gleichheit und Ungleichheit.
Was sind das? Was bedeutet das? Nun, das sind Dinge, die Sie jetzt vielleicht hören werden. Und auch hier haben wir schon ein wenig über Gleichheit gesprochen, als ich
über die if-Aussage gesprochen habe. Aber Gleichheit bedeutet im Grunde , dass etwas
Gleichwertiges mit etwas anderem ist. Und das wird hier
durch zwei Gleichheitszeichen dargestellt. Aber wie sagt man Ungleichheit? Okay, was ist, wenn der
Name nicht Bob ist? Wie stellen wir das dar? Was wir dort tun können, ist das Ungleiche zu
verwenden, was durch
ein Ausrufezeichen
gefolgt von einem Gleichheitszeichen dargestellt ein Ausrufezeichen
gefolgt von einem Gleichheitszeichen Nun, diese ganze Aussage ist ziemlich umgekehrt. Wenn der Name Bob nicht entspricht, dann wird das jetzt keinen Sinn
machen, weil
ihr Name nicht Bob Was wir jetzt tun können,
ist zu sagen, hey Bob. Wenn ich die Software jetzt starte, wie ist dein Name, Bob? Es wird nichts passieren
, weil wir ihm nicht gesagt haben, dass er etwas tun
soll. Aber wenn ich die Software starte
und etwas anderes
einfüge, wird sie sagen,
hey, du bist nicht Bob. Aber wenn ich
diesen Operator einfach in ein Gleichheitssymbol verwandle, wird die
ganze Bedeutung der
ganzen Aussage umgekehrt . Sie können jetzt sehen,
dass es keinen Sinn ergibt , denn obwohl der Name Barb
ist,
läuft es immer noch Wenn du sagen willst, dass etwas
gleich etwas ist , dann
zwei Gleichheitszeichen Wenn du sagen willst, dass
es nicht gleich ist, dann brauchen wir kein Gleichheitszeichen Das ist ein Ausrufezeichen
und ein Gleichheitszeichen
20. 4-4. Vergleichsoperatoren: Okay, Vergleichsoperatoren. Ich habe hier eine sehr einfache
Anwendung. Es fragt den Benutzer nach einer Zahl 1 bis 10 Es nimmt die Eingabe des Benutzers, konvertiert sie in eine Ganzzahl und fügt sie in eine
Variable namens Zahl Das ist so ziemlich das
einzige, was das tut. Was ich tun möchte, wenn der Benutzer eine Zahl
unter fünf eingibt, möchte
ich
dem Benutzer eine Nachricht senden, um ihm mitzuteilen, dass Sie eine niedrige Zahl gewählt haben. Andernfalls haben Sie
eine hohe Zahl gewählt. Sehr einfach.
Um das zu tun, brauchen
wir eine Bedingung, die
wir anwenden werden. Die Bedingung, die wir
sagen werden, ist die Zahl
kleiner als fünf? Wie wir weniger als darstellen,
ist eine linke eckige Klammer, die so aussieht, und dann fünf. Bei der Aussage verwenden
wir dann unsere geschweiften Klammern. Das passiert dann, wenn unsere Zahl kleiner als eine Fünf ist Wir werden dem Benutzer sagen, ich weiß nicht, dass Sie eine niedrige Zahl
ausgewählt haben. So etwas in der Art. Wenn die Zahl jedoch nicht
niedriger als eine Fünf ist, dann
können wir L verwenden, um das so
ziemlich umzukehren. Sie haben eine hohe Zahl ausgewählt
, wenn wir die Anwendung ausführen. Wählen Sie nun eine Zahl von 1 bis 10 Denken Sie daran, niedriger als eine Fünf niedrig ist,
also werde ich vier machen Ich habe eine niedrige Zahl ausgewählt
und das war's. Tolle
Software, nicht wahr? Wenn die Zahl dann fünf
oder höher ist, machen wir eine Fünf. Es sollte mir sagen, dass ich eine hohe Zahl
gewählt
habe, ich habe eine hohe Zahl gewählt. Und wenn ich
1 Million hineingebe, heißt
es, dass ich eine hohe Zahl
ausgewählt habe. Dies ist jedoch ein Beispiel für
einen Vergleichsoperator, der als Kleiner-als-Operator
bezeichnet wird . In ähnlicher Weise könnten wir
den Operator „Mehr als“ verwenden
, der durch
eine rechte eckige Klammer dargestellt wird. Nun, das
wird keinen Sinn ergeben. Diese müssen wir rückgängig machen. Das wird
genau das Gleiche bewirken. Aber Sie können sehen, dass es umgekehrt ist. Wenn die Zahl mehr als fünf ist, haben wir eine hohe Zahl ausgewählt Andernfalls haben wir
eine niedrige Zahl ausgewählt, sie wird
genau das Gleiche tun. Aber weil ich das rückgängig mache, muss
ich diese beiden rückgängig machen. Es macht nur Sinn, dass die anderen beiden mehr
als oder gleich
und kleiner als oder gleich sind . Mehr als oder gleich wird auf diese Weise
dargestellt. Mehr als oder gleich, kleiner oder gleich,
wie Sie vielleicht vermutet haben, wie Sie vielleicht vermutet haben, einer linken eckigen Klammer
und einem Gleichheitszeichen wenn Sie Dinge wie
ungleich, kleiner als,
gleich, mehr als gleich verwenden . Denken
Sie daran, dass das Gleichheitszeichen immer auf der
rechten Seite steht, immer scharf C Wenn der Benutzer nun
eine Zahl kleiner
oder gleich fünf ausgewählt hat , dann hat er offenbar
eine höhere Zahl ausgewählt ,
was nicht stimmt Wir machen das wieder rückgängig. Okay? Weniger als
oder gleich fünf, sie haben eine niedrige Zahl ausgewählt, wir hatten vorher weniger als fünf. Wenn es etwas
bis Nummer vier ist, dann ist es eine niedrige Zahl. Wenn wir
weniger oder gleich sagen wollen, müssten
wir das stattdessen
tun. Da die Zahl
kleiner oder gleich vier ist, ist es eine niedrige Zahl. Weniger als oder gleich
vier ist
dasselbe wie weniger als fünf zu sagen. Auch hier können wir mehr als oder
gleich verwenden , um die Logik umzukehren. Auch hier gilt: Wenn die Zahl
mehr als fünf ist, können wir
diese Aussagen umkehren, wir erhalten genau
dasselbe, was sie in C Sharp
als
Vergleichsoperatoren bezeichnet werden . Wenn wir sieben eingeben, haben Sie eine hohe Zahl
ausgewählt.
21. 4-5. Boolesche Operatoren: Boolsche Operatoren. Es klingt ein bisschen kompliziert,
aber ich versichere Ihnen, dass es das nicht ist Ein Booling-Operator ist
im Grunde eine Ausdrucksweise
und ziemlich schwer zu sagen und ziemlich schwer zu Wir werden ein Beispiel erstellen,
eine einfache Lotterieanwendung Wir fragen den
Benutzer nach einer Zahl, 1—10 Wenn der Benutzer
eine Drei oder Sieben eingibt, dann hat er gewonnen, er hat im Lotto
gewonnen Schauen wir mal,
wir können das umsetzen. Wenn Sie den
Satz laut aussprechen, sagt
er Ihnen ziemlich genau, was
Sie tun müssen, wenn
der Benutzer implizit eine
Zahl auswählt, die drei ist, also sagt
er Ihnen ziemlich genau, was
Sie tun müssen, wenn der Benutzer implizit eine
Zahl auswählt, die drei ist, jetzt
eine Qualität für drei Oder wird durch zwei
vertikale Rohre wie diese dargestellt, 12. Ich weiß nicht warum.
So ist es einfach. Die Zahl ist gleich drei, die Zahl ist gleich
sieben. Es ist sehr einfach. Wenn du laut sagst, sagt es dir so
ziemlich,
was du schreiben musst. Dann möchte ich dem Benutzer
sagen , dass er im Lotto gewonnen hat, dass er die Glückszahl ausgewählt hat, also schauen wir uns das an. Wählen Sie eine Zahl, 1-103 Sie haben gewonnen, lassen Sie uns beweisen, dass es kein
Zufall ist. Nummer zwei, nichts passiert, das liegt daran, dass wir ihr nichts gesagt haben Das ist ein sehr einfaches Beispiel für die Verwendung
des Operators. Sie können mehr als einen verwenden. Sie können vier verwenden
, wenn Sie möchten. Wenn der Benutzer also
zum Beispiel 34 oder neun auswählt , funktioniert das perfekt. Jetzt hast du vier Glückszahlen. Das ist der Operator, ein
sogenannter Bolen-Operator. Der andere Bolen-Operator
ist das Gegenteil. Es ist der eine und der
, durch den man repräsentiert wird, für eine Person, die mehr Sinn
macht Das heißt zumindest, aber
du brauchst zwei davon. Mit dem Endoperator. Was wir tun können, wir können
sagen, wenn die Zahl nicht gleich zwei ist und
sie nicht gleich sieben , dann haben sie gewonnen. Was wir tun können, wenn die
Zahl nicht gleich zwei ist, die Zahl nicht
gleich sieben ist, weil 2,7 schlechte Zahlen sind. Wenn du 2,7 wählst
, hast du alles verloren. Solange die Zahl beispielsweise nicht zwei und die Zahl nicht
sieben ist, haben Sie eins. So können Sie den
Operator verwenden und Sie können sehen, dass die Logik zu der umkehrt, die wir gerade
mit dem Oder-Operator verwendet haben Jetzt verwenden wir nicht gleich, sondern dieselbe Logik,
wenn wir die Anwendung ausführen Solange wir nicht zwei oder sieben mit einem
auswählen, wählen
wir vier. Man
kann es mit einem sehen. Wenn wir jedoch zwei oder sieben
auswählen, wird
es nichts bewirken weil wir ihm nicht gesagt haben, dass
es etwas tun soll. Das ist ein sehr einfaches Beispiel für die
Verwendung von Booling-Operatoren
wie R und End Auch mit diesen können Sie
es erweitern und vier
Zahlen eingeben, wenn Sie möchten Und was wir
mit Operatoren machen können, können
wir auch kombinieren. Schauen wir uns ein kurzes Beispiel
an, wie wir kombinieren können. Und lassen Sie uns nach
dem Namen des Benutzers fragen. Wir werden nach dem Namen des Benutzers fragen und den Namen des Benutzers eingeben. Tun wir jetzt so, als hätte Bob nur Zugriff auf die
Lotterieanwendung , die
wir hier machen. Er ist der Einzige, der
befugt ist, Lotto zu spielen. Was wir sagen wollen,
ist der Name des Benutzers Bob, hat er die
Nummer zwei oder sieben? Und das ist ein Beispiel dafür, wie
wir und zusammen verwenden können. Aber der Punkt ist, dass das
Ganze
entweder als wahr oder falsch bewertet
wird . Das ist der Hauptpunkt
der Erkrankung hier. Entspricht der Name Bob und hat er die
Nummer zwei oder sieben? Also werde ich hier zwei oder
sieben in Klammern setzen. Es ist also
viel lesbarer und es wird Sinn machen Und es wird auch
korrekt berechnet. Also, ist der Name des Benutzers Bob? Ja. Hat Bob die
Nummer zwei oder sieben? Ja. Nehmen wir an, er hat
sieben, dann ist er einer. Nehmen wir an, die Person
heißt Henry. Okay. Ist der Name Henry? Ist der Name Bob? Nein, es ist Henry. Okay. Nein, dann
wird es hier einfach überspringen, also lasst uns die Theorie testen. Also, wie ist dein Name? Henry. Dann geben wir jetzt eine ein. Geben
wir die Glückszahl ein. Ich denke, sieben ist eine davon. Dann passiert nichts
, weil es nicht Bob ist. Nur Bob hat die Erlaubnis , hier potenziell
im Lotto
zu gewinnen . Setzen
wir Bob ein, geben wir ihm eine Glückszahl und er ist eine. Einfach so. Lass uns
Bob mit einer Unglückszahl machen, die definitiv 44 ist Nichts passiert. Sie können sehen, dass es auf
diese Weise
diese ganze Bedingung mit
einem Booling-Operator
und auch mit einem Eins bewertet diese ganze Bedingung mit einem Booling-Operator
und auch Es ist gut, auch Klammern
zu verwenden, um sicherzugehen, dass a
korrekt berechnet
wird, und zweitens, es verbessert auch die Lesbarkeit.
22. 4-6. Übung - Baue ein Taschenrechnerspiel: Deshalb werden wir jetzt eine
kleine Übung machen und dein Wissen
anhand einiger Dinge testen , die
wir bisher gelernt haben. Wir werden
einen Beispielrechner in C Sharp erstellen . Im Moment ist
nicht viel los. Wir sagen dem Benutzer nur:
Willkommen zu unserem Anrufrechner. Und wenn wir das Programm ausführen, passiert
nichts. Also müssen wir
diese Fähigkeit programmieren, was der Benutzer tun wird. Sie geben
ihre erste Zahl ein, die eine Dezimalzahl sein könnte, und dann geben sie einen
Operator plus minus Multiplikation
oder Division Und dann
geben sie ihre zweite Zahl ein. Und dann wird es
die Berechnung durchführen und auf dem Bildschirm einige
Dinge anzeigen ,
die es zu beachten gilt. Erstens
kann der Benutzer Dezimalzahlen eingeben. Wir müssen zum Beispiel sicherstellen, dass wir
unsere Zahlen in
Doppelzahlen umrechnen unsere Zahlen in
Doppelzahlen Als Nächstes müssen wir den Operator, den der Benutzer eingibt,
aufnehmen und
herausfinden, ob es sich um ein Plus, ein
Minus, eine Division oder eine Multiplikation Und dann
entsprechend handeln, indem wir die Bedingungen nutzen. Fragen wir den Benutzer nach seiner ersten Nummer. Wir
wissen, wie das geht. Wir fragen den Benutzer
nach seiner ersten Nummer. Um diese Informationen zu sammeln, verwenden
wir die Console Dot Read Line. Wir wollen das
verdoppeln. Ich habe eine Variable namens first eingerichtet , die die
erste Zahl
speichert,
aber die Console Dot Read
Line gibt eine Zeichenfolge zurück. Wir müssen diese
Zeichenfolge in eine doppelte Zeichenfolge umwandeln. Dazu können wir convert verwenden, wir geben convert period ein und wir wollen doppelte offene Klammern setzen. Setze die Ausgabe
in die Klammern. Und denken Sie dann daran, die Klammern zu
schließen. Jetzt haben wir die erste Nummer des
Benutzers erfasst. Als Nächstes möchten wir den Operator des Benutzers eingeben, aber lassen Sie uns zuerst die zweite Nummer des
Benutzers eingeben. Das liegt daran, dass wir
das einfach kopieren und einfügen können. Es ist viel einfacher. Wir haben die
erste Nummer des Benutzers und die zweite Nummer des Benutzers einfach. Jetzt wollen wir den Operator.
Lass uns das kopieren. Der Operator wird eine Zeichenfolge sein , da uns die Lesezeile mit dem Punkt in der Konsole
bereits eine Zeichenfolge gibt. Wir müssen
nichts konvertieren, damit wir das entfernen können. Wir werden eine neue
Variable namens operator erstellen. Aber sieh dir an, was passiert,
wenn ich das mache. Sie sehen, es ist blau markiert. Es wird ein
Fehler ausgegeben. Warum ist das so? Das liegt daran, dass Operator ein Schlüsselwort in C Sharp
ist. Es wird bereits tatsächlich verwendet. Zum Beispiel können wir keine
Variable mit dem Namen
double erstellen . Sie macht genau das Gleiche. Das liegt daran, dass es
ein reserviertes Wort ist. Wir müssen einen Namen wählen
, der kein Operator ist, weil Operator bereits in der Sprache C Sharp
verwendet wird. Ich nenne es einfach OP. Sie werden vielleicht feststellen, dass ich dachte, ich würde Ihnen
die Informationen jetzt geben. Jetzt wollen wir
sie nach dem Operator fragen. Wir möchten
ihnen vielleicht sagen, was sie tun können. Wir sagen, du
kannst Plus,
Minus, Multiplikation
oder Division wählen Minus, Multiplikation
oder Division Wir nehmen den Operator und speichern ihn in
einer Variablen namens p. Jetzt haben wir alle
Informationen von unserem Benutzer Wir haben die Zahlen und
alles, was wir brauchen. Jetzt
müssen wir herausfinden welchen Operator sie verwenden, und dann
die Berechnung durchführen. Wie finden wir den Operator heraus? Nun, dafür können wir
if-Anweisungen verwenden. Wir sagen ob. Jetzt verwenden wir
den Gleichheitsoperator. Ist der Operator. Da
der Operator eine Zeichenfolge ist, verwenden
wir doppelte Anführungszeichen.
Ist es ein Plus? Der Code darin, wenn wir die geschweiften Klammern einsetzen, wenn die Operation ein Plus ist, sagen
wir f plus Sekunde Aber wir wollen das Ergebnis
in eine Variable schreiben. Definieren wir eine Variable
, die unser Ergebnis speichert. Ich werde es einfach auf Null
initialisieren. Denken Sie daran, dass das Semikolon-Ergebnis dem Ergebnis von
Erster plus Sekunde
entspricht, weil wir
mit dem Plus-Operator arbeiten Was aber, wenn sie
zum Beispiel zwei Zahlen
multiplizieren wollen , dann brauchen wir eine, wenn der Benutzer zum Beispiel
Multiplikation eingibt, dann ist das nicht wahr,
es wird falsch ausgewertet, dann
wird die Codeausführung heruntergefahren Das müssen wir
hier in einem anderen Bereich auffangen. Wenn der Benutzer
eine Multiplikation durchführen möchte , dann prüfen
wir das Und dann multiplizieren Sie einfach
die Zahlen miteinander. Es ist sehr einfach, nicht wahr? Sie können jetzt sehen, wohin
das führt. Mi Takeaway und Division, die Division hier und
der Imbiss hier. So
erkennen wir den Operator hier tatsächlich. In jedem Fall führen wir je nach Bedingung
die entsprechende Berechnung durch und geben das Ergebnis
dann immer hier
in die Ergebnisvariable ein. Das Letzte, was wir tun wollen, ist dem Benutzer
mitzuteilen, was
das Ergebnis ist. Sie können hier sehen, dass mir ein Visual
Studio das anbietet. Ich nehme es, drücke die
Tabulatortaste auf der Tastatur und jetzt ist es für mich geschrieben. Jetzt möchte ich dem
Benutzer sagen, was das Ergebnis ist. Ergebnis, so etwas in der Art. Lassen Sie uns das Programm ausführen
und sehen, ob es funktioniert. Willkommen zu unserem coolen Rechner. Was ist deine erste Zahl? Drittens, was ist Ihr Betreiber? Sie können Plus, Minus,
Multiplikation oder Division wählen. Ich wähle Multiplikation. Was ist deine zweite Zahl? Weil wir wissen, dass drei
mal vier zwölf ist. Darüber muss ich nicht nachdenken. Das Ergebnis ist 12. Nun, das
funktioniert. Lass uns noch einen versuchen. Versuchen wir es mit 200/3, weil wir wissen, dass drei nicht
perfekt zu 200 passt Also können wir das testen. Unser Ergebnis gibt uns tatsächlich
eine Dezimalzahl. Sie können sehen, dass das
Ergebnis 66,6 6667 ist. Wir haben hier also ein gutes
Maß an Genauigkeit. Indem wir Doppelzahlen
anstelle von ganzen Zahlen verwenden, können
wir mit
Dezimalwerten und Zahlen umgehen , die keine ganzen Zahlen sind
, die keine ganzen Dies ist ein sehr kurzes
Beispiel dafür, wie man einen Prequal-Rechner in C Sharp erstellt, indem man alles verwendet, was
wir bisher gelernt haben
23. 4-7. Switch-Statements: Deshalb werde ich
jetzt etwas
einführen, das als Switch-Anweisung bezeichnet wird. Es ist eine neue Art von Aussage , über die wir lernen werden. Und sie ist der if and else
if-Anweisung insofern sehr ähnlich , dass
sie, wenn
sie ausgeführt wird, eine Bedingung auswertet Wenn sie wahr ist, führt sie die
folgende Aktion aus. Wenn es falsch ist, geht es zur nächsten Els if-Anweisung
und versucht es erneut. Wenn das wahr ist, wird es
diese Aktion ausführen usw. Switch ist dem sehr ähnlich. Es ist nur eine andere Art ,
dieselben Informationen darzustellen. Was ich tun werde, ich
werde das in
eine Switch-Anweisung umschreiben , damit ich Ihnen genau
zeigen kann , wie das funktioniert Bei einer Switch-Anweisung verwenden
wir das Schlüsselwort switch Es hat eine Eingabe, die der Benutzer in das Programm
eingibt. Übrigens, bevor wir anfangen, zeige
ich Ihnen, was
diese Anwendung macht. Es fordert den Benutzer auf, einen Wochentag
einzugeben, und gibt dann eine
personalisierte Nachricht darüber, welchen Tag er eingegeben hat. Wenn ich dieses Programm starte, geben Sie
bitte einen Wochentag ein. Ich tippe Montag, ich mag Montag nicht. Es ist eine sehr einfache Anwendung. Ich werde
das als Switch-Anweisung umschreiben das als Switch-Anweisung Es benötigt die Eingabe des Benutzers, die wir in eine
Variable namens input eingegeben haben Wie bei den meisten
Dingen in C Sharp öffnen und schließen
wir geschweifte Klammern und platzieren den gesamten
Code in der Mitte Jetzt eine Switch-Anweisung,
zum Beispiel
IF-Anweisung, um
verschiedene Bedingungen zu überprüfen Bei der
Switch-Anweisung gibt es jedoch Fälle. Diese stellen beispielsweise eine L if-Anweisung dar. Unser erster Fall kann
der Input Monday sein. Wir stellen das so dar. Dann setzen wir den Code genau hier in
die Mitte. In einer Switch-Anweisung. Diese drei Zeilen
hier sind so
ziemlich identisch mit diesen drei
Zeilen hier. Es ist nur anders formuliert weil die Eingabe eine Zeichenfolge vom
Datentyp ist. In
unserem Fall muss es sich um eine Zeichenfolge handeln Wenn die
Eingabe beispielsweise eine Zahl ist, dann muss es sich um eine
Zahl handeln. So funktioniert das. Eine Switch-Anweisung kann einen oder mehrere Fälle
haben. Wir werden
für jeden von ihnen einen machen. Jeder Fall innerhalb einer
Switch-Anweisung muss mit einem Doppelpunkt enden und
mit dem Schlüsselwort break enden. Und alle Zeilen enden
mit einem Semikolon. Jeder Case-Header endet mit einem Doppelpunkt und endet mit So ist es
in Switch-Anweisungen. Geschweifte Klammern sind optional. Sie können sie platzieren, Sie müssen sie
nicht platzieren. Du kannst den Break
in die lockige Zahnspange stecken. Es funktioniert sehr flexibel
. Ich neige dazu, sie wegzulassen ,
solange
Ihre gesamte Logik hier und Sie mehrere
Codezeilen in einer Pause haben können. Und der Doppelpunkt in der Kopfzeile
, da ist alles in Ordnung. Das ist unser erster Fall, Montag. Ich mag Montag
schon wieder nicht für Dienstag, der nächste Fall wäre Auch hier können wir nicht
exakt denselben Fall haben , weil
er überflüssig ist Der nächste Fall wäre Dienstag, und wir nehmen diese Linie
für Dienstag usw. Sie können sehen, dass sich hier ein Muster
abzeichnet. Die Switch-Anweisung enthält viele
Bedingungen. Durch die Möglichkeiten der Bearbeitung habe ich all diese
und die l if-Anweisungen zu
einer Switch-Anweisung umgeschrieben ,
und sie wird
genau das Gleiche tun .
Lassen Sie mich das demonstrieren Lassen Sie uns diese Logik jetzt einfach vorübergehend
ausschalten. Jetzt führe ich die
Anwendung aus, die ich am Montag eingegeben habe. Sie können sehen, dass ich
genau das gleiche Ergebnis erhalte. Diese Switch-Anweisung
hier ist genau dieselbe wie all
diese Wenns - und
L-If-Anweisungen hier. Eine Sache, die Ihnen auffällt,
ist die Lesbarkeit. Es liest sich viel besser. Sie können sehen, dass es tatsächlich
viel minimaler ist. Sie können deutlich sehen, was vor sich geht und es sieht viel
aufgeräumter aus als das hier Das ist ein Vorteil der
Verwendung einer Switch-Anweisung. Ein Nachteil sind die
boolenden Operatoren. Wenn die Eingabe beispielsweise
Montag oder Dienstag ist ,
aber nicht Mittwoch, haben
wir es hier mit einer komplizierten
Sache Diese sind mit
Switch-Anweisungen ziemlich schwer
zu erreichen und es
wird sehr schnell sehr chaotisch In diesem Beispiel würde ich eine F-Anweisung
bevorzugen, in diesem Fall mit
komplexen Bolen-Operatoren zu arbeiten Ein weiterer Vorteil der Verwendung von Switch-Anweisungen besteht darin, dass wenn Sie
tatsächlich viele Bedingungen haben, hier haben wir sieben,
das ziemlich viel ist Wenn wir fünf oder mehr erreichen, wird eine Switch-Anweisung
vom System tatsächlich viel schneller
ausgeführt. Das liegt einfach am Design. Was ist
im Hintergrund los. Wenn Sie
beispielsweise fünf oder mehr Fälle erhalten , würde ich
eine Switch-Anweisung
dieser vorziehen, würde ich
eine Switch-Anweisung
dieser vorziehen nur weil sie
tatsächlich schneller ausgeführt wird. Wenn Sie
in if- und else-if-Anweisungen sieben Fälle darstellen , dann muss der Computer jeden einzelnen
auswerten. Es heißt, oh,
dieser, ist es dieser? Ist es dieser? Aber das funktioniert nicht in
Switch-Anweisungen. Es wird tatsächlich
etwas anders ausgeführt. Es ist leistungsfähiger,
wenn Sie
zwischen Switch-Anweisungen
if- und Else-If-Anweisungen entscheiden zwischen Switch-Anweisungen
if- und Else-If-Anweisungen Dann liegt es nur an dir. Sie müssen
Ihr Beispiel nehmen und herausfinden, welches für Sie
am besten geeignet ist. Eine Sache, die ich
bei Switch-Anweisungen erwähnen werde, eine letzte Sache ist, was passiert, wenn keiner
dieser Fälle eintritt? Was ist, wenn es einen magischen
achten Tag der Woche gibt oder der Benutzer vielleicht einen davon tatsächlich falsch
buchstabiert hat, dann
wird keiner dieser Fälle tatsächlich passieren Wenn wir dieses Beispiel mit
if machen würden und sonst, wenn wir unten
ein letztes L hätten , das ungefähr so lauten
würde, würde
es ungefähr so lauten und dem
Benutzer sagen, dass würde
es ungefähr so lauten er
einen ungültigen Tag eingegeben hat, weil er ihn
vielleicht falsch geschrieben hat.
Zum Beispiel Wie stellen wir das
in einer Switch-Anweisung dar? Nun, wir verwenden
das sogenannte Standardschlüsselwort. Wenn ich default eintippe es
immer mit einer Pause beende, genau wie in den obigen Fällen, dann kann ich den
gleichen Code hier einfügen. Wenn ich diese Logik entferne
und die Anwendung teste und dann einen
der Tage absichtlich falsch buchstabiere, können
Sie sehen,
dass dem Benutzer mitgeteilt wird,
dass er einen
ungültigen Wochentag eingegeben Das ist also sehr nützlich
, wenn Sie möchten, dass Code
ausgeführt wird, bei dem keiner Ihrer Fälle als
wahr bewertet wurde Es ist also zum Beispiel wie ein
Catchall.
24. 4-8. Bedingte Operatoren: Lassen Sie uns über bedingte
Operatoren in C Sharp sprechen. Bedingte Operatoren
sind nicht auf C Sharp beschränkt. Sie können
sie tatsächlich in C Plus Plus und
anderen Sprachen erleben , was ein
bedingter Operator ist. Es ist eine schnelle Möglichkeit,
eine F- und eine L-Anweisung zu ersetzen. Betrachten Sie dieses Beispiel. Hier fragen wir den
Benutzer, ob er Kaffee mag Wir nehmen seine Eingabe und
speichern sie in einer Variablen. Wenn sie dann zum Beispiel
ja eingeben, richten wir einfach
eine Variable namens message und speichern diese
Zeichenfolge darin. Ich wusste, dass ich
auf dich zählen kann. Sonst noch was? Wir sagen, dass wir keine
Freunde mehr sind und wir geben
es auf dem Bildschirm Wenn ich die
Software jetzt einfach starte können
Sie schnell
sehen, wie das funktioniert Ja, ich wusste, dass ich
auf dich zählen kann. Ja, sehr einfach. Aber Sie können sehen, dass wir hier
eine if-Anweisung und auch
eine L-Anweisung haben. Es nimmt vier
Codezeilen mit dieser zusätzlichen
Variablendose hier ein. Insgesamt gibt es fünf Zeilen. Wenn Sie große
Softwarekomponenten entwickeln, ist es
manchmal schön,
alles in einer Zeile zu vereinfachen. Das verhindert Blähungen und könnte wiederum die Lesbarkeit verbessern Es hängt davon ab, wie
ich das in
einer Codezeile darstellen kann ich das in
einer Codezeile darstellen Wie minimiere ich das? Nun, wir können
den sogenannten Bedingungsoperator verwenden. Was ich
tun werde, ich werde diesen ganzen Abschnitt
hier
neu schreiben und dabei ein neues Konzept verwenden,
den Bedingungsoperator Heute wird er manchmal als
ternärer Operator bezeichnet, was einfach bedeutet, dass er aus drei
Teilen besteht Und Sie werden auch sehen, warum er so
heißt. Ich schreibe das einfach
als Bedingungsoperator aus als Bedingungsoperator erkläre es anschließend. Wie ich bereits sagte,
besteht es aus drei Teilen. Der erste Teil ist die Bedingung, dieser wird durch
den zweiten Teil mit einem
Fragezeichen getrennt . Der zweite Teil ist dann wenn die Bedingung als wahr
bewertet Der dritte Teil ist, wenn die
Bedingung als falsch ausgewertet wird. Nun, diese eine Codezeile hier macht genau das Gleiche
wie all das hier. Lass mich dir das beweisen. Wenn wir das tun, führen wir das Programm aus. Magst du Kaffee? Ja, ich
wusste, dass ich auf dich zählen kann. Und lassen Sie uns einfach
die andere Bedingung testen. Sonst noch etwas? Wir sind
keine Freunde mehr. Sie können sehen, dass es jetzt viel
einfacher ist. Wir haben das alles in
einer Codezeile zusammengefasst. Aber wie funktioniert das? Was passiert, ist, dass wir
das Ergebnis in einer
Variablen namens message speichern , ähnlich wie
wir es hier tun. Der erste Teil des
Bedingungsoperators ist, dass die Bedingung
die Antwort des Benutzers ist? Ja, wir testen nach einer
Zeichenfolge. Das ist die Bedingung. Der erste Teil des
Bedingungsoperators befindet sich zwischen einem
Fragezeichen und einem Doppelpunkt. Das heißt, wenn die Bedingung als wahr
ausgewertet wird. Wenn das wahr ist,
dann wird dieses Segment
des Bedingungsoperators ausgeführt, dann dieser Abschnitt hier, falls Sie sich
diese Frage vorstellen können,
also die andere, wenn sie falsch ist Und das ist die Bedingung, diese Variable
nimmt einfach das Ergebnis
dieser ganzen Bedingung hier an,
einen Bedingungsoperator Es ist nur eine schnelle Möglichkeit,
eine F- und eine L-Anweisung
in einer Codezeile zu schreiben . Die Lesbarkeit, ja, es
hängt davon ab, ob Sie
bedingte Operatoren neutralisieren können Es mag ein bisschen verwirrend aussehen, aber je mehr Sie sie verwenden können, der
Code tatsächlich. Überlegen Sie, ob Sie
vielleicht 50 oder 100 davon haben.
Es ist schön, zum Beispiel mit nur einer
Codezeile zu vereinfachen zum Beispiel mit nur einer
Codezeile Aber so
können Sie Hebel- und
Bedingungsoperatoren
in C Sharp schreiben .
25. 5. Arrays: Also werde ich
einen neuen Objekttyp
in unser Lernen einführen einen neuen Objekttyp
in unser Lernen Und das nennt man ein
Array. Was ist ein Array? Nun, im Klartext ist
ein Array eine Sammlung
von etwas. wir zum Beispiel an,
einer deiner Freunde hat eine nette Sammlung
von Videospielen. Du könntest sagen, oh, das ist eine nette Auswahl an
Videospielen, die du hast. Es bedeutet einfach eine Sammlung von etwas, eine Menge von etwas. Beim Programmieren ist
es sehr ähnlich. Schauen wir uns dieses
sehr einfache Beispiel hier an. Was ich hier habe, sind sechs
Variablen vom Typ Integer. Integer ist der Datentyp. Ich gebe gerade den
ersten auf dem Bildschirm aus. Sehr einfach Sagen wir, wenn wir eine
Lotterieanwendung emulieren, wählt
der Benutzer sechs Zahlen aus
und dann setzen wir jede
ihrer Zahlen in eine Variable ein und alle Variablen
sind einzigartig Aber was ist, wenn der Benutzer 1.000 Zahlen
auswählt? Dann muss ich 1.000 Variablen
erstellen. Es wird wirklich mühsam sein. Unsere Anwendung wird
mehr Speicher beanspruchen, ihre Dateigröße wird
größer und die Entwicklung wird auch sehr
lange dauern Entwicklung wird auch sehr
lange Um das Problem
zu lösen, dass all diese Variablen
unterschiedliche eindeutige Namen haben, verwenden wir dass all diese Variablen
unterschiedliche eindeutige Namen haben unterschiedliche eindeutige Namen ein sogenanntes Array. Das Array kann
all diese Informationen in nur einer Variablen
zusammenfassen. Schauen wir uns an, wie wir
hier sechs
Codezeilen in nur einer
einfachen Zeile mithilfe von Arrays darstellen können hier sechs
Codezeilen in nur einer
einfachen Zeile mithilfe von Arrays Also was ich
tun werde, ich werde hier ein Array
definieren und initialisieren Wir möchten, dass alle unsere Elemente innerhalb des Arrays
ganze Zahlen sind Wir werden hier den
Datentyp int für unser Array verwenden, dann werde ich offene
und geschlossene eckige Klammern verwenden Das sagt dem System,
hey, ich möchte ein Array erstellen Wir werden
dem Array einen Namen geben. Wir werden es Zahlen nennen. Wir haben das
Array genau dort deklariert. Und jetzt wollen wir das Array
initialisieren, was bedeutet, dass wir einige Daten darin
ablegen wollen Und das können wir in
derselben Zeile machen. Um das zu tun,
werden wir nein sagen. Dann setze ich wieder
den Datentyp, wieder die eckigen Klammern. Jetzt möchte ich Werte
in dieses Array einfügen. Ich verwende offene geschweifte Klammern, geschlossene geschweifte Klammern
und dann ein Semikolon Jetzt füge ich die
Werte in diese geschweiften Klammern ein, sodass
ich zwei eingeben Wenn ich einen nächsten Wert eingebe, verwende
ich a und dann 12
und jetzt den nächsten Wert, und jetzt den nächsten Wert, 264.556,71. Diese eine Variable
hier, Zahlen genannt, ist ein Array hier, Zahlen genannt, ist Das sind alle Werte, die darin enthalten sind. Nun, diese eine Codezeile steht für all
diese sechs Zeilen hier. Jetzt brauchen wir das nicht mehr. Wie
greifen wir nun tatsächlich auf die Zahlen
in diesem Array zu? Nun, wir nehmen den
Namen des Arrays, also Zahlen, und verwenden dann
eckige Klammern. In die eckigen Klammern setzen
wir einen Index für unsere Werte. Als wir zuvor
über Teilstrings gesprochen haben,
habe ich gesagt, dass der Index
generell scharf C ist Fangen Sie bei Null an, das
ist Artikelplatz Null. Das ist Artikelsteckplatz 12345, obwohl wir sechs Elemente haben, ist
das Index fünf, weil
das Index Null ist.
Denken Sie daran, wenn Sie mit Arrays
und Sammlungen und
ähnlichen Dingen in C Sharp
arbeiten und Sammlungen und
ähnlichen Dingen in C Wenn ich auf dieses
erste Element, die Nummer zwei, zugreifen möchte, füge ich dort einfach Null ein, weil es sich bei Index Wenn ich das Programm starte, können
Sie jetzt sehen, dass es hier
Nummer zwei ausgibt, was unser erstes Element ist Ähnlich verhält es sich, wenn wir
auf die Zahl 12 zugreifen wollen, ich gebe einfach eine ein und ich
kann das Programm ausführen, und dann gibt es 12 aus ganz einfach. So greifen Sie tatsächlich auf die
Informationen im Array zu. Sie verwenden die eckigen Klammern, setzen
aber einen
Index in sie. Wenn wir versuchen, auf ein
Element außerhalb unseres Arrays zuzugreifen, zum Beispiel Index 45
, dann haben wir nur sechs
Elemente in unserem Array. Wenn wir das Programm ausführen,
wird es einen Fehler ausgeben. Und normalerweise sagt der Fehler
etwas in
der Art aus, dass er außerhalb
der Grenzen des Arrays Das liegt daran, dass wir keine 46 Elemente in unserem Array
haben. Es sagt uns nur, dass die Einheit nicht
existiert. Ich
weiß nicht, was ich tun soll. Eine andere Sache, die Sie
vielleicht mit
einem Array machen
möchten , ist, dass Sie das Array definieren möchten. Wir wissen jedoch noch nicht,
welche Informationen wir darin eingeben möchten. Vielleicht wollen wir das Array hier
definieren und dann wollen wir
ein paar andere coole Sachen machen. Und später, weiter
in der Anwendung, wissen
wir vielleicht endlich welche Zahlen wir hier eingeben
wollen. Was wir zum Beispiel in diesem Fall
tun, wenn wir das Array hier
definieren, wollen
wir hier quasi
eine Kapazität eintragen. Hier heißt es, wenn wir den
Mauszeiger tatsächlich über diese rote Linie bewegen, muss die
Array-Erstellung eine
Array-Größe oder einen Bezeichner haben Im Grunde heißt es, wie
viele Elemente werden Sie
in Ihrem Array haben , wenn Sie Ihr Array verwenden
möchten Ich weiß, dass ich sechs
Zahlen haben werde, weil es wie eine ist. Es könnte
zum Beispiel
eine Lotterieanwendung sein, bei der es nur sechs Zahlen
gibt. Wir definieren es hier mit einer Fünf. Beginnt der Index bei Null, dann haben wir 012345 Wenn wir hier eine Fünf eingeben, sagen
wir, dass wir
sechs Zahlen in dieses Array einfügen sechs Zahlen in dieses Array Ich hoffe, das ergibt Sinn. Jetzt haben wir das Array definiert, jetzt müssen wir es immer noch
initialisieren, weil wir hier standardmäßig
keine Werte haben .
Wenn ich versuche, auf die
Werte im Array zuzugreifen, obwohl es hier
keine Werte gibt, wird
es Null ausgeben weil das das
Standardverhalten ist Was ich jetzt tun möchte, ist einen Wert in das Array
einzufügen. Also werde ich einen Wert in
den ersten Slot eingeben , der Index Null
ist. Und ich werde hier
die Zahl 777 eintragen. Wenn ich jetzt die
Anwendung starte, können Sie sehen, wir den Wert 777 sehen können und dass
wir den Wert 777 sehen können und so
initialisieren Sie tatsächlich ein Element in Ihrem Array Wenn ich
zur nächsten Zeile gehe und versuche, einen Wert in die nächste Zeile
einzufügen, sagt
Visual Studio in ähnlicher Weise zur nächsten Zeile gehe und versuche, einen Wert in die nächste Zeile
einzufügen, voraus , was wir hier
vielleicht tun möchten Sie sehen diese grauen
Zeichen hier. Das
heißt im Grunde, wenn Sie die
Tabulatortaste auf Ihrer Tastatur drücken .
Also lass uns das machen. Es wird das für uns eingeben, was beim Programmieren viel
Zeit spart. Dann können wir das
zum Beispiel da eintragen. Dann können wir auf Index eins zugreifen
, der den
Wert 456 haben sollte, was er auch ist. So fügt man Werte in unser Array ein, weil wir nur
ein Array definiert haben , das sechs Elemente
enthalten kann. Wenn wir versuchen, einen Wert in Slot 45 einzufügen, wird
dies ebenfalls zu
einem Fehler führen, da wir uns außerhalb
der Grenzen Das Letzte, worüber ich mit Strahlen sprechen werde
,
das Erste davor, das Letzte, Rays,
ist einer von vielen
Sammlungstypen, die Sie in C Sharp verwenden können Es gibt Array-Listen,
Listen, Wörterbücher. Dies ist zum Beispiel etwas, mit dem
Sie beginnen können
, wie Sie viele
Daten verwalten können Das Letzte, worauf ich kurz eingehen
werde, ist Ihre Arrays so
ziemlich jeden Datentyp haben können Wir können zum Beispiel eine Reihe von
Zeichenketten haben. Das könnten die Namen von Leuten sein. Dann müssen wir
bei der Initialisierung sicherstellen, dass
es tatsächlich
dem Datentyp entspricht Lass uns das jetzt löschen. Wir können hier ein paar Namen eintragen. Wir können Henry reinsetzen. Wir können unseren
Freund Bob und so weiter einsetzen. Jetzt haben wir eine Reihe von Zeichenketten. Okay, wenn wir auf unser Array zugreifen, können
wir es einfach
genauso machen wie zuvor. Und da ist Access Henry, das ist das erste Objekt dort. Wenn wir die Anwendung ausführen, können
Sie sehen, dass sie Henry ausgibt. Denken Sie daran, dass, wenn Sie
ein Array mit einem
String-Datentyp definieren , alle Werte Zeichenketten sein
müssen. Wenn Sie
ein Integer-Array haben, haben
Sie hier ebenfalls Ganzzahlen
26. 6-1. While-Loops: Nun zu etwas
ganz anderem Ich werde
Looping in C Sharp einführen Um Looping einzuführen,
werde ich den Wire Loop vorstellen Betrachten Sie dieses Beispiel. Hier habe ich einen Zahlenzähler. Sobald wir die Software öffnen, heißt
es dem Benutzer:
Willkommen im Zahlenzähler. Bitte geben Sie eine Zahl ein, 1-3 Lassen Sie uns die Anwendung ausführen. Wenn ich zum Beispiel die Zahl
Drei eingebe, zählt
sie bis zur
Zahl, ich gebe 123 ein. Wenn ich die Zahl zwei eingebe, zählt sie bis Nummer zwei. Dies wird
durch diese Reihe
von if- und else-if-Anweisungen dargestellt . Wenn der Benutzer zwei eingibt, wird nur 123123 ausgegeben Es zählt bis zu der Zahl
, die der Benutzer eingibt. Überlegen Sie jedoch, ob wir diese Anwendung ändern
möchten und fragen Sie den Benutzer beispielsweise nach
einer Zahl von 1-1000. Nun, wie wir das mit
if-Anweisungen für jede Zahl
darstellen würden , dann hätten
wir diesen ganzen Block. Wenn wir die Zahl Vier haben, fügen wir hier eine weitere
Else-If-Aussage hinzu, geben Sie
die Zahl Vier ein. Dann fügen Sie hier eine weitere Zeile hinzu
, in der wir bis Nummer vier zählen. Aber wenn wir bis zu
1.000 gehen , dann wird
das riesig. Die Dateigröße unserer
Software wird riesig sein, sie wird sehr langsam laufen. Wie lösen wir dieses Problem? Nun, wir können all
diese Logik hier mithilfe einer Schleife darstellen . Wir werden eine While-Schleife verwenden. Lassen Sie mich
das Y-Loop-Format ausschreiben. Sie können also sehen, dass
es genau
wie die Aussage ziemlich ähnlich aussieht. Betrachten Sie die if-Anweisung,
wir haben eine Bedingung. Wenn die Bedingung als wahr
ausgewertet
wird, wird diese Codezeile einmal ausgeführt Wenn die Bedingung falsch ist, wird mit der nächsten if-Anweisung fortgefahren und diese Bedingung überprüft Wenn das wahr ist, führt es
diesen Codeblock einmal aus. jedoch bei einer Drahtschleife Wenn diese Bedingung jedoch bei einer Drahtschleife zutrifft, wird
der Inhalt hier immer wieder wiederholt Wenn ich die Konsole
richtig setze, ist die Zeile eins. Wenn dies als wahr ausgewertet wird, wird es dies einfach immer und
immer wieder wiederholen bis dies als falsch
ausgewertet So
funktioniert eine Drahtschleife im Prinzip. Schauen wir uns unser
Beispiel an und wie wir
unsere Anwendung modifizieren können , um all das
zu tun wenn die Logik hier in einer
einzigen Drahtschleife ist. Lassen Sie uns das alles löschen. Ich möchte, dass diese Drahtschleife
immer wieder wiederholt, wiederholt, wiederholt und
die Zahl bis zu
der Zahl ausgibt, die wir eingegeben haben
. Das ist die Nummer des Benutzers
, die er eingeben wird. Und wir wollen, dass die
Drahtschleife so lange
weiterläuft , bis diese
Zahl erreicht ist. Okay, wie machen wir das? Ich werde
eine neue Variable einführen und sie Counter nennen. Und ich werde es mit einer
initialisieren. Welcher Zähler wird es sein? Das ist die Zahl, die ständig
um
123 erhöht wird , bis zu der
Zahl, die uns der Benutzer gibt Ich möchte den
Zähler auf dem Bildschirm ausgeben. Jedes Mal, wenn sich diese Drahtschleife
wiederholt, möchte ich den
Zählerwert ausgeben. Es beginnt bei eins
und dann möchte ich den Zähler jedes Mal
um eins
erhöhen was ich tun könnte, ist, dass er
sich selbst entspricht und ein Zähler den Wert Eins
hat, aber jetzt möchte ich, dass er
sich selbst entspricht, was eins ist, und
dann eins hinzufügen Danach wird der Zähler gleich zwei
sein. Wenn es erneut läuft, ist der Zähler
gleich 34 usw. Jetzt können Sie jedes Mal, wenn Sie
einer Variablen eine hinzufügen, dies auf diese Weise tun oder
Sie können es auf diese Weise tun Einfach so. Dieses Plus plus erhöht
den aktuellen Wert um eins. Das ist nur eine
Kurzschreibweise. Das ist genau dasselbe. Es funktioniert nicht
mit zwei, nur mit einem. Wenn Sie es um eins
verringern möchten, verwenden
Sie negativ, negativ und das subtrahiert eins
von seinem Wert Aber wir wollen nur einen hinzufügen. Jedes Mal,
wenn diese Drahtschleife Schleife durchläuft, gibt
sie Zähler eins durchläuft, gibt
sie Zähler eins und dann geht sie zurück zum Anfang, überprüft die Bedingung.
Wenn sie immer noch zutrifft, werden
diese beiden Codezeilen ausgeführt. Auch hier funktioniert
die Drahtschleife so. Es wird sich weiter wiederholen, aber jetzt brauchen wir eine Bedingung Die Bedingung sollte als
wahr gewertet bis sie
das erreicht, was der Benutzer eingegeben hat, und dann muss sie aus
der Drahtschleife entkommen und
mit dem Rest der Software weitermachen Welche Bedingung können wir hier setzen
, damit das wahr wird? Nun, wir wollen bis
zur Benutzerzahl zählen. Einschließlich der Benutzernummer. Was wir tun wollen, ist zu
sagen, während der Zähler läuft. Ist kleiner als die Benutzernummer, dann wiederhole diesen Code. Wir möchten jedoch auch
die Benutzernummer angeben. Wenn es mit dem Zählen fertig
ist, wird es
kleiner oder gleich sein. Lassen Sie uns diese Anwendung einfach
ganz schnell ausführen , damit wir uns das ansehen können
. Geben Sie nun eine Zahl
1-1000 ein. Geben wir
zum Beispiel Nummer sieben ein und drücken die Eingabetaste. Sie können hier sehen, dass
von Nummer eins bis sieben gezählt wird. So funktioniert
eine Drahtschleife im Wesentlichen. Wenn wir die Anwendung
erneut ausführen und
1.000 eingeben , zählt sie bis 1.000 und stoppt dann
bei 1.000. Sie können sehen, dass
wir ohne viel Code all diese
if- und else-if-Anweisungen replizieren können In einer sehr einfachen
Kabelschleife wie dieser,
nur damit wir uns zu 100% im Klaren sind, läuft
die Software,
sie nimmt die Zahl vom Benutzerzähler, die auf eins initialisiert
ist Das ist jetzt eins, während eins
kleiner oder gleich
der Zahl ist kleiner oder gleich , die der Benutzer hier eingegeben hat Nehmen wir an, der Benutzer hat 44 eingegeben, während eins
kleiner oder gleich 44 ist Setzen Sie diesen
Ausgabezähler für die
Codeausführung bis zum Bildschirm fort
, der dann eins sein wird Und dann den
Zähler um eins erhöhen. Jetzt wird das gleich zwei sein. Jetzt ist Zähler gleich zwei. Ja, er ist immer noch kleiner
oder gleich 44. Jetzt ist der Zähler gleich drei, er ist immer noch kleiner als 44. Mach weiter so.
Sobald der Zähler 45 ist , ist 45 nicht
kleiner oder gleich 44. Was passiert, ist, dass es hier
ausbricht, hierher
springt und
mit dem Rest des Programms weitermacht mit dem Rest des Programms So funktioniert die
Drahtschleife im Wesentlichen in einem Geschäft. Ich möchte über
etwas sehr Wichtiges sprechen. Jetzt führen wir Loops ein. Mit Drahtschlaufen und
allen anderen Schleifen über die
wir in Zukunft sprechen werden. Es besteht die reale Gefahr, dass sich
Schleifen für immer wiederholen. Es sind nur Endlosschleifen. Was passiert, wenn Sie
eine Endlosschleife bekommen, ist, dass sie langsam den Speicher in Ihrem System verbraucht, bis entweder
kein Speicher mehr übrig ist oder
etwas Überläuft oder etwas
Katastrophales Das ist hier eine echte Gefahr. Schauen wir uns
ein sehr kleines Beispiel an. Denken Sie daran, dass bei IF-Aussagen hier eine Bedingung
besteht. Wenn das als wahr ausgewertet wird, dann wird es diesen Code genau
hier
ausführen , der vielleicht einfach true hier
hineinschreibt Was passiert, ist, dass
das immer wahr ist und immer als
wahr ausgewertet wird , weil ich dort „Wahr“
geschrieben habe ändert sich in
diesem Code
nichts Sogar Visual Studios
bewerten das , weil es weiß, dass es sich einfach für immer wiederholen
wird. Dies ist ein sehr einfaches Beispiel. Dies kann natürlich durch die Verwendung von Variablen
erreicht werden , die niemals
ihren erwarteten Wert erreichen. Zum Beispiel
wird das einfach ewig
weiterlaufen, wenn ich das Programm
ausführe. Jetzt können Sie sehen, dass es
einfach endlos zählt. Und was
passieren wird, ist entweder dass
diese Zahl
zu groß für ihren Container wird, oder uns wird
der Speicher auf unserem System ausgehen Aber im Grunde
wird diese Schleife einfach niemals enden und irgendetwas wird dazu führen, dass
dieses Programm abstürzt. Es könnte also Erinnerung sein,
es könnte alles sein. Und normalerweise ist es etwas
sehr Unerwartetes. Dies ist also ein Beispiel dafür, wo eine Schleife möglicherweise für immer
schleifen kann. Das ist ziemlich häufig, und aus
diesem Grund müssen wir Software
testen, um
sicherzustellen, dass das nicht passiert, aber jetzt führen wir Schleifen ein. Das ist eine echte Gefahr
, die passieren kann, und Sie sollten sich dessen bewusst
sein, wenn Sie weitermachen.
27. 6-2. Do While-Loops: Ich werde
eine Variante
des Wile-Loops vorstellen , die Il-Schleife
genannt wird Es gibt einen sehr subtilen
Unterschied zwischen
dem Wile-Loop und dem Il-Loop. Der Unterschied besteht darin
, dass in einer Il-Schleife der Code innerhalb der Schleife mindestens einmal
ausgeführt wird .
Was bedeutet das? Lassen Sie uns diese
Beispielanwendung hier betrachten. Willkommen im Zahlenzähler. Wir bekommen eine Zahl
vom Benutzer, 1-1000. Dann geben wir von Eins
die Zahlen bis zum Wert
des Benutzers
in Schritten von eins die Zahlen bis zum Wert
des Benutzers Wenn der Benutzer sieben eingibt, zählt
er bis sieben und fährt
dann mit dem
Rest des Programms Wir können eine
sogenannte Wile-Schleife verwenden, um hier so ziemlich
dasselbe zu erreichen Wenn wir die Drahtschleife erreichen, haben wir
hier eine Bedingung Der Code führt das aus, das, dann
kommt er zu dieser Drahtschleife Wenn diese Bedingung von Anfang an
falsch ist, wird dieser Code
niemals ausgeführt wird der gesamte Wire-Loop übersprungen Wenn diese Bedingung
falsch ist,
wird der gesamte Wire-Loop übersprungen und
der Rest der Software läuft
weiterhin mit einer I-Schleife Nun, das ist nicht der Fall, das liegt daran, dass die Bedingung
in einer Schleife einmal auftritt Die Schleife wurde bereits mindestens
einmal
ausgeführt. Überlegen Sie sich das. Nun, das macht genau
das Gleiche wie der andere Code. Die Software wird ausgeführt,
diese Codezeile wird ausgeführt. Das, wir bekommen die Eingabe des Benutzers, wir initialisieren diese Variable Jetzt kommen wir zu dieser
Aussage, nun ja, nichts hindert
uns daran, hier reinzugehen Das ist Ex, das
wird so ausgeführt. Und dann haben wir unseren Zustand. Diese beiden
Codezeilen
wurden bereits ausgeführt, bevor wir unsere Bedingung
erhalten. Und die Bedingung besagt, ist der Zähler kleiner
oder gleich der Zahl? Nun, wenn das
von Anfang an falsch ist, könnte
ich hier sogar falsch eingeben. Dann haben sie diese beiden
Codezeilen , die sie bereits ausgeführt haben,
bereits ausgeführt. Selbst wenn die Bedingung
falsch ist, werden sie trotzdem ausgeführt. Und dann machen wir mit
dem Rest der Software weiter. Betrachten Sie dieses Beispiel. Es ist egal,
was ich hier reinschreibe. Jetzt können Sie mindestens
einmal eine Ausgabe sehen. Das liegt daran, dass diese beiden Codezeilen
bereits ausgeführt wurden. Obwohl die
Bedingung falsch war. Eine Wile-Schleife ist
nützlich, wenn Sie möchten, dass der Code in Ihrer Schleife mindestens einmal
ausgeführt Wenn nicht, sollten Sie erwägen, stattdessen eine Wile-Schleife zu
verwenden. Aber beide können
so ziemlich das gleiche Ergebnis erzielen. Aber das ist der
Unterschied zwischen der Wile- und der Wile-Schleife
28. 6-3. For Loops: Ich werde jetzt
eine andere Schleife einführen jetzt als Viererschleife bezeichnet wird. Eine Vierschleife ist nur eine weitere
Möglichkeit, ein Ergebnis zu erzielen. Es hat
je nach Anwendung
Vor- und Nachteile. Sie sich dieses Beispiel vor,
bei dem wir den Benutzer
nach einer Zahl fragen und er mithilfe einer Wile-Schleife
einfach bis zu dieser
Zahl zählt
und jede Zahl auf
unserem Weg ausgibt bei dem wir den Benutzer
nach einer Zahl fragen und er mithilfe einer Wile-Schleife
einfach bis zu dieser
Zahl zählt und jede Zahl auf . Bei einem niedrigen Wert unterscheiden
sich vier Schleifen geringfügig Sie sehen hier diese Y-Schleife, wir haben eine Variable
direkt darüber definiert, und dann erhöhen wir
diese Variable jedes Mal, wenn
diese Wile-Schleife iteriert , um
eins Wenn die Bedingung
falsch ist, bricht sie aus ihr heraus. Sie können hier sehen, dass wir
der Drahtschleife einige zusätzliche Dinge
hinzugefügt haben , damit die Drahtschleife ihr Ziel
erreicht. Jetzt besteht sie aus vier Schleifen und hat einen eingebauten Mechanismus , zu dem auch ein
Zähler wie dieser gehört. Es wird den gesamten
Code in 14 Anweisungen vereinfachen . Nun, was bedeutet das alles? Lass es mich erklären. Wir beginnen einfach so
eine Vierer-Schleife mit dem
Schlüsselwort Four. Dann steht der Header in Klammern, genau wie die Drahtschleife. Und dann haben wir
die lockigen Zahnspangen. Der Header für eine Vierschleife, er enthält tatsächlich ein
bisschen mehr Die Drahtschleife hier, wir
haben die Bedingung, das ist das Einzige, was
wir hier haben. Aber die Vierschleife erfordert
eigentlich die Definition des Zählers
und das Inkrement
des Zählers Der Header erfordert
drei Dinge. Das liegt daran, dass die
Vierschleife
unseren Zähler verwaltet , denn er muss über diese Informationen
Bescheid wissen, aber er muss auch den Zustand
kennen. Und so betreten
und verlassen wir die Vierschleife. Zum Beispiel benötigt
sie, genau
wie eine While-Schleife, drei Informationen. Ich werde hier genau
dieselben Namen verwenden, vielleicht später mit einer Nummer
eins. Ich kann keine Variablen
mit demselben Namen verwenden. Ich werde hier kopieren, wo wir unseren Zähler
initialisiert haben. Ich kann nicht denselben Namen haben. Ich setze einfach eine
Nummer eins dahinter. Das nächste, was ich brauche,
ist die Bedingung. Wir trennen diese drei
Elemente mit einem Semikolon. Dann stelle ich die Bedingung erneut, ich kann nicht denselben Namen haben Dann die letzte, ich
brauche die inkrementelle, wieder, ich kann nicht den gleichen
Namen haben wie die Drahtschleife oben Nun, das ist im Grunde genau
das Gleiche wie oben, abgesehen von dieser Zeile hier,
die ich hier einfüge. Nun, dieser Block hier macht genau
das Gleiche wie all das. Hier können Sie
den Vorteil einer
Vierschleife gegenüber einer Drahtschleife in diesem Fall sehen. liegt daran, dass es
hinter den Kulissen automatisch den Überblick über
unsere vier Zähler behält hinter den Kulissen automatisch den Überblick über
unsere vier Zähler Jedes Mal, wenn die vier
Schleifen wiederholt werden, wird
dieser Zähler jedes Mal
um eins erhöht Wenn wir wollen, könnten wir ihn jedes
Mal um zwei
erhöhen , wenn der Zähler gleich
Zähler eins plus Und das würde den
Zähler jedes Mal um zwei erhöhen, zum Beispiel könnten wir
ihn jedes Mal um acht erhöhen Es liegt wirklich an uns, was wir mit
dem Inkrementellen machen wollen Aber normalerweise werden Sie sehen, dass die Leute es jedes Mal
um eins erhöhen Es gibt bestimmte Fälle
, in denen Sie den Wert möglicherweise jedes Mal
um eins verringern möchten den Wert möglicherweise jedes Mal
um eins verringern Es liegt wirklich an Ihnen,
das ist unser Zuwachs. Der dritte Artikel, der mittlere
Artikel ist unser Zustand. In diesem Fall ist es also genau dasselbe wie
eine Drahtschlaufe. Im ersten Punkt definieren
wir unseren Zähler. Also müssen wir sagen, hey, wir richten eine neue Variable ein und initialisieren sie mit einer In diesem Fall können wir
sie auf Null initialisieren, wenn wir wollen, aber wir müssen sie initialisieren Wir können es nicht leer lassen, wir initialisieren es In diesem Fall wird dies
genau dasselbe tun wie dieser Code Lassen Sie mich das nur
demonstrieren. Hier ist unser Loop. Wir geben
die Zahl Sieben ein. Warum nicht? Sie können sehen
, dass es bis sieben zählt. Jetzt werde ich unsere
While-Schleife komplett entfernen und unsere kaputte
Vierer-Schleife
einfügen, also
viel weniger Codezeilen. Ich werde
die Anwendung ausführen, ich gebe
die Zahl Sieben und sie macht genau das
Gleiche wie die Drahtschleife. Es ist ziemlich cool, nicht wahr?
29. 6-4. For Loops vs. While Loops: Sie müssen sich
die folgende Frage stellen. Wenn eine Vierschleife all
diese Vereinfachungen hat,
dann ist sie eingebaut, hier
inkrementell Warum benutzen wir das nicht immer? Warum sollten Sie sich zum Beispiel überhaupt mit einer
Drahtschlaufe beschäftigen? Nun, im Allgemeinen werden vier
Schleifen verwendet, wenn wir wissen, wie oft
die Schleife iterieren wird Wenn der
Benutzer zum Beispiel diese Zahl eingibt, zählen
wir von eins, erhöhen
uns um eins
und wir verlassen die Schleife, wenn
der Zähler
unter einem bestimmten Wert liegt In diesem Abschnitt
werden die Zahlen
1—10 jedes Mal ausgegeben , wenn er um eins
erhöht wird Und wenn es
endlich nicht mehr weniger oder gleich zehn ist, wird
es entkommen Mit einer
Drahtschleife können wir das jedoch tun, aber Drahtschleifen sind
besser, wenn wir die Anzahl der
Iterationen vorher nicht kennen Habe ich zum Beispiel Hunger? Lassen Sie uns eine
Booling-Variable namens Bin ich hungrig initialisieren
und sie auf true setzen, weil ich Wenn wir nun die Drahtschleife betreten, müssen
wir nicht wissen, wie
oft sie sich wiederholen wird Wir müssen nicht den Überblick über
einen Zähler oder all diesen
Kram behalten , das brauchen wir nicht wirklich. Die einzige Bedingung, die wir hier haben, ist
zum Beispiel, habe ich Hunger? Nun ja, stimmt.
Okay, es ist wahr. Dann können
wir innerhalb der Wow-Schleife eine Methode
namens Eat Food aufrufen. Und dann können wir überprüfen
, ob wir wieder Hunger haben. Und dann können wir weitermachen. Und wenn wir erst einmal genug
gegessen haben, habe ich keinen Hunger mehr, dann kann ich dem entkommen Aber ich weiß nicht, wie oft diese Schleife wiederholen wird,
bis ich voll bin. Es ist also ein Unbekannter. Deshalb
sind Wire Loops gut dafür geeignet, weil wir nicht wissen, wie viele Iterationen
es geben wird. Aber wir finden das
innerhalb der Schleife selbst heraus. Deshalb sind Drahtschleifen gut. Die Anzahl der
Iterationen ist unbekannt, und aus diesem Grund sind vier
Schleifen gut Wenn wir die
Anzahl der Iterationen tatsächlich kennen, können
wir das mit einer Schleife mit vier
Schleifen viel einfacher vereinfachen
30. 6-5. Foreach Loops: Ich werde jetzt
eine neue Schleife einführen, Vierer-Each-Schleife bezeichnet wird Der Vorteil einer
Vierer-Each-Schleife gegenüber beispielsweise
einer Vierer-Schleife besteht nun darin, dass sie
die Lesbarkeit verbessert Und mit Sammlungen funktioniert es
viel einfacher. Nun, was
bedeutet das alles? Nun, lassen Sie uns einen Blick darauf werfen. Ich habe hier
eine Beispielanwendung. Ich richte ein Array ein. Es ist ein Integer-Array, und das Array heißt Zahlen. Ich initialisiere das Array mit all diesen Zahlen hier. All diese Zahlen
werden
in dieser Variablen
namens Zahlen enthalten sein in dieser Variablen
namens Zahlen Ich verwende jetzt eine Vierschleife, die nacheinander jede Zahl
im Array
durchläuft und sie dann auf dem Bildschirm
ausgibt . Lassen Sie uns die Anwendung hier ausführen. Sie können hier sehen, dass die Anwendung jede der
Zahlen in unserem Array
enthält. Wir
durchlaufen einfach unser Array und geben dabei jede
Zahl aus Wir verwenden die Längeneigenschaft
des Arrays, um eine
Bedingung dafür einzurichten Was ich jetzt tun werde, ist die vier Loop pro Loop
vorzustellen. Das Erste, was ich gesagt habe, war, dass die vier, jede Schleife
lesbar ist. Schauen wir uns das jetzt an.
Wenn wir eine Schleife mit jeweils vier Schlaufen einrichten, verwenden wir das Schlüsselwort Für jedes haben wir
die Klammern, genau wie bei einer normalen if-Anweisung Vier Anweisungen in einer
Schleife, zum Beispiel. Dann haben wir die
bekannten lockigen Zahnspangen. Schauen wir uns an, wie
eine Schleife mit jeweils vier aussieht. Ich werde genau das Gleiche machen wie bei
der Vierer-Schleife. Sie können sich also vorstellen, dass es sich um
eine Schleife mit jeweils vier Schlaufen handelt. Im Kopf der
Vierer-Each-Schleife habe ich eine Variable eingerichtet, ich sage in Zahlen. Dann möchte
ich für jede Iteration
der vier Ea-Schleifen die Variable num ausgeben Nun, was bedeutet das alles? Nun, zunächst einmal können Sie sehen, dass die Lesbarkeit viel besser ist Hier gibt es viel weniger Code. Es sieht viel aufgeräumter kleiner aus und es bläht weniger Aber wie funktioniert es? Was
passiert hier in einer Vierschleife? Sie können sehen, dass wir hier eine Variable
eingerichtet haben. Bei jeder Iteration können wir diese Variable hier verwenden diese Variable hier Das Gleiche gilt für
eine Schleife mit jeweils vier. Bei jeder Iteration entspricht
diese Variable dem
nächsten Wert in unserem Array die erste Iteration
zum ersten Mal ausgeführt wird, wird
num gleich eins sein Bei der zweiten Schleife entspricht
Num vier Beim dritten Mal neun. In einer Viererschleife entspricht
dies beispielsweise dem Index Da wir nur von Null aus
zählen, erhöhen
wir Null . um
eins und
beenden den Vorgang, wenn num gleich oder größer
als die Länge der
Zahlen im Array
ist als die Länge der
Zahlen im In einer Schleife mit jeweils vier Stück entspricht
diese Variable hier
jedoch tatsächlich
den Werten im
Array, nicht dem Der Index ist 0123. Aber in einer Schleife mit jeweils vier, entspricht
Numb dem tatsächlichen
Wert, 14912 usw. Wir geben das nur auf dem Bildschirm aus
. Sie sehen hier, wir verwenden
einen Index in der Vierer-Schleife , um auf die Zahl
hinter dem Index 149 zuzugreifen Aber in einer Viererschleife wird
es tatsächlich so
gesetzt, dass der Wert
num der Wert ist. Wir geben
den Wert nur auf dem Bildschirm aus. Lassen Sie mich Ihnen das beweisen,
wenn ich die Anwendung starte. Jetzt können Sie sehen, dass es hier alle
Zahlen im Array
ausgibt Das zweite, was ich gesagt habe, war, dass es mit Sammlungen
viel besser
funktioniert Jetzt haben wir ein
Standardarray wie dieses Integer-Array verwendet, aber es gibt viel
mehr Array-Typen und Sammlungen in C
Sharp zum Beispiel, wie Listen und verschiedene Dinge, die jeweils
eine bessere Lesbarkeit
bieten und Ihnen mehr Optionen bieten, auch mit ihnen
zu arbeiten Das ist der Vorteil
einer For-Each-Schleife. Sie können sehen, dass es
viel besser lesbar ist. Wir müssen
diese Variable hier nicht definieren und einen Zähler im Auge
behalten. In dieser Hinsicht ist es sehr einfach. Das heißt, eine weitere Schleife in Sharp, und das ist die für jede Schleife.
31. 6-6. ÜBUNG: Zeichne einen Würfel: Ich werde jetzt
dein Wissen testen. Jetzt haben wir einige Loops abgedeckt. Und wir werden einen
Würfel zeichnen. Und was heißt das? Nun, wenn der
Benutzer zum Beispiel die Zahl fünf eingibt und wir die Eingabetaste drücken, zeichnet
er den Würfel. Sie können sehen, dass fünf Asterix drüben
und fünf unten sind. Wenn der Benutzer sechs eingibt, ist es sechs
quer und sechs unten Wie erreichen wir das? Schauen wir uns den Code hier
an. Nun, im Moment macht es nicht
viel. Wir bitten den Benutzer
, eine Zahl einzugeben, und dann
speichern wir seine Antwort in einer Variablen namens num. Wir machen gar nichts. Wie gehen
wir mit diesem Problem um? Wie zeichnen wir diese Würfel? Nun, wir brauchen einen Mechanismus, mit dem wir
so lange Asterixe auf
dem Bildschirm zeichnen können, bis wir die Benutzernummer
erreicht haben Wenn etwas
dauernd etwas tut, denken
wir in unserem Kopf Wir brauchen etwas, um
weiter etwas zu tun, wir brauchen etwas, das sich ständig
in unserem Kopf Wir sollten denken, okay,
wir brauchen hier eine Schleife. Ich bin mir nicht sicher, wie viele Loops
oder welche Art von Loop, aber ich weiß, dass ich einen Loop brauche, also das ist ein guter Anfang. Als ich über vier
Schleifen im Vergleich zu Drahtschleifen gesprochen
habe, habe ich gesagt, dass vier Schleifen gut sind, wenn man weiß, wie viele Wiederholungen
sie machen werden Sie können eine Drahtschleife verwenden, aber ich sage nur, dass eine
Schleife mit vier Schleifen besser wäre In diesem Fall wissen wir, wie viele Iterationen es sind, weil wir die Zahl
haben,
die der Benutzer eingegeben hat, was der
Größe des Würfels entspricht Eine Vier-Schleife
wäre ein guter Anfang um dieses Problem nicht anzugehen.
Lassen Sie uns beginnen, eine Vierer-Schleife zu erstellen das hier angegebene Schlüsselwort
verwenden Nun das Format der vier
Schleifen. Es braucht drei Dinge. Wir müssen
eine Variable initialisieren. Ich nenne es y, ich werde es auf
Null initialisieren Jetzt brauchen wir unseren Zustand. Ich möchte, dass es so lange
läuft, bis es
kleiner ist als das, was
der Benutzer eingegeben hat Dann möchte ich
es nur jedes Mal um eins erhöhen. Jetzt möchte ich einen
Asterix auf dem Bildschirm ausgeben. Lass uns das löschen und einen
Asterix hineinlegen. Lassen Sie uns unser Programm ausführen und
sehen, was wir bisher haben. Geben wir die Zahl fünf ein. Sie können sehen, dass der
Asterix untergeht. Wir haben fünf Asterix. Sie gehen alle vertikal. Wir haben es gerade auf
halbem Weg geschafft. Aber was wir tun müssen, ist, auch
die Astrixes
rüber zu bringen die Astrixes
rüber Jedes Mal, wenn diese
vier Schleifen wiederholt werden, zeichnet
sie einen Asterix und
geht zur nächsten Zeile,
zeichnet einen Asterix, zeichnet einen Asterix, Bei jeder Iteration brauchen wir etwas Put
. Asterix geht auch
diesen Weg. Jedes Mal, wenn der Loop wiederholt wird, wie kriegen wir etwas dazu, etwas weiter
zu wie kriegen wir etwas dazu, etwas weiter
zu machen?
Nun, das ist eine Schleife Was wir tun könnten, ist
eine Schleife innerhalb einer Schleife zu platzieren. Schauen wir uns das an. Wir können nicht zweimal denselben
Variablennamen haben. Sie können sehen, dass y von dieser Schleife
verwendet wird. Wir müssen diesen
umbenennen. Nennen wir diesen ohne wirklichen
Grund X. Es kann was auch immer sein. Es kann Cheeseburger sein, wenn du
es wirklich willst Jetzt haben wir zwei Loops. Wir haben
eine sogenannte verschachtelte Schleife. Eine Schleife innerhalb einer Schleife. Jedes Mal, wenn diese Schleife iteriert, macht
sie all
das. Bedenken Sie das Lassen Sie uns das Programm
jetzt irgendwie ausführen und sehen, womit
wir es zu tun haben. Ich gebe die Zahl fünf ein und jetzt, wow, was passiert jetzt? Wir haben 25 Sterne, die sinken. Das ist ein bisschen falsch, nicht wahr? Warum macht es
das? Das liegt daran, dass jedes Mal, wenn diese Schleife ausgeführt
wird, diese Schleife ausgeführt wird. Und jedes Mal, wenn diese Schleife läuft, schreiben
wir hier tatsächlich
den Asterix, aber auch eine neue Zeile Und jetzt ist das ein Problem für uns. Wir wollen nicht jedes Mal eine neue
Zeile schreiben, wenn das läuft. Sonst bekommen wir
nur vertikale Astrixe. Was wir tun können, wir können
eine neue Methode namens, richtig, einführen eine neue Methode namens, richtig, Was das macht, es schreibt
alles in dieser Zeichenfolge hier, all dieses Zeug hier. Aber danach wird keine
neue Zeile eingefügt. Es hält es auf derselben Linie. Das ist der Unterschied
zwischen der rechten Zeile , die das schreibt und
dann einer neuen Zeile. Aber die rechte Seite schreibt
das einfach und fügt
keine neue Zeile ein. Schauen wir uns das an. Geben wir jetzt Nummer fünf ein. Jetzt kannst du sehen,
oh, alle Asterix bewegen sich über die Jetzt wissen sie alle,
was hier vor sich geht. Nun, das liegt daran, dass
wir momentan überhaupt keine Zeilen
schreiben. Es ist einfach so ziemlich das
Schreiben in eine Richtung. Ich muss anfangen,
diese neuen Zeilen einzufügen. Im Moment haben wir 25
Asterix, die da rüber gehen. Ich will
alle fünf davon eine neue Zeile. Jetzt wissen wir, wenn der Benutzer
hier die Zahl fünf eingibt, wird
diese innere Schleife
fünfmal wiederholt Sobald die fünfte Schleife abgeschlossen ist, beendet
der Code diese
Schleife und führt
den Rest des Codes weiter aus, bis die erste Schleife wieder von
vorne beginnt Genau hier
muss ich eine neue Zeile eingeben. Wie gebe ich eine neue Zeile ein? Es gibt viele Möglichkeiten, aber mit dem Wissen, das wir bereits
kennen, können wir das einfach tun. Wir schreiben nichts. Aber dann fügt es diese Zeile
danach hinzu. Lass uns das ausführen. Lassen Sie uns jetzt zur Zahl sechs gehen, nur um zu beweisen, dass
es kein Zufall ist, nur um zu beweisen, dass
es kein Zufall ist, sondern dass aus einer anderen Zahl
ein größerer Würfel Jetzt haben wir 123456 durch 123456
runter. Wir haben es so ziemlich geschafft. Lassen Sie uns
diesen Code ganz schnell durchgehen. Wir können die Nummer des Benutzers nehmen. Jetzt haben wir eine verschachtelte Schleife. diese
Schleife zum ersten Mal iteriert, führt
sie diesen Code hier aus, was auch eine weitere Schleife ist Jetzt geht es hier rein und gibt einen Asterix
auf Wenn der Benutzer beispielsweise die Zahl fünf
eingibt, ersetzen
wir diese.
Es ist besser lesbar. Es wird
das fünfmal laufen. Jetzt haben wir fünf
Asterix auf dem Bildschirm. Sobald diese Schleife beendet ist, die Schleife
jetzt beendet Jetzt drucken wir
eine neue Zeile auf dem Bildschirm. Wir haben eine neue Zeile eingegeben, sie wird so aussehen. Jetzt starten wir zum
zweiten Mal unsere Schleife , die Hauptschleife. Sobald dieser gestartet ist, wird dieser Loop
erneut fünfmal ausgeführt. Jetzt wird es so
aussehen. Sobald die Schleife fertig ist, druckt
sie eine neue Zeile. Jetzt sieht es so aus, dann geht es wieder nach oben. So funktioniert es, sodass Sie sich vorstellen können,
was hier vor sich geht. Die Antwort auf unser Problem. Wenn wir würfeln wollen
und wir wollen, dass
Asterix nach unten geht, dann eine Wenn wir aber auch wollen, dass sie
runter und quer verlaufen, dann überlege dir etwas
wie eine verschachtelte So können wir
dieses Problem lösen , indem wir
Loops in Sharp verwenden
32. 7-1. Das Break-Statement: Deshalb werde ich eine neue Art
von Aussage
einführen ,
die sogenannte Break-Anweisung. Als wir
hier
über Switch-Anweisungen gesprochen haben, haben wir uns kurz mit
der Break-Anweisung befasst, aber nicht
wirklich ausführlich. Aber jetzt werde ich
genau erklären, was das macht und wie es funktioniert und wie es uns tatsächlich nützen
kann. Pause ist der Schlüssel. Bei der Verwendung einer Switch-Anweisung gibt der Benutzer beispielsweise
einen Wochentag ein. Wir speichern die Antwort
in einer Variablen. Und wenn sie dann zum Beispiel Mittwoch
eingeben, dann wird diese
Codezeile hier ausgeführt. Sobald diese Codezeile
ausgeführt wurde, diese Break-Anweisung, verschwindet sie aus
dieser Switch-Anweisung und der Kontrollfluss
der Anwendung wird fortgesetzt Was meine ich mit Kontrollfluss? Nun, wenn wir
unsere Software starten, wird
die Hauptmethode automatisch
ausgeführt. Und dann wird die erste
Codezeile ausgeführt, die zweite Zeile, und sie ist sequentiell, sie
läuft bis zum Ende Das ist der Kontrollfluss, so wird Ihre
Anwendung ausgeführt Aber die Sache mit der
Switch-Anweisung ist, wenn der Kontrollfluss hier
ein Break-Schlüsselwort erreicht, anstatt
die nächste Zeile auszuführen, die nächste, die nächste, die nächste, die nächste ganz unten, trifft
sie auf das Break-Schlüsselwort und überspringt
dann sofort
alles, überspringt
dann sofort danach geht
es weiter Das ist die Stärke
der Break-Anweisung wenn sie in einer Switch-Anweisung verwendet wird Schauen wir uns an, wie
die Break-Anweisung in
so etwas wie einer Drahtschleife verwendet werden
kann. Schauen wir uns
hier ein einfaches Beispiel
an , was wir tun, wir bitten den Benutzer
, eine Zahl einzugeben. Was dieses Programm macht, das einfache Programm, wir zählen
nur bis zu dieser Zahl. Wenn ich das Programm hier starte und der Benutzer
die Zahl Acht eingibt, zählen
wir einfach
bis zur Zahl Acht. Sehr einfach. Wir verwenden dafür
einen Wile-Loop Wir haben hier eine Bedingung. Wir sagen, wenn unser
Zähler
kleiner oder gleich der vom
Benutzer ausgegebenen Zahl ist, erhöht
der Zähler
den Zähler dann um eins und
wir wiederholen das einfach. Es ist sehr einfach, wie es funktioniert. Manchmal, wenn Sie eine Schleife erstellen, wie zum Beispiel eine Drahtschleife oder sogar eine Viererschleife, haben Sie
möglicherweise keine Bedingung. In diesem Fall
richten wir eine Bedingung ein, weil wir wissen, was der
Benutzer eingeben wird, und wir zählen bis dahin. In einigen Fällen haben wir jedoch
keine Bedingung. Wir können keine Bedingung haben. Wir wissen vielleicht nicht, was
das Endziel ist, und wir könnten das Endziel tatsächlich
in unserer Drahtschleife
herausfinden . Weißt du, zu einem späteren Zeitpunkt könnte etwas
herausgefunden werden. Zum Beispiel, wenn
wir eine Datei aus dem Internet
herunterladen und die Datei in Teilen gleichzeitig herunterladen und wir möglicherweise nicht wissen, wie groß die Datei ist,
die wir herunterladen. In diesem Fall können wir also eine Drahtschleife
einrichten und für immer und
ewig weitermachen , bis die Datei heruntergeladen
ist In solchen Fällen haben wir
keine Bedingung. Was wir hier also tun können, ist
eine Bedingung aufzustellen , die
immer zutrifft. Das wird eine
endlose Schleife machen , bis
wir zum Beispiel
die gesamte Datei heruntergeladen haben, und dann
können wir die Schleife manuell verlassen Das kann
auch durchaus üblich sein ,
wenn wir keine Bedingung haben und diese Drahtschleife einfach auf unbestimmte Zeit eingeschaltet haben.
Was wir tun können, ist aus
dieser Drahtschleife auszubrechen um zu verhindern, dass
sie sich für immer wiederholt Dies ist eine gute Möglichkeit, das
Break-Schlüsselwort zu verwenden. Wir können es in
Switch-Anweisungen verwenden, aber wir können es auch verwenden wenn wir eine
unbestimmte Bedingung haben, was immer zutrifft Schauen
wir uns zum Beispiel dieses Beispiel an. Und was ich
tun werde, ich werde es stattdessen mit einem
Break-Schlüsselwort
umschreiben, und es wird
genau dasselbe tun Nehmen wir an, wir haben keine
Bedingung für diese Drahtschleife. Sie wird auf unbestimmte Zeit wiederholt. Wir brauchen einen Weg, um
hier herauszukommen, damit wir nicht
in einer Endlosschleife feststecken Was wir sagen werden,
ist, wenn der Zähler zu
irgendeinem Zeitpunkt größer ist als
die Zahl, die der Benutzer eingegeben hat, dann brechen wir aus der Schleife aus. Sie können sehen, dass, sobald ich das Break-Schlüsselwort
eingegeben habe, auch
dieses Wire-Schlüsselwort hervorgehoben wurde, und das ist Visual
Studio, das uns hilft Wir könnten zum Beispiel eine Drahtschleife in
einer
anderen Drahtschleife haben einer
anderen Drahtschleife Innerhalb einer Schleife mit vier Schleifen können
wir kaskadierende Schleifen haben Und es kann ziemlich verwirrend sein,
wenn ein Schlüsselwort verwendet wird. Break Visual Studio
sagt nur, okay, Sie haben das Break-Schlüsselwort eingegeben,
das ist die Schleife
, mit der es verknüpft ist Und das ist die Schleife, aus der Sie ausbrechen
werden, genau wie bei der Switch-Anweisung Mit dem Schlüsselwort
break wird beispielsweise
verhindert, dass sich diese Drahtschleife
für immer wiederholt. Es heißt wortwörtlich, okay, diese Bedingung wird als wahr
ausgewertet, lassen wir diese Schleife hinter und fahren mit dem
Rest des Programms fort Das Schlüsselwort brake steuert den Ausführungsablauf
des Codes. Es heißt im Grunde,
lass uns von hier verschwinden und mit dem Rest
des Programms weitermachen. Das ist es, was das
Schlüsselwort Brake im Wesentlichen tut. Lassen Sie uns die Software ausführen und einfach bestätigen, dass sie genau
dasselbe tut. Geben wir zum Beispiel die Zahl
Acht ein. Sie können sehen, dass es
bis zur Zahl Acht zählt. Die Verwendung des Schlüsselworts Brake ist eine weitere Möglichkeit,
das Ziel zuvor zu erreichen Es wird
jedoch häufig
verwendet,
wenn Sie beispielsweise nicht wirklich eine Bedingung
haben und aus einer Schleife
entkommen möchten Das ist die Stärke der
Bremsaussage in C scharf.
33. 7-2. Das continue-Statement: Die fortgesetzte
Aussage, was ist sie? Was macht es? Jetzt habe ich die Break-Anweisung
erklärt. Und eine Break-Anweisung nur
zur Auffrischung bringt Sie komplett aus einer Schleife
heraus und fährt mit dem
Rest des Programms Break-Anweisungen
können in vier Schleifen verwendet werden. While-Schleifen, jeweils vier
Schleifen, alle Arten von Schleifen. Nur um aus der Schleife zu entkommen, es ist nicht endlos der
fortgesetzten Anweisung wird jedoch nur
eine Iteration einer Schleife übersprungen Was ich tun werde, ich
werde Ihnen zeigen, wie die Continued-Anweisung in einer
Vierschleife funktioniert Betrachten Sie dieses Beispiel. Hier bitte ich
den Benutzer,
eine Zahl für das, was
ich tun werde, einzugeben eine Zahl für das, was
ich tun werde, Ich zähle
bis zehn, aber ich überspringe die
Zahl, die der Benutzer eingibt. Schauen wir uns dieses Beispiel
an. Also werde ich
die Zahl sechs eingeben und Sie können das Ergebnis hier sehen. Ich zähle von Null, ich gehe bis zehn, aber ich überspringe
die Benutzernummer. Die Nummer sechs. Die Nummer
5-76 wird übersprungen Ich verwende einen Vier-Loop-Modus
, um das zu erreichen. Ich zähle 0-10 Ich
verwende eine Variable namens. Ich sage, wenn der Zähler nicht der Benutzernummer entspricht, geben Sie den
Zähler einfach im Fenster aus Ein bisschen Wissenswertes für Sie, falls Sie von der Programmiersprache
C gehört haben Und außerdem haben wir schon einmal
über die Inkremente gesprochen, bei denen Sie einer
Variablen eins hinzufügen, plus, plus eingeben Sie können jetzt sehen, wie Plus Plus
entstanden ist , die
Programmiersprache C plus, plus, es ist nur eins mehr
als sein Vorgänger Das ist ziemlich cool, nicht wahr? Falls du dich jemals darüber
gewundert hast. Wie auch immer, wie können wir das mit einer
kontinuierlichen Aussage
erreichen? Schauen wir uns das an. Ich werde das mit einer fortlaufenden Anweisung neu schreiben. Ich werde sagen, ob der aktuelle Zähler der Nummer des Benutzers
entspricht ,
dann fahre ich fort Das wird
genau das Gleiche bewirken. Das hier,
lass mich das beweisen. Geben wir die Zahl sechs ein. Auch hier können Sie sehen,
dass die Zahl sechs tatsächlich
übersprungen wurde . Wie
funktioniert das? Eine Sache wird dir auffallen, wenn continue eingibst oder den
Mauszeiger darüber bewegst, genau wie bei der Brake-Anweisung, sie dir sagt, an welche
Schleife sie gebunden ist Wir haben
Weiter geschrieben. Es heißt, okay, wir sind hier an
diese vier Schleifen gebunden. Wenn der
aktuelle Zähler beispielsweise der Zahl des Benutzers
entspricht, fahren
Sie fort. Was macht
Continue? Es verhindert, dass der Rest
des Inhalts innerhalb der
Schleife ausgeführt wird. Sobald es ausgeführt
wird, geht
es zurück zum Anfang
der Vierschleife und
weiter nach unten. Dieser Code hier wird nie ausgeführt. Selbst wenn ich
hier eine Menge Code habe, all das hier, wenn diese Continue-Anweisung jemals ausgeführt
wird, wird
all dies ignoriert und der Kontrollfluss geht zurück
zum Anfang der Schleife. Wir fahren weiter runter.
Auch hier verändert es den Ausführungsablauf genau
wie die Break-Anweisung. Aber wie die
Break-Anweisung vollständig aus
der Schleife ausbricht und
die Continued-Anweisung fortsetzt, verhindert
lediglich, dass
der Rest der aktuellen Iteration
der Schleife ausgeführt Und dann geht es
zurück zum Anfang
und setzt die Schleife dann wie gewohnt fort Das ist der Unterschied zwischen
der Continue-Anweisung und der Break-Anweisung, die
ich Ihnen zeigen kann Wenn ich diese
Bedingung nun vollständig entferne, werden
diese vier Schleifen so
gut wie nichts bewirken. Weil dieser Code
hier nicht erreichbar ist. Sogar Visual Studio
ist abgestuft, was Ihnen
sagt, dass dies
niemals ausgeführt
wird, da wir hier keine Bedingung
haben Bei jeder Iteration
dieser vier Schleifen stoßen
wir einfach auf diese
fortlaufende Und es wird einfach immer wieder
zum Anfang in dieser
winzigen Schleife hier Das ist also die Stärke
der fortgesetzten Aussage in C-Sharp.
34. 8-1. Ausnahmebehandlung (try, catch, finally): Jetzt möchte ich über die
Fehlerbehandlung oder
Ausnahmebehandlung sprechen . In der Welt von
Sharp C sind sie ein Synonym , wenn es um
Ausnahmen sind Ergebnisse
, die man nicht erwartet Wenn Sie sich eine Ausnahme
im Wörterbuch ansehen, handelt es sich um eine Person oder Sache
, die von
einer allgemeinen Aussage ausgeschlossen ist , und was noch wichtiger ist, dass sie
keiner Regel folgt Schauen Sie sich dieses
Beispiel hier an. Wir fragen den Benutzer
nach zwei Zahlen. Wir setzen ihre Eingabe, die eine Zeichenfolge ist, genau hier in eine
Integer-Variable ein. Und wir verwenden die
Methode für int 32. Um dieses Ziel zu erreichen, nehmen
wir eine Zeichenfolge und
konvertieren sie in eine Ganzzahl. Das zweite, was wir hier
tun, ist,
die beiden Zahlen zusammen zu dividieren und sie in eine
Variable namens result umzuwandeln. Also dieses Programm,
es ist ziemlich flockig. Es gibt ein paar Fehler, die auftreten
können, wenn wir nicht vorsichtig sind Im Allgemeinen können Fehler auftreten
, wenn wir es mit Benutzern zu tun haben, weil Benutzer Dinge tun, die
wir einfach nicht erwarten. Wenn ich
die Anwendung starte,
gib manchmal deine erste Nummer ein. Was ist nun, wenn der Benutzer
einfach Hallo eingibt? Was ist, wenn sie es falsch lesen und ihre E-Mail-Adresse angeben? Benutzer können alles tun. Was ist, wenn sie versehentlich Eingabetaste drücken und keine Zahl
eingeben? Es gibt viele
Dinge, die ein Benutzer
tun kann , um Ihre Software möglicherweise zu
beschädigen. Diese Dinge werden als
unerwartete Dinge bezeichnet, wenn ich viele
Buchstaben eintippe und die Eingabetaste drücke. Jetzt können Sie hier sehen, dass wir hier
diese nette kleine
Fehlermeldung haben . Es heißt, dass die Ausnahme nicht behandelt wurde. Das bedeutet im Grunde, okay, ein Fehler ist aufgetreten, eine Ausnahme ist aufgetreten Und es wird nicht behandelt, was bedeutet, dass wir
nichts dagegen tun Der Computer kann
nichts gegen diesen Fehler tun , weil er versucht, ihn in eine Zahl
umzuwandeln Er kann es einfach nicht tun. Es weiß
nicht, was zu tun ist. Also müssen wir dem System sagen, wie es mit dieser
Art von Fehler umgehen soll. Wenn ich mir diese Software hier ansehe, tritt
dieser Fehler auf, wenn
wir die Eingabe des Benutzers annehmen und
dann versuchen, sie in eine Zahl umzuwandeln. Wenn ich den Mauszeiger über
diese Methode hier, die wir verwenden,
auf 32 setze, siehst du, dass
dieser Dialog erscheint Es sagt uns, was
die Methode macht. Es sagt uns, was uns die Methode als Gegenleistung
zurückgibt. Aber es gibt auch
diese zusätzliche Information unten,
die Ausnahmen
besagt. Dies sind nun die beiden möglichen Fehler, die
auftreten können, wenn
diese Methode bis 32 verwendet wird. Die erste ist eine
Formatausnahme. Das ist der Fehler, den
wir gerade erlebt haben. Wir geben zum Beispiel ein Wort ein und dann
wird eine sogenannte Formatausnahme ausgelöst. Das liegt daran, dass das
Format nicht korrekt ist. Es wird eine Zahl erwartet, wir haben einige Buchstaben,
das Format ist falsch. Der andere Fehler ist eine
Overflow-Ausnahme. Ich schätze, das ist der Fall, wenn Sie eine wirklich
große Zahl
eingeben und sie physisch nicht
in den Datentyp passt , der eine Ganzzahl ist Jetzt geht die 32-Bit-Ganzzahl
auf etwa 2 Milliarden. Wenn ich versuche, 5 Billionen einzugeben, würde das wahrscheinlich den anderen Fehler
auslösen, bei dem es die Overflow-Ausnahme handelt Was wir dagegen tun können, ist diese Art von Fehlern zu
behandeln Wenn der Computer sagt, oh, du hast mir ein Wort gegeben, ich wollte eine Ganzzahl, kann
ich diese
Wörter nicht in eine Ganzzahl umwandeln. Wir können das abfangen und sagen,
okay, die Benutzer
haben einige Wörter eingegeben Jetzt werde ich Ihnen sagen, wie
Sie damit umgehen sollen So
gehen Sie dieses Problem Der zweite Fehler, der auftreten kann,
ist, dass
wir beim Teilen durch Null die beiden
Zahlen vom Benutzer nehmen. Angenommen, sie haben
zwei gültige Zahlen eingegeben, versuchen
wir, sie zusammen zu dividieren. Wenn die zweite
Zahl jedoch eine Null ist, tritt ein weiterer Fehler
auf. Wenn ich Null eingebe,
haben wir jetzt einen weiteren Fehler. Jetzt ist es wieder unbehandelt , weil wir
nichts dagegen tun Und diese Art von Fehler ist eine Ausnahme, wenn
man durch Null dividiert. Die Botschaft, die wir
versuchen durch Null zu teilen. Der Computer kann das
physisch nicht. Er weiß nicht, wie das mathematisch
ist, er kann nicht durch Null teilen Aber wir sagen ihr nicht, wie
sie dieses Problem umgehen kann. Das ist das Ziel dieses
Tutorials. Jetzt werde
ich Ihnen zeigen, wie
wir mit Ausnahmen umgehen können. Jetzt
geht dieses Thema ziemlich tief, aber wir werden hier nur an der Oberfläche
kratzen Was wir hier verwenden, ist ein
Schlüsselwort namens Tri. Es ist ziemlich einfach, DRY
wie die meisten Keywords. Wir haben unsere vertrauten
lockigen Zahnspangen. Wir beenden hier eine lockige Zahnspange, was Tri sagt,
kannst du bitte versuchen, etwas für mich zu tun? Weil ich das Gefühl habe, dass ein
Fehler auftreten wird. Wir wissen das, denn wenn
wir den Mauszeiger über diese Methode bewegen, können zwei mögliche
Fehler auftreten Da wir den Benutzer um
Eingaben bitten, wissen
wir, dass es Anzeichen dafür
gibt, dass Probleme auftreten. Wir sagen im Grunde,
bitte versuchen Sie es. So funktioniert das
Schlüsselwort tri. Wir versuchen etwas. Was passiert nun, wenn das fehlschlägt? Ein Versuch ist entweder erfolgreich und
das Programm läuft wie gewohnt, oder es kann ein Fehler auftreten. Dieser Teil ist das Schlüsselwort catch. Nochmal, lockige Zahnspangen,
genau wie zuvor. Nun, ein Versuch kann nicht ohne einen Haken
existieren. Wenn ich das Schlüsselwort
catch hier entferne, erhalten wir eine rote Linie. Wenn ich mit der Maus darüber fahre, wird erwarteter Fang angezeigt Oder lassen Sie uns das endlich zurücklegen. Die rote Linie ist weg. In diesem
Catch-Abschnitt hier ist es gut, dieser Code wird ausgeführt, wenn hier
ein Fehler auftritt. Dies teilt dem System mit,
wie es mit diesem Fehler umgehen soll. Sagen wir einfach, es ist ein
Fehler aufgetreten. Teilen wir dem Benutzer mit, dass ein
Fehler aufgetreten ist. Sehr generisch. Ich denke,
wenn ich diesen Fehler sehen würde, wäre
ich
als Benutzer genervt , weil ich
keine Ahnung habe, was das bedeutet Es ist sehr allgemein, aber darauf
können wir später noch näher eingehen. Lass uns einfach sehen, ob es funktioniert. Gib deine erste Zahl ein, lass uns ein paar Wörter oder Buchstaben eingeben. Jetzt können Sie sehen,
dass wir einen generischen Fehler haben. Jetzt ist ein Fehler aufgetreten. Unsere Software ist nicht abgestürzt, das ist
also gut so. Aber sie sagt nicht wirklich
so viele Informationen aus. Wir bekommen nur diese
allgemeine Nachricht. Wir wissen nicht, warum das passiert ist, wir wissen nicht, was schief gelaufen ist. Es ist für uns nicht sehr nützlich, aber zumindest ist unsere
Software nicht abgestürzt Das ist also ein gutes Zeichen. Schauen wir uns nun an, wie wir dem Benutzer besseres Feedback
geben können . Wir möchten
ihnen nicht mitteilen, dass ein Fehler
aufgetreten ist , da es sich nicht um
wirklich nützliche Informationen handelt. Der Benutzer kann dann nicht
zurückgehen und herausfinden,
was er falsch gemacht hat. Was wir hier
neben Catch tun können, ist
Klammern zu öffnen und zu schließen, eine Ausnahme einzugeben
und ihr
dann einen Namen zu geben Das kann alles sein,
es könnte EX sein, du kannst es nennen, wie du willst Im Grunde ist es eine
Variable, die wir
einrichten . Der Datentyp ist
vom Typ Ausnahme. So wie wir
einen Datentyp int haben, dieser ist eine Ausnahme. Jetzt werden wir uns später mit dem befassen, was als Kurs
bezeichnet wird, aber mach dir
darüber vorerst keine Gedanken. Aber jetzt haben wir
diese Variable namens E definiert, die vom Datentyp Exception ist. Wir können dies verwenden, um einige
Informationen über unseren Fehler zu erhalten. Was ich hier tun werde, ist, wenn wir
Zeichenketten zusammenfügen, verwenden
wir hier ein Plus. Ich werde hier sagen, dass die Nachrichtennachricht eine Zeichenketteneigenschaft dieser
Ausnahmevariablen ist. Sie wird
uns Feedback geben, die Fehlermeldung die den Grund
für die Ausnahme
erklärt. Wenn ich jetzt die Anwendung
starte und die erste Zahl eingebe, die aus vielen Buchstaben besteht, haben wir
jetzt ein bisschen mehr
Informationen, ein Fehler ist aufgetreten. Die Eingabezeichenfolge hatte nicht
das Crack-Format. Wenn der Benutzer das liest, kann
er denken, oh, okay, ja, ich habe die Frage falsch gelesen, ich dachte, sie würde nach
meiner E-Mail-Adresse fragen oder
so. Jetzt geben wir dem Benutzer also
nützliche Informationen
zurück. Was ist nun, wenn wir anpassen
möchten? Was wird passieren? Abhängig von der Art des Fehlers, der aufgetreten ist. Denken Sie jetzt daran, dass es mit
dieser Anwendung einige Probleme gibt. Ein paar Dinge
, die passieren können. Erstens kann der Benutzer
einige Buchstaben eingeben und sie nicht
in eine Ganzzahl umwandeln. Das haben wir uns jetzt angesehen. Das andere ist, dass wir
versuchen, durch Null zu teilen. Aber was
hier passiert, ist, dass wir nur diese
eine Codezeile machen. Was auch immer hier passiert, es passiert ein
Fehler. Wie können wir das anpassen? Sagen Sie dem Benutzer vielleicht, dass er etwas falsch
gemacht hat. Wenn sie versehentlich einige Buchstaben
eingeben, tun sie vielleicht etwas anderes. Wenn wir durch Null teilen
, können wir hier verschiedene
Arten von Ausnahmen erkennen. Wenn ich das kopiere und einfüge, werde
ich es hier zweimal einfügen, und ich werde bald erklären, warum. Die erste Ausnahme
, die hier passieren kann, ist
die Formatausnahme. Was ich hier tun kann, ist die
Formatausnahme genau hier
abzufangen. Was hier passieren wird, ist, wenn
eine Formatausnahme auftritt, ein
Fehler, der mit der Formatierung zu tun hat, wir können dem
Benutzer sagen, ich weiß es nicht. Wir könnten ihnen eine
wirklich sarkastische Botschaft geben. Wir könnten sagen, richtig lesen
lernen, weil sie die Frage offenkundig
nicht gelesen Das war zum Beispiel,
eine Zahl einzugeben und dann ihre
E-Mail-Adresse Die andere wurde durch Null
geteilt, okay? Also dividiere durch Null Ausnahme und die Nachricht, die ich dem Benutzer vielleicht geben
möchte, hey Kumpel, du kannst nicht durch Null
teilen. Was du dann tust, wenn es kein möglicher Fehler ist und
es kein möglicher Fehler ist, dann ist das ein generischer Fehler. Als wir diese
If-Anweisung hatten,
hatten wir am Ende
eine weitere,
ähnlich wie bei der Switch-Anweisung, hatten wir den Fall. Am Ende hatten wir dann eine Standardeinstellung. Das ist es, was das hier
erreichen soll. Wenn also keiner dieser
Fehler aufgetreten ist, haben
wir immer unser kleines
Sicherheitsnetz am unteren Rand, das nur eine Botschaft
hier in der realen Welt aussendet Sie werden hier wahrscheinlich nicht
nur eine Nachricht haben Sie würden das System
diese Fehler
wahrscheinlich anders protokollieren lassen und
diese Fehler anders. Aber das ist nur ein Beispiel. Sie können jetzt sehen, ob
ich die Anwendung starte, ich gebe ein Wort ein. Sie
sagt mir jetzt, dass ich lernen soll, richtig zu lesen.
Charmant, nicht wahr? Wenn ich jetzt zwei Zahlen eingebe, versuche
ich, durch Null zu dividieren. Hey Bird, du kannst nicht durch Null
teilen. Jetzt können Sie sehen, dass es sich um zwei verschiedene Dinge handelt,
je nachdem, welcher Fehler aufgetreten ist. Das Letzte,
worüber ich sprechen möchte, ist das Schlüsselwort final. Jetzt passt das
Finaly-Schlüsselwort zu einem Tri-Schlüsselwort. Es ist optional, Sie müssen
keines verwenden, aber es kann sehr nützlich sein. Schauen wir uns
an, wie es funktioniert. Schließlich gehen wir entweder nach oder nach allen
Fängen nach dem Versuch Wenn ein Fehler aufgetreten ist, wird der
gesamte Code in diesem
Finally-Block ausgeführt, auch wenn ein Fehler aufgetreten ist Wenn kein Fehler aufgetreten ist, wird dieser
ebenfalls ausgeführt. Es ist
vielleicht sehr nützlich, wenn Sie mit
einer Datenbank oder
sogenannten Threads arbeiten einer Datenbank oder
sogenannten Threads und Verbindungen
schließen oder alles
fertigstellen können , wofür es
wirklich gedacht ist Aber in unserem kleinen Beispiel hier können
wir dem Benutzer
einfach dafür danken, dass er das Programm benutzt Zum Beispiel danke ich dem
Benutzer für die Verwendung des Programms. Schauen wir uns das ganz schnell
an. Wenn ich die Software verwende und etwas Ungültiges
eingebe, sagen
wir dem Benutzer, dass er
lernen soll, richtig zu lesen, sagen
dann
Danke, dass er unser Programm benutzt. Das ist ziemlich
sarkastisch, nicht wahr? Geben wir nun
einige gültige Zahlen ein. Jetzt erhalten wir ein aktuelles Ergebnis. Hier können Sie sehen, dass der Finaly-Block
immer noch ausgeführt wird. Vielen Dank, dass Sie unser Programm verwenden. Sie können sehen, dass endlich ausgeführt wird unabhängig davon, ob ein
Fehler aufgetreten ist oder nicht. Wie gesagt, es ist optional,
man braucht es nicht, aber es kann sehr
nützlich sein, das heißt, wie man
Ausnahmen abfängt und behandelt , wenn man mit C Sharp
arbeitet.
35. 8-2. 2D-, 3D- und mehrdimensionale Arrays: Ich möchte
das Konzept der
zweidimensionalen
Arrays in C Sharp vorstellen zweidimensionalen
Arrays Was wir uns bisher angesehen haben, ist ein
eindimensionales Standardarray Standardmäßig wird ein Array im Shop als
eine Dimension betrachtet. Was ist jedoch, wenn wir zum Beispiel ein
Schachbrett
simulieren wollen , bei dem acht
Felder
quer verlaufen , aber auch acht
Felder nach oben gehen. Dann können wir uns auf diese
Felder im Schachspiel beziehen, wie auf ein Rastersystem, bei dem x
quer und y nach oben geht. Wir können
das mit einem
sogenannten zweidimensionalen
Array im Shop simulieren . Schauen wir uns dieses Beispiel hier an. Wir haben hier gerade einige
Zahlen definiert und
speichern sie in einem
Integer-Array namens Numb Und wir geben gerade
die erste Zahl in unserem
Array auf dem Wenn ich die Anwendung starte, ist
die erste Zahl
im Array eins, was richtig ist, weil
dies die erste Zahl ist Ich zeige Ihnen ein Beispiel
für ein zweidimensionales Array. Das ist jetzt unser
eindimensionales Array. Ich werde nur ein paar Zahlen
entfernen. Das Beispiel ist nicht langatmig. Um dieses eindimensionale Array
hier in
ein
zweidimensionales Array umzuwandeln, verwende
ich hier ein Komma innerhalb dieser
eckigen Klammern Nun, das sagt
C Sharp, hey, ich möchte jetzt ein
zweidimensionales Array erstellen So
visualisieren wir unser Array. Es sieht ungefähr so aus. Aber ich möchte
ein Zwei-D-Array erstellen , das so aussehen
wird. Weil es in der Natur
von zwei Dimensionen liegt, gibt
es eine Dimension, die
rüber geht und eine, die nach unten geht. Und dann füllt es sich
wie Millimeterpapier, ein Schachbrett, so
etwas aus Das wollen wir hier
nachahmen. Jetzt habe ich hier Kommas gesetzt, wir erhalten sofort eine rote Linie weil C Sharp weiß, dass wir ein Zwei-D-Array
erstellen Aber dieses Format ist falsch. Das Format für ein
Zwei-D-Array sieht so aus. Die äußeren geschweiften Klammern hier sind der Behälter
für alles Dann befindet sich in jedem Satz geschweifter
Klammern jede Zeile. Wenn ich das kopiere und
das da reinlege, kopiere das. Steck das da rein.
Und kopiere das. Und leg das da rein.
Nun, diese Initialisierung der beiden Arrays
hier sieht
so ziemlich so aus Das ist dasselbe wie das. So solltest du dir das
vorstellen. Nun, wie
greifen wir eigentlich auf diese Zahlen zu? Auch dieses Format ist falsch. Wenn wir mit der Maus darüber fahren, können
wir hier eine falsche
Anzahl von Indizes sehen Das liegt daran, dass es
jetzt zwei erwartet. Da wir hier
ein Zweier-Array erstellt haben, können wir
nur das Kommasystem verwenden, zum Beispiel 00 Das wird nun tatsächlich
die erste Zahl
im ersten Block ausgeben die erste Zahl
im ersten Block Hier ist der erste Block, hier ist der zweite Block. Hier ist der dritte Block. Auch hier
beginnen alle Indizes bei Null. Dies ist der erste Wert, der hier durch die erste
Zahl
repräsentiert wird, Null Die zweite Zahl hier Dies ist die Nummer des
Elements innerhalb des ersten Blocks, das ist das erste Objekt
dort, das eins sein sollte. Dies sollte genau
hier
Nummer eins ausgeben , wenn wir die Anwendung
dort ausführen, Nummer eins Wenn wir die zweite
Ziffer ändern, zum Beispiel zwei, dann 012, sollte es
Nummer drei ausgeben , wie
Sie dort sehen können Wenn wir das auf zwei erhöhen, dann sollte es hier draußen sein, weil es zwei
quer und zwei unten ist, sollten
wir Nummer neun bekommen. Da haben wir's.
So greifen Sie auf Informationen aus einem
Zwei-D-Array in C Sharp zu. Jetzt stellen Sie sich vielleicht die
Frage, was ist mit drei? Was ist mit vier Arrays? Wir betrachten das als zwei. Nun, dieses Beispiel wird viel
zu verrückt werden. Das minimiert es. Das wird jetzt so aussehen. Wie wäre es mit einer Reihe von drei? Nun ja, sehr einfach. Nehmen wir jedes davon und ersetzen wir jede Zahl
durch ein zusätzliches Set. Wenn wir nun den Mauszeiger hier drüber bewegen und falsche Anzahl von Indizes drei
erwartet hat, geben
wir einen dritten ein Jetzt können Sie sehen, dass das
Koordinatensystem dreidimensional
ist Wenn ich das Programm jetzt starte ist
die erste Zahl im
Array eins, was sie auch ist. Dies ist der allererste Artikel. Sie können also sehen, dass dies quasi
das Konzept von zwei Arrays ist. Drei Arrays. Und weißt du, von da an kann
es weitergehen Und du stellst dir vielleicht die
Frage, wie viele Dimensionen
können wir gehen? Nun, die Antwort 32, falls
Sie sich das jemals fragen sollten. Wir können also bis zu 32
Dimensionen in einem Array im Shop haben.
36. 8-3. Übung - Schach - Finde das Königinnenspiel: Ich werde mich jetzt
einer kleinen Herausforderung stellen. Ich werde
Ihr Wissen über
zweidimensionale Arrays
und auch über Problemlösungen testen zweidimensionale Arrays
und auch über Problemlösungen Betrachten Sie diese Vorlage hier. Sie emuliert ein Schachbrett Wenn Sie mit Schach vertraut sind, dann haben Sie das vielleicht schon
herausgefunden Wenn nicht, mach dir darüber keine
Sorgen. Wir werden eine
Software entwickeln, um alle Königinnen zu finden, was durch
ein Q auf diesem Schachbrett dargestellt wird Nun, so sieht das
Schachbrett aus. Wir haben ein Schloss, einen Turm, einen Bischof, eine Königin und einen
König, alle Bauern,
einige leere Felder, die durch Null
dargestellt werden, und auch die Figuren der anderen Spieler Wenn Sie mit Schach nicht
vertraut sind, wollen wir das
Stichwort finden Dies ist eine Zeichenanordnung, die von Shah
repräsentiert wird. In einem Zeichen stehen sie alle in
einfachen Anführungszeichen und Sie können
nur einen Buchstaben enthalten, andernfalls wird ein Fehler ausgegeben Was wir tun wollen,
ist die Hinweise in
diesem zweidimensionalen Array zu finden diesem zweidimensionalen Array und
sie dann im Fenster auszugeben Also, wie machen wir das?
Wie finden wir etwas? Hier ist unser 2-D-Array. Wie suchen wir uns diese Königinnen aus? Nun, was wir tun wollen,
wir wollen jeden einzelnen testen. Ist das ein Hinweis, ist das ein Queue, Nein, usw., und so weiter. In deinem Kopf
solltest du denken,
okay, eine Schleife. Wir brauchen eine Schleife. Aber da es mehr
als eine Dimension gibt, müssen
wir das Ganze überprüfen. Wir müssen auch überprüfen, nach unten
gehen, wir überprüfen all das. Gehen Sie einen runter, überprüfen Sie
alle. Eins, check, all das. In deinem Kopf
solltest du denken, okay, wir brauchen einen Loop und
wir brauchen zwei davon. Wir wissen bereits, wie viele
Iterationen wir brauchen, denn wir haben acht, die
durchqueren und acht, die runter gehen Du solltest denken,
okay, 24 Loops. Vier, weil wir die Anzahl der
Iterationen und eine Schleife
kennen , weil wir immer wieder
etwas überprüfen müssen, machen
wir 24 Schleifen Die erste Schleife, die ich machen werde
, ist die Y-Schleife, und diese wird sich abwärts bewegen.
Fangen wir damit Wir werden mit Null beginnen, weil alle Indizes bei Null
beginnen Das ist ein leichtes 00
, y ist kleiner. Jetzt wollen wir hier die Länge
dieser Dimension ermitteln. Wie machen wir das?
Wir nehmen hier den Namen
unserer beiden Arrays, Punkt. Und dann wollen wir
die Methode get length verwenden. Wenn wir
Klammern dazu öffnen, ich nach einer
Dimension gefragt, nun, das ist die erste Dimension, ich werde hier Null eingeben Das ergibt die erste
Dimension und
dann das Semikolon und wird jedes Mal
um eins erhöht Das ist unsere erste Schleife. Jetzt laufen wir runter. Wir müssen uns auch durchqueren. Wir benötigen
eine weitere Schleife innerhalb unserer Schleife, die hier die X-Achse
darstellt. Wir wollen die zweite
Dimension hineinbringen, die durch eins repräsentiert wird. Das geht jetzt durch die
erste Dimension hier unten. Das geht hier drüben durch die
zweite Dimension. Jetzt haben wir unsere
beiden Loops eingerichtet. Wir müssen tatsächlich
jeden dieser Werte überprüfen. Wir können das mit
einer if-Anweisung tun. Dass wir
den aktuellen Wert angeben können wenn es sich um eine Königin handelt. Und dann sage ich einfach , dass die Königin an diesem Ort
gefunden wurde. Nur damit das Sinn macht. Wenn das Objekt bei X, das
durch diese vier Schleifen repräsentiert
wird, und X offensichtlich bei jedem Überqueren um
eins erhöht wird , geht
das hier in den
ersten Slot. Dann ist das zweite
Y und das bewegt sich nach unten. Was wir tun, wir
überprüfen jeden Wert, wir gehen den ganzen Weg rüber
und dann einen
runter, einen weiteren quer runter. Das macht der Loop. Und jedes Mal schauen wir nach, ob es sich bei dem Slot um eine Königin handelt. Wenn ja, die Bedingung wahr ist, dann führen wir diese
Codezeile genau
hier aus , die nur besagt, dass die
Königin am Standort gefunden wurde. Und wir geben X und Y aus. Mal sehen, ob das funktioniert Lassen Sie uns die Anwendung ausführen. Queen wurde an Standort 03 und Queen
an Standort 73 gefunden. Wenn wir Recht haben,
03, ist das Null. Das ist alles Null hier. 0123. Das ist richtig Ich glaube, der nächste war 701-23-4567 Sie können sehen, dass es
erfolgreich
beide Königinnen auf diesem Schachbrett gefunden hat beide Wenn du das ändern willst, können
wir die Könige finden und dann können wir stattdessen einfach ein K
finden, und das findet die
Könige auf dem Brett Das war eine ziemlich lustige Herausforderung. Wenn irgendwas davon verwirrend ist,
gehen Sie es noch einmal durch. Möglicherweise bekommen Sie es nicht beim ersten Mal, machen Sie sich darüber keine Sorgen. Aber du wirst es langsam
verstehen, je mehr
du dir dieses Video ansiehst und das Problem
verstehst. Aber das ist so etwas wie
ein Beispiel aus der realen Welt in dem wir ein Schachbrett simulieren, wenn wir
zum Beispiel
mit zwei D-Arrays in C Sharp arbeiten
37. 8-4. Listen: Jetzt werde ich
eine neue Sammlung in C Sharp
vorstellen , die als Liste bezeichnet wird. Nun, intern ist eine Liste ziemlich
mächtig, sie
baut eigentlich auf einem Standardarray auf, aber sie enthält viel
mehr Optionen und viele Möglichkeiten, mit
den Informationen
innerhalb des Arrays zu arbeiten . Lassen Sie uns zum Beispiel hier über
dieses Beispiel sprechen. Wir definieren ein
Integer-Array in C Sharp. Wir geben ihm nur einige
zufällige Zahlenwerte. Wir verwenden jeweils eine
Vierer-Schleife, um
jedes Objekt in der Sammlung durchzugehen jedes Objekt in der Sammlung und es auf dem Bildschirm auszugeben Wenn ich die Anwendung jetzt starte können
Sie all diese
Zahlen genau dort sehen Ganz einfach, ich werde
eine neue Liste erstellen. Ich werde
diese Funktionalität nachahmen. Sie können zum Beispiel den
Unterschied zwischen
einem Array und einer
Liste sehen Beispiel den
Unterschied zwischen
einem Array und einer
Liste Jetzt ist es ein etwas
kompliziertes Thema. Angesichts unseres bisherigen Lernens werde
ich nicht alles
erklären, aber ich werde einige
Dinge behandeln, die mit Listen zu tun haben. Nun, wie erstellen wir eine Liste? Nun, der Datentyp ist Liste. Jetzt gibt es eine neue Notation wir noch nicht wirklich gesprochen haben. Das nennt man Generika. Nun, ich werde nicht zu viel
über Generika sprechen weil ich denke, dass es im Moment ein
ziemlich kompliziertes
Thema Aber was ich tun möchte, ist
eine Liste zu definieren ,
die ganze Zahlen enthält Sie können
sehen, dass Visual Studio versucht, mir
hier zu helfen Es deutet tatsächlich an, was
ich tun möchte. Es ist richtig Lass uns dort einfach die Tabulatortaste
auf der Tastatur drücken. Und es ist in dieser
Notation für uns geschrieben. Ich werde das einfach als
abschließen. Also haben wir die obige
Funktionalität nachgeahmt. Nun, diese Zeile hier ist genau dieselbe wie
diese Zeile hier Das ist eine Art Sammlung. Dies ist eine Art von Sammlung. Es ist ein Integer-Array. Hier ist es eine Integer-Liste, und sie enthalten alle
die gleichen Informationen. Das werde ich dir beweisen. Wenn ich
diese Liste
hier durchgehe und alle
Zahlen auf dem Bildschirm ausgebe, macht
es genau dasselbe. Wie definieren und
initialisieren wir eine Liste in C Sharp? Nun, wir verwenden das
Schlüsselwort list mit einem großen
L in diesen eckigen Klammern Genau hier fügen wir den Datentyp, wir speichern möchten, in die Liste ein. In ähnlicher Weise würden wir das tun, wenn
wir
eine Liste von Zeichenketten haben wollten . Zum Beispiel setzen wir den Datentyp in diese
eckigen Klammern, geben ihm einen Namen und verwenden dann
ein Gleichheitszeichen. Und dann wollen wir dem System
sagen:
Okay, jetzt wollen wir die Liste
initialisieren Jetzt wollen wir
die Liste erstellen und einige
Informationen hineinlegen Wir verwenden dieses neue Schlüsselwort und wiederholen den Datentyp erneut. Dann können
wir sie in diesen Klammern entweder leer lassen oder wir können ihr eine Kapazität geben,
genau wie einem Array Wir können zum Beispiel sogar eine
bestehende Sammlung in sie übernehmen Was ich tun könnte, ist das zu tun. Dadurch wird hier eine Liste erstellt, die
auf meinem Array basiert. Sie können sehen, dass es
schon ziemlich mächtig wird. Auch hier kann ich beweisen, dass das
auch funktioniert, indem ich
die Anwendung starte und sie die Zahlen
durchläuft die Anwendung starte und sie , die
wir ihr übergeben haben. Sie können sehen, dass es in dieser Hinsicht ziemlich
mächtig ist. Aber die Sache mit
Standard-Arrays in C Sharp zum Beispiel, lass uns hier einfach mit unserem
Standard-Array arbeiten Wenn ich mir die nativen
Methoden ansehe, die mit einem Array zu tun
haben, können wir damit nicht wirklich viel anfangen Wir haben einige verschiedene
Methoden, die wir verwenden können, wie zum Beispiel die Länge
der Arrays oder die Anzahl
der Elemente im Array zu ermitteln, aber sonst haben wir nicht wirklich viel mit nativen Methoden
zu tun Was ist, wenn wir diese Informationen
sortieren wollen? Vielleicht die kleinste Zahl an
den Anfang und dann die
größte am Ende setzen ? Wie kehren wir die
Reihenfolge dieser Zahlen um? Verschiedene Dinge wie diese. Nun, das ist einer
der vielen Vorteile der Verwendung von Listen im Geschäft. Was wir tun können. Schauen wir uns einige Beispiele für die
Arbeit mit Listen an. Hier definiere ich eine neue Liste. Ich kann eine neue Liste definieren
und sie einfach leer lassen. Und später
in der Anwendung, wenn wir herausfinden, was wir eigentlich in unsere Liste aufnehmen
wollen eigentlich in unsere Liste aufnehmen
wollen , können
wir dynamisch und spontan Elemente
hinzufügen. Also könnte ich diese
Nummer gleich hier hinzufügen. Und dann noch einer. Vielleicht können wir die Liste definieren,
wenn wir eine Anwendung
erstellen wollen , in der
wir
Zahlen von einem Benutzer sammeln . Und später können wir
die Benutzernummern hinzufügen , wenn
wir die Software ausführen. Jetzt können wir sehen, dass
die Liste jetzt
die beiden Zahlen enthält , die wir hier mit
der Methode add
hinzugefügt haben . Aber wir können nicht nur Dinge hinzufügen, wir können auch Dinge entfernen. Wir können verschiedene
Dinge nativ tun. Aber eines der
leistungsfähigeren ist, dass wir die Daten tatsächlich sortieren können Wir können sie der Reihe nach sortieren. Wir können die Zahlen sogar umkehren. Zum Beispiel gibt es hier eine Liste mit diesen
Zahlen. Und wir werden die Sortiermethode verwenden. Und was das bewirken wird,
es nimmt alle ganzen Zahlen und
sortiert sie
der Das ist das einzige, was Sie dafür tun
müssen , wenn wir die Software ausführen Jetzt können Sie sehen, dass alle unsere Zahlen in
sequentieller Reihenfolge sind Das ist sehr einfach, nur dieser sehr kurze,
einzeilige Code Hier können Sie mit der List-Klasse verschiedene
Dinge tun und sie bietet eine
leistungsfähigere
Art , mit Ihren Daten zu arbeiten. Das heißt nicht, dass
ein Raiser unbedingt nutzlos ist. Sie können diese
Dinge mit einer Gehaltserhöhung erreichen indem Sie Erweiterungen wie Link
und ähnliches verwenden, aber darauf werde ich jetzt nicht eingehen Ich möchte
dieses Tutorial nicht zu sehr verkomplizieren, aber ich stelle nur
einige der Vorteile vor, die die
Verwendung von Listen beim
Programmieren in C Sharp Zusammenfassend lässt sich sagen, dass Sie, wenn Sie über
eine Sammlung von Daten verfügen ,
seien es ganze Zahlen, Zeichenketten oder einen anderen Datentyp, und Sie die Kapazität nicht unbedingt
kennen, vielleicht während
der Anwendung Werte
hinzufügen möchten während
der Anwendung Werte
hinzufügen Vielleicht
muss der Benutzer Elemente hinzufügen oder Sie möchten die
Daten besser kontrollieren Dann ist List vielleicht
etwas für dich. Vielleicht ist es ein Datentyp, den
Sie untersuchen möchten. Aber es ist ein mächtiger Datentyp, und ich empfehle Ihnen,
Listen mit Ihren
Abenteuern im C-Shop zu verwenden .
38. 9-1. O-O, Klassen und Objekte: Klassen und Objekte in C Sharp. Was ist eine Klasse?
Was ist ein Objekt? Was bedeutet das alles? Nun, lassen Sie mich das erklären Klassen und Objekte in C Sharp unterstützen
das sogenannte Programmierparadigma.
Was bedeutet das alles Programmieren ist
die Abkürzung für das, was man
objektorientierte Programmierung nennt ,
und es ist ein Paradigma Ein Paradigma ist nur
ein ausgefallenes Wort eine Art
und Weise,
etwas wie eine Methode zu tun Wenn Sie Ihre
Bemühungen im Programmieren fortsetzen, Sie dieses Wort vielleicht oft sehen, also dachte ich, ich
würde es ansprechen Heute ist ein Paradigma ein
Programmierstil. Stellen Sie sich einen Koch in der Küche
mit rohem Hühnchen vor. Er könnte das Huhn braten. Er konnte das Huhn kochen, er konnte das Huhn braten Aber jedes
davon ist ein Paradigma, eine andere Art, zum Endergebnis
zu gelangen Das ist also ein Paradigma. Nun, wenn es um
grundlegende Programme wie Erstellen eines Taschenrechners oder
etwas ganz Einfachem geht, Paradigmen für Anfänger nicht wirklich
wichtig Es ist keine Überraschung, dass Sie
wahrscheinlich noch
nie eines benutzt haben , wenn Software
nur 2030,
40, vielleicht sogar 50 Codezeilen hat 40, vielleicht sogar 50 Codezeilen Die Art und Weise, wie Sie Ihre
Software strukturieren, ist nicht wirklich wichtig, da es sich um eine
ziemlich kleine Programmierung handelt, der Programmierstil
ist sehr wichtig. Wenn Sie große
Softwarekomponenten haben, haben
Sie vielleicht 2030, 100 Leute, die an
einer Software arbeiten. Die Organisation des Codes
ist sehr wichtig. Betrachten Sie das zum Beispiel. Wenn Sie viele
Codezeilen haben, die so aussehen, wie pflegen Sie das dann überhaupt? Es könnte 50 Seiten
lang sein, 1.000 Seiten lang. Wir brauchen eine Struktur, wir brauchen eine Organisation. Und das ist eines der vielen
Elemente der 00-Programmierung. Nun, 00-Programmierung,
es ist ein sehr umfangreiches, kompliziertes Thema,
das viele
Vorteile und
viele Vorteile hat , aber das ist einer davon. Nun zum Programmieren. Es geht auf die 1950er und 1960er Jahre
zurück, aber
soweit ich mich erinnere, hat es Anfang 2000 definitiv
an Popularität
gewonnen . Das war der Zeitpunkt, an dem es
richtig losging. Was wir
bisher wirklich gemacht haben ist die sogenannte
prozedurale Programmierung, bei der das Programm startet und wir jede Zeile der Reihe nach ausführen. Wir haben vielleicht ein oder zwei Methoden. Und weißt du, die Dinge
sind sehr einfach. Aber auch hier ist es bei sehr großen
Softwareanwendungen ziemlich schwierig, dies aufrechtzuerhalten. Zum Beispiel 00 Programmierung, sehr großes, sehr
kompliziertes Thema. Ich kann Sie jetzt mit
allen Einzelheiten langweilen ,
aber ich glaube nicht, dass das eine gute
Art ist, 00-Programmierung zu lernen. Ich denke, die beste Art zu
lernen ist, sich mit
einigen
Beispielen aus der realen Welt auseinanderzusetzen und sie dann anhand von
Arbeitsbeispielen durchzugehen. Erinnerst du dich an
den Film Karate Kid, in dem Daniel Larusso
das Haus malt und den Zaun malt
und den Boden
schleift Und heimlich
lernte er all dieses Karate, wusste aber nicht wirklich warum. Und am
Ende sagte Herr Magi,
oh, okay, jetzt teste Also, um bei
der Stange zu bleiben
, möchte ich O-Programmieren genau so
beibringen,
und ich finde, das ist
eine fantastische Art, 00-Programmierung zu
lernen,
indem man und ich finde, das ist
eine fantastische Art anhand von Beispielen lernt dann am Ende auf
Umwegen zurückkommt Wenn ich also über komplizierte Wörter
wie Instanziierung,
Polymorphismus, Abstraktion, Kohäsion, Kopplung spreche,
all diese komplizierten Dinge
, könnte all diese komplizierten Dinge Aber das Problem ist in Wirklichkeit, Und um die
Motivation aufrechtzuerhalten und Sie bei
der Stange zu
halten, werde
ich das auf
diese Weise tun, und ich denke, das wird
eine fantastische Art sein diese Klassen
und Objekte in C Sharp zu
lernen Was ist eine Klasse?
Was ist ein Objekt und wie nützt es mir, und warum sollte ich es überhaupt benutzen? Wenn Sie bisher einige
der Tutorials
verfolgt haben, die
wir bisher erstellt haben, haben
wir einige
grundlegende Beispiele erstellt, haben
wir einige
grundlegende Beispiele erstellt wie zum Beispiel zwei
Zahlen miteinander multiplizieren. Hier nehmen wir zwei Zahlen von einem Benutzer und multiplizieren sie zum Beispiel
miteinander. Und wenn wir eine
Zahl von einem Benutzer nehmen, können
wir dies als
Integer-Datentyp darstellen ,
was ziemlich einfach ist. Und das ist alles was wir tun müssen. Wir müssen
keine weiteren Informationen
über diese Zahlen wissen , um sie miteinander zu
multiplizieren. In ähnlicher Weise können wir, wenn wir
den Namen vom Benutzer übernehmen, ihn in einem einfachen
Datentyp speichern , der eine Zeichenfolge ist, und wir speichern einfach
den Namen des Benutzers. Also sehr einfach. Aber wie stellen
wir einen
komplexen Datentyp dar, wie einen Benutzer oder vielleicht ein
Konto wie ein soziales Konto oder ein Bankkonto oder sogar ein Fahrrad wie
ein Objekt aus der realen Welt, oder ein Sandwich, oder sogar einen ganzen
Planeten wie den Planeten Erde oder
so? Nun, bis jetzt haben
wir mit unserem
prozeduralen Programmierstil Cano, vielleicht um einen Benutzer darzustellen , eine Zeichenfolge , die der Vorname des
Benutzers sein könnte, und dann eine weitere Zeichenfolge
für seinen Nachnamen. Vielleicht eine Ganzzahl für ihr Alter und dann vielleicht eine Zeichenfolge
für ihren Benutzernamen. Wenn sie einen Benutzernamen haben, könnten
wir vielleicht eine Dezimalzahl oder ein Doppeltes
für ihre Größe verwenden. Die Liste geht weiter.
Es gibt so viele Dinge, die Sie über einen Benutzer speichern können. Sie können sehen, dass ich bereits fünf Codezeilen für
all diese Variablen habe. Diese Kannenseite hier wird sie sehr schnell
mit vielen Informationen füllen. Vielleicht könnte ich diese
fünf Datentypen hier verwenden. Diese einfachen
Datentypen, string, int und double, um ein
komplexes Objekt wie einen Benutzer darzustellen. Und wenn ich ein Fahrrad habe, möchte
ich vielleicht die
Farbe des Fahrrads, die Marke des Fahrrads, vielleicht die Maße, solche
Dinge. Und so würde ich ein Fahrradobjekt
darstellen. Aber wie füge ich all das in ein eigenes Objekt ein? Anstatt
für jeden Benutzer in
unserer Anwendung kann
ich beispielsweise für jeden Benutzer in
unserer Anwendung kann
ich beispielsweise einfach Benutzer eingeben und wir
könnten unseren eigenen Datentyp haben, z. B. einen Benutzerdatentyp. Das wäre ziemlich
cool, nicht wahr? Dies ist einer der Vorteile der
Verwendung von Klassen und
Objekten in C Sharp. Schauen wir uns an,
wie wir in C Sharp tatsächlich unseren eigenen
Datentyp
erstellen können . Was ich jetzt tun werde, ist eine brandneue Klasse zu
erstellen, im Grunde einen
brandneuen benutzerdefinierten Datentyp , den wir überall
in unserer Software verwenden können. Wenn wir hier auf die
rechte Seite gehen, ist
das der Name unseres Projekts
hier, Programmieren. Und es hat ein kleines C-scharfes
Symbol mit einem Quadrat drum herum. Also werde ich mit der
rechten Maustaste darauf klicken. Ich gehe zu Hinzufügen
und dann gehe ich
zum Unterricht. Sobald wir hier sind, können wir
sehen, dass Klassen ausgewählt wurden. Hier unten können wir
der Klasse einen Namen geben. Jetzt kannst du die Klasse nennen
, wie du willst. Es ist jedoch üblich
, sie mit
einem Großbuchstaben zu
beginnen , der ihrem Zweck entspricht. Was ist der Zweck dieses
Kurses? Was macht sie? Welche Informationen enthält es? Oder was ist ihre Hauptfunktion? Auf diese Weise wissen
Sie bei
einer sehr großen Anwendung mit vielleicht 1.000 Klassen mit vielleicht 1.000 Klassen anhand des Namens genau, was damit erreicht wird und
was damit angestrebt wird. Ich werde
einen benutzerdefinierten Datentyp namens User erstellen . Dadurch werden Informationen über
einen potenziellen Benutzer
gespeichert , der
möglicherweise unsere Software verwendet. Ich nenne es Benutzer und klicke
dann genau hier auf die
Anzeigenschaltfläche. Was das bewirkt, es schafft eine ganz neue Klasse
in unserem Projekt. Das ist unser Projekt hier. Wir waren soweit, wenn Sie sich unsere
vorherigen Tutorials mit
der Standardklasse Programm
angesehen haben , und wir haben
mit der Hauptmethode gearbeitet. Sie können hier sehen, dass es eine Klasse namens program gibt und die Hauptmethode darin enthalten ist. Dies ist eine Standardklasse
eines Konsolenanwendungstyps. Aber wenn wir hier rüber gehen, haben wir
jetzt eine
brandneue Klasse namens User. Und jetzt können wir hier
einige Informationen
in diese Klasse einfügen . Sie können also sehen, dass Visual Studio darauf
hindeutet, was ich hier vielleicht einfügen
möchte Ja, das mag eine bessere
Methode sein, aber ich werde in einem zukünftigen Tutorial über Get
and Set sprechen in einem zukünftigen Tutorial über Get
and Set Also werde ich das
etwas anders machen. Was wir
hier in unserer neuen Klasse,
die Benutzer heißt, tun wollen ,
ist, alles
über unseren Benutzer zu sagen. Also vielleicht der Vorname des Benutzers, der Nachname des Benutzers,
das Alter des Benutzers. Alles, was mit einem Benutzer zu tun hat. Was ich tun werde,
ich werde hier
einige einfache Variablen definieren . Also, was ich tun werde, nenne
ich es zum Beispiel vielleicht
Vorname und dann vielleicht einen Nachnamen und dann vielleicht das Alter, so
etwas in der Art. Vor jedem von
diesen
möchte ich nur dieses interne Schlüsselwort setzen. Mach dir jetzt keine Gedanken darüber
, was das bedeutet. Wir werden das in einem späteren Tutorial
noch einmal behandeln. Aber was ich getan habe, ich habe hier
drei einfache Datentypen definiert , zwei Zeichenketten und eine Ganzzahl. Und alle drei gehören
zur Benutzerklasse. Dies ist die neue Klasse, die wir gerade
erstellt haben . Was bedeutet das
alles? Das ist hier unser benutzerdefinierter
Datentyp So wie eine Ganzzahl ein Datentyp
ist, ist
eine Zeichenfolge ein Datentyp. Nun, Benutzer ist unser eigener
benutzerdefinierter Datentyp und er enthält all diese
Dinge. Schauen wir uns ein Beispiel
an, was das bedeutet. Wenn wir
hier mit der Hauptmethode zu unserer Hauptklasse zurückkehren , können
wir tatsächlich eine
sogenannte Instanz
unserer neuen Klasse einrichten . Genau wie wenn wir eine Zeichenfolge
erstellen, könnten
wir so etwas tun. Aber wenn wir einen
benutzerdefinierten Datentyp haben, wie zum Beispiel eine neue Klasse, ist
das Format
etwas anders. Es wäre unser
benutzerdefinierter Datentyp
, der der Name unserer Klasse ist
, also user, weil wir eine Klasse
mit dem Namen user
erstellt haben . Sie können jetzt sehen,
dass
dies grün ist und tatsächlich einige
Informationen über unsere Klasse enthält. Wenn ich zum Beispiel Bacon eintippe, dann siehst du, dass es
schwarz ist, es gibt eine rote Linie. Das liegt daran, dass wir keinen Kurs namens Bacon
haben. Jetzt haben wir eine Klasse
namens User, sie ist grün. Und das können wir tatsächlich
nutzen. Jetzt geben wir ihm einen
Namen, genau wie wir es hier tun, zum Beispiel mit
einer einfachen Variablen. Ich nenne es einfach USA. R, Abkürzung für User. Dann werde ich gleich vorgehen. Und Visual Studio
gibt mir einen Hinweis darauf,
was ich tun möchte. Das ist genau das
, was ich tun möchte. Ich möchte eine neue Instanz
unserer Klasse namens user erstellen. Und ich gebe ihr den Namen USR. Ich kann ihm einen beliebigen Namen
geben , es
spielt keine Rolle Jetzt habe ich eine brandneue Variable, genau wie eine Variable
hier vom Typ Zeichenfolge. Ich habe
hier jetzt eine neue Variable namens US-Benutzer. Wenn ich anfange,
meine Variable USR zu verwenden und danach einen Pfeil
setze, können
Sie sehen, dass ich
tatsächlich auf
diese Variablen zugreifen kann , die ich gerade in unserer
Klasse erstellt habe Sie können hier den Nachnamen, den Vornamen und das Alter sehen und das Alter Lassen Sie uns eine
Beispiel-Benutzervariable einrichten. Wenn ich Vorname des Benutzers sage, wissen
wir, dass es sich um eine Zeichenfolge handelt. Rufen wir ihn an, ich weiß es nicht. Nennen wir ihn Bob. Warum nicht? Lassen Sie uns einen
Nachnamen für unseren Benutzer einrichten. Wir nennen ihn Bob Smith. Schließlich möchte Bob Visual
Studio, dass ich 30 setze. Warum nicht? Ich bin mir nicht sicher, warum Visual Studio
30 anzeigt, aber los geht's. Nun, was ich
hier gemacht habe, ich habe genau hier
ein brandneues
Benutzerobjekt erstellt . Und dann habe ich
ihm einige Informationen gegeben. Diese Felder hier. Dies sind genau dieselben
Felder, die wir in
unserem brandneuen Benutzer definiert haben , was unserem Datentyp
entspricht, und wir haben ihm hier
einige Werte gegeben. Was ich jetzt tun kann, ist diese Informationen tatsächlich zu
verwenden. Wenn ich die rechte Zeile in der Konsole mache, kann
ich einige
dieser Informationen tatsächlich
auf dem Bildschirm ausgeben . Nehmen wir an, lassen Sie mich
den Vornamen,
Nachnamen und das Alter des Benutzers ausgeben . Lassen wir das Konsolenfenster geöffnet, damit es sich bei uns nicht schließt. Lassen Sie uns nun die Anwendung ausführen
, um zu sehen, was wir hier haben. die Anwendung ausführen, können wir sehen, dass wir tatsächlich
alle Werte für unseren
benutzerdefinierten Datentyp auf dem Bildschirm ausgeben alle Werte für unseren
benutzerdefinierten Datentyp auf dem Bildschirm Wir legen die
Werte auf diese Weise fest. Wir geben die Werte
unseres benutzerdefinierten Datentyps so auf dem Bildschirm Wenn Sie
Klassen in C Sharp erstellen, wie zum Beispiel unsere benutzerdefinierte
Benutzerklasse hier,
stellen Sie sich vor, dass diese Klasse ein
Entwurf, eine Alles in unserer Klasse
hier hat mit einem Benutzer zu tun, es hat nicht mit einem Fahrrad
oder einem Sandwich oder
etwas Zufälligem zu tun oder einem Sandwich oder
etwas Zufälligem Alles hier hat
mit der Erstellung eines neuen Benutzers zu tun. Wir haben den Namen des Benutzers, das Alter des Benutzers,
alles, was mit einem Benutzer zu tun hat. Stellen Sie sich vor, das wäre
eine Blaupause dafür, oder wie ich schon sagte, eine Spezifikation Der Prozess hier, was
wir machen, ist ein Objekt zu erstellen, genau wie
wenn wir zum Beispiel
eine einfache Zeichenkettenvariable
namens name Wenn wir es mit benutzerdefinierten
Klassen und ähnlichen Dingen zu tun haben, werden
diese Objekte genannt. Jetzt können Sie sehen, woher
der Begriff
objektorientierte Programmierung
stammt Weil wir Dinge aus
der realen Welt wie Benutzer,
Autos, Fahrräder als Objekte
wie Klassen, USR darstellen Autos, Fahrräder als Objekte
wie Klassen, USR Hier ist das Objekt, das ist der Datentyp
, der eine Klasse ist Dieser Vorgang wird hier
als Instanziierung bezeichnet. Und es heißt
Instanziierung, weil Sie eine neue
Instanz einer Klasse
erstellen Was wir auch tun können, ist
eine zweite Instanz derselben Klasse
zu erstellen eine zweite Instanz derselben Klasse
zu Dies ist die erste Instanz. Dies ist die zweite Instanz. Wir können 50 erstellen. Wir könnten zum Beispiel 100 erstellen. Was wir hier tun können,
ist ein anderer Benutzer und vielleicht heißt er Darren
Smith und er ist 75 Jahre alt Ebenso können wir seine
Informationen im Fenster ausgeben. Wie Sie dort sehen können, beginnen
Sie, die wahre Macht
der objektorientierten Programmierung zu erkennen . Wir könnten
Tausende dieser Benutzerobjekte erstellen und Tausende von Benutzern
in unserer Software
replizieren ,
wenn wir möchten Wir sind nicht darauf beschränkt, nur Benutzerobjekte zu
haben. Wir könnten Kontoobjekte haben, viele verschiedene Dinge, um unsere Software
zusammenzubringen. Was wir mit
diesen Objekten hier machen können, wir können sie an Methoden übergeben, wir können sie in Arrays unterteilen, wir können
sie in Schleifen durchgehen Die Grenzen sind endlos. Aber das ist nur eine kleine
Auswahl objektorientierter
Programmierung Und es beginnt mit der Erstellung von
Klassen und neuen Objekten. Ich hoffe, das hat
Ihnen beim Einstieg in
Ihre objektorientierte
Reise im C-Shop geholfen Ihre objektorientierte
Reise im C-Shop
39. 9-2. Konstrukteure: Ich werde jetzt in C Sharp über
Konstruktoren sprechen. Was ist ein Konstruktor?
Wie funktionieren sie? Nun, schauen wir es
uns hier an, wir haben ein
sehr einfaches Beispiel. Wir haben eine benutzerdefinierte
Klasse namens user. Wir haben drei Variablen
innerhalb der Klasse, nämlich Informationen über den Benutzer und das
Alter des Benutzers. Dann richten wir einfach ein neues Objekt ein, das eine Instanz
der Klasse ist. Wir geben ihm einige
Werte, Vorname, Nachname und Alter, und
geben sie auf dem Bildschirm Sehr einfache Software. Ich werde in dieses Beispiel einen
Konstruktor einführen. Nun, was ein Konstruktor macht,
er hilft uns, unsere Objekte zu konstruieren Hier erstellen wir eine neue
Instanz unserer Klasse. Hier ist unser Objekt. Was ein Konstruktor tut, er hilft uns bei der
Einrichtung dieses Objekts Lassen Sie uns anhand eines Beispiels lernen. Ich denke, das
wäre hier einfacher. Hier richten wir
ein neues Benutzerobjekt ein. Ich werde dieses einfach kopieren
und einfügen. Und wir werden ein
neues Objekt erstellen, ein anderes Objekt. Okay, hier erstelle ich
einen neuen Benutzer namens Tony,
Tony Smith und er ist 41 Jahre alt. Wenn ich diesen Benutzer eingerichtet habe, können
Sie sehen, dass er
vier Codezeilen verwendet. Wenn wir 100 davon
einrichten wollen, wird
es vielleicht nicht sehr elegant
aussehen, es wird
ziemlich aufgebläht aussehen Dies ist einer der Vorteile der Verwendung
von Konstruktoren. Was ich tun kann, wenn ich eine
neue Instanz dieser Klasse erstelle, ich kann diese
Werte tatsächlich als Parameter übergeben Wenn ich eine neue Instanz erstelle, kann ich
sagen wir Tony, ich kann Smith übergeben und dann das Zeitalter genau hier
übergeben. Dann kann ich all
diese Codezeilen löschen. Und dann
wird diese Zeile im Wesentlichen genau dasselbe tun, diese vier Zeilen hier. Das ist ein Vorteil von Konstruktoren, die
Minimierung des Codes Es wird
nur in einer Zeile dargestellt. Aber wie richten wir das ein? Weil
wir gerade eine rote Linie haben. Und wenn ich mit der Maus darüber fahre, heißt
es, dass der Benutzer keinen Konstruktor
enthält, der drei
Argumente akzeptiert Nun, lass uns eins hinzufügen. Ich gehe hier in die
Benutzerklasse ein, ich muss einen Konstruktor einrichten Wie mache ich das? Es beginnt
mit dem internen Schlüsselwort. Machen Sie sich jetzt keine Gedanken darüber, was
intern gerade ist. Ich werde das in
einem späteren Tutorial besprechen. Alle Konstruktoren nehmen
den Namen der Klasse an. Der Name der Klasse ist user. Ich werde den
Namen der Klasse dort eintragen. Danach setze ich Klammern und dann die
bekannten geschweiften Klammern Dies ist ein einfacher Konstruktor
in seiner Minimalform. Wir können mehr
als einen Konstruktor
pro Klasse haben , wenn wir wollen Ich möchte diese Werte
hier
aufnehmen und sie hier
in unseren Variablen initialisieren Ich möchte diese
Werte hier platzieren. Was ich tun muss, als
wir mit Methoden gearbeitet haben, es sehr ähnlich funktioniert. Ich möchte sie im Wesentlichen
als
Parameter übergeben , die ich zuerst machen
werde. Zum Beispiel
Vorname, Nachname, Alter. Wenn Sie Ihren
Parametern Namen
geben, geben Sie ihnen aussagekräftige Namen wie Vorname,
Nachname und Alter. Und stellen Sie sicher, dass sie
nicht genau mit diesen lokalen
Variablen hier identisch sind. Geben Sie ihnen
zum Beispiel eine etwas
andere Groß-/Kleinschreibung oder einen völlig
anderen Namen. Ich werde das
in einem späteren Tutorial besprechen , wenn ich über dieses Schlüsselwort spreche. Im Moment
kommen unsere Parameter hier in unseren
Konstruktor. Jetzt möchte ich
diese lokalen Variablen mit
diesen Werten hier initialisieren diese lokalen Variablen mit
diesen Werten hier Es ist sehr einfach, das zu tun. Ich nehme hier die lokale Variable, ich setze sie als Wert
des Parameters. Das ist schon erledigt und wir machen mit
den anderen beiden weiter. Visual Studio hat uns
dabei sehr geholfen. Lassen Sie uns einfach überprüfen,
was jetzt hier vor sich geht. Die rote Linie ist weg. Wenn ich mit der Maus drüber fahre, funktioniert
es.
Es gibt keine rote Linie Ich übergebe eine Zeichenfolge, eine Zeichenfolge und eine Ganzzahl in den Konstruktor für die Klasse Bei der Erstellung unseres Objekts werden
diese Werte als
Parameter an den Konstruktor übergeben ,
was all das ist Dann wird der Wert der zugewiesenen
Parameter hier in
unseren lokalen Variablen initialisiert Nun, diese lokalen Variablen
hier werden
diese Werte für immer behalten ,
solange diese Instanz in unserem System aktiv bleibt Das ist ziemlich cool, nicht wahr? Lassen Sie mich die Software schnell
ausführen , damit Sie
sehen können, was vor sich geht. Ich werde das kommentieren und komme gleich
darauf zurück. Lass uns das einfach
da hinstellen, keine Probleme. Wir lassen die Software laufen. Im Moment können Sie sehen,
dass Tony Smith, 41 Jahre alt, drauf steht. Es sieht so aus, als ob es richtig
funktioniert. Lassen Sie mich diese Kommentare einfach rückgängig machen und über eine weitere Sache sprechen. Sie können etwas
Interessantes sehen. Nun, da ist eine rote Linie
unter diesem Teil genau hier. Wenn wir versuchen, ein neues Objekt
einzurichten, funktioniert
es nicht mehr. Warum ist das so? Das liegt daran, dass
wir in unserer
Klasse hier standardmäßig keinen Konstruktor haben.
Es sieht so aus Sobald wir jedoch
einen Konstruktor mit
Parametern wie diesem definiert haben, können wir keine
Instanz unserer
Klasse mehr wie diese einrichten Instanz unserer
Klasse mehr wie diese Es gibt einen einfachen Weg
, das zu umgehen. Wir definieren nur einen sehr
einfachen Konstruktor ohne Parameter Jetzt können Sie sehen diese rote Linie weg ist
und alles
glücklich ist . Wie funktioniert das? Nun, wenn wir
diesen Konstruktor hier aufrufen, wenn wir dieses Objekt erstellen, übergeben
wir
drei Parameter Wenn diese Zeile von der Software
ausgeführt wird, springt
die Codeausführung Und alles ist hier eingerichtet. Wenn wir eine neue Instanz
mit dieser Zeile hier erstellen, gibt es keine Parameter, dieser
Konstruktor wird aufgerufen Stattdessen wird das nie ausgeführt, nur dieser Abschnitt
hier, hier passiert nichts. Nun, das ist der Unterschied
zwischen den beiden. In dieser Klasse gibt es
jetzt tatsächlich zwei Konstruktoren. Das benutzt den
ersten Konstruktor, das benutzt den zweiten Und wir können 50
Konstruktoren haben, wenn wir wollen, aber so laufen die
Dinge intern in unserer Klasse
ab Sie können also sehen, dass Konstruktoren es uns ermöglicht
haben, Code
zum Beispiel in nur einer
Zeile zu minimieren haben, Code
zum Beispiel in nur einer
Zeile Aber was können
sie sonst noch tun? Weißt du, was ist ein weiterer Vorteil? Nun, Konstrukteure, wie wir
sagen, können Ihnen helfen,
Ihr Objekt zu konstruieren , und
das tun sie quasi hinter den Kulissen Aus dieser Datei hier müssen
wir also nicht wirklich wissen,
wie dieser Benutzer eingerichtet ist Wir geben ihr nur ein paar Informationen und wir können sie irgendwie
zurückholen, wenn wir sie wollen. Also all diese Art von Logik ist vor uns verborgen,
was ziemlich cool ist. Konstruktoren können intern
einige Dinge tun , über die wir uns hinter den Kulissen
keine Gedanken machen müssen hinter den Kulissen
keine Gedanken machen Wenn ich
diesen Konstruktor zum Beispiel aufrufe, indem ich die beiden Namen im Zeitalter
übergebe, könnte
ich zum Beispiel etwas in
das Fenster ausgeben Ich könnte dem Benutzer sagen, dass
wir einen neuen Benutzer einrichten Zum Beispiel, wenn ich die Software
starte. Jetzt können Sie sehen, dass ich eine
kleine Nachricht erhalte, die besagt ,
okay, bitte warte, ich
richte gerade einen neuen Benutzer ein. Und dann gibt es
die Informationen aus. Konstruktoren machen
ein paar zusätzliche Dinge, sie müssen nicht
nur Variablen einrichten Sie könnten sich in eine Datenbank einloggen, sie könnten mit einer Website kommunizieren Sie könnten eine
Datenbankverbindung öffnen. Sie können hinter den Kulissen viele interne
Dinge erledigen. Auf diese Weise können sie helfen, ein Objekt zu
konstruieren, und deshalb werden sie Konstruktoren
genannt Konstruktoren sind ziemlich
mächtige Elemente der objektorientierten
Programmierung Und Sie können anhand dieses
Beispiels in diesem Tutorial sehen, wie es die Dinge vereinfacht Vielleicht nicht in der Klasse selbst , aber ich arbeite definitiv
von hier aus. Sie können sehen, wie einfach
alles aussieht, indem Sie
nur eine
Codezeile verwenden, um ein Objekt einzurichten. Und wir müssen uns keine Gedanken über die internen Dinge machen, die hier vor sich
gehen. Das ist ein Beispiel für
Konstruktoren im C-Shop, und ich hoffe, Sie finden
es sehr nützlich
40. 9-3. Objektmethoden: Lassen Sie uns über Objektmethoden sprechen. Nun, hier habe ich eine
Beispielanwendung. Was ich mache, ich
erstelle hier eine neue Liste. Dann erstelle ich drei Benutzer. Sie alle haben hier einzigartige
Informationen. Zum Beispiel ist Tony
Smith 70 Jahre alt, Bob Holmes und Tyrone Jones Dann füge
ich jedes dieser Objekte hier zu unserer Liste hinzu Jetzt wird unsere Benutzerliste alle drei
Objekte
enthalten. Ich verwende
jeweils eine Vierer-Schleife, um alle
Benutzer zu
durchlaufen und diese Informationen
wiederum im Konsolenfenster
auszugeben. Schauen wir uns das einfach an. Jetzt können Sie sehen, dass dies das Ergebnis
ist, das wir erhalten. Es werden nur all
diese Objektinformationen
auf dem Bildschirm ausgegeben Was ich jetzt tun möchte,
ich möchte herausfinden welche dieser
Benutzer in den Ruhestand gegangen sind Haben sie das
Rentenalter erreicht oder sind sie Rentner? Je nachdem, in welchem Land Sie gerade
leben. In Großbritannien bin
ich mir bei Amerika nicht sicher, aber das Rentenalter liegt, glaube
ich, bei 66 Jahren für Männer Wir verwenden einfach 66 als willkürliche Zahl.
Es könnte alles sein. Tony Smith wäre in diesem Fall im
Ruhestand, aber Bob Holmes und Tyrone Jones haben noch einen weiten Weg vor sich,
bevor sie in Rente gehen Was ich tun möchte, ich möchte eine zusätzliche
Information ausgeben,
um zu sagen, ob der Benutzer im
Ruhestand ist Wie wir das normalerweise machen würden ist vielleicht eine if-Anweisung einzurichten. Und wir sagen,
wenn das Alter des Benutzers größer oder gleich ist, sagen
wir einfach, 66 ist
das Rentenalter, dann würden wir sagen, okay,
er ist im Ruhestand. Wir würden sagen, im Ruhestand. Wir werden es auf False initialisieren. Wenn sie größer sind, sage
ich einfach, dass Ruhestand wahr ist, aber zum Beispiel so
etwas So würden wir
normalerweise
einen Fall einrichten , in dem
wir, wenn sie im Ruhestand sind, eine Bedingung verwenden würden. Und dann geben wir diese
Informationen auf dem Bildschirm aus. Es würde
ungefähr so aussehen. Sie können sehen, dass wir hier unsere nette
Schleife mit unserem Alter, Nachnamen und Alter haben. Aber wenn es um Rentner geht, haben
wir all diese Informationen. Es sieht ein bisschen aufgebläht aus. Vielleicht können wir
das woanders hinbringen. Vielleicht in unserer Klasse hier. Und dann nimm einfach
noch einen Einzeiler hier. Das können wir
mit Objektmethoden erreichen. In diesem Fall
wollen wir diese Logik hier platzieren, diese Bedingung in unserer Klasse. Darüber müssen wir uns keine Sorgen machen. Wir wissen nicht, wie es
berechnet wird, es ist uns egal. Wir wollen hier nur eine kleine
Variable, das ist eingestellt und wir können diese Information
anzeigen. Schauen wir uns an,
wie wir
eine Objektmethode erstellen können , indem wir
diese Logik innerhalb unserer Klasse verschieben . Kurz bevor ich das mache, werde
ich die Anwendung ganz
schnell ausführen. Nur damit wir
das Ergebnis hier sehen können. Sie können unter
jedem Benutzer sehen , dass „
im Ruhestand“ steht, weil älter als 66 Jahre ist, und die anderen sind falsch, nur weil
sie nicht 66 Jahre oder älter sind. Dadurch wird
diese Logik in eine sogenannte Objektmethode überführt. Und das definieren wir in unserer Klasse genau hier.
Hier ist unsere Klasse. Hier haben wir unsere Variablen, hier haben wir zwei Konstruktoren Wir wollen hier einfach eine Methode
erstellen, wir werden wieder das
interne Schlüsselwort verwenden. Machen Sie sich jetzt
keine Gedanken darüber, was
das bedeutet Wir werden
es einfach hier reinstellen. Wenn wir eine Methode definieren, benötigen
wir einen Rückgabetyp. Es wird ein
Bullenpfandrecht sein, weil wir zum Beispiel sagen
wollen, ob sie im Ruhestand
sind oder ob sie im Ruhestand
sind oder ob sie im Ruhestand sind,
falsch sind. Jetzt ist der Name der
Methode, die ich
sie nennen werde, nicht mehr gültig. Es benötigt keine
Parameter, weil wir über die Klasse selbst hier oben
Zugriff auf
das Alter haben . Verwenden Sie at age, wir
werden
hier einfach unsere Methode erstellen und dann
wollen wir so
etwas zurückgeben. Nun, Visual Studio hat bereits angedeutet, was
wir vielleicht tun möchten, aber lassen Sie uns das hier betrachten. Was wir hier sagen wollen,
ist, wenn das Alter des Benutzers
mehr oder gleich 66 ist ,
Ruhestand ist wahr,
wir könnten das auch sagen,
was genau dasselbe ist,
weil diese Bedingung als wir könnten das auch sagen, was genau dasselbe ist, wahr oder falsch
bewertet wird Und dann wird das Ergebnis in
einem Bolen gespeichert . Wirklich sehr einfach Ich möchte die Bedingung hier
annehmen, zu unserer Klasse
gehen und wir wollen das hier
aus dieser Methode zurückgeben. Einfach so, weil
wir hier in unserer Klasse sind. Wir haben hier Zugriff auf das Benutzeralter. Wir nehmen einfach das und
legen das da hin. Wir haben eine Methode erstellt, sie hat keine Parameter, aber sie hat den
Rückgabetyp Booling Wir geben „Wahr“ oder „Falsch“ zurück, wenn das Alter des Benutzers hier mindestens 66 Jahre beträgt Wenn wir wieder hierher kommen, können wir das komplett
entfernen. Was wir jetzt tun können, ist unser Objekt hierher zu
bringen, das Benutzer ist, weil wir
das in einer Vorschleife durchgehen. Und dann können wir auf eine
brandneue Methode zugreifen, die wir
gerade hier erstellt haben und die
heißt is retired. Und Sie können sehen, dass das einen Bolen
zurückgibt. Also doppelklicke ich auf die
öffnenden und schließenden Klammern weil sie keine Parameter benötigt Und jetzt können Sie sehen, dass der Code viel optimierter
aussieht So einen Zustand haben wir
hier nicht. Wir haben nur vier nette
Codefragmente. Eins, das den Namen, eins das Alter und eins,
ob sie im Ruhestand sind. Mir ist gerade aufgefallen, dass ich „Ruhestand“ falsch
buchstabiert habe.
Niemand ist perfekt Aber Sie können sehen, dass es jetzt
viel einfacher aussieht. Aber einer der Vorteile und
Vorteile von 00
ist sowieso, dass deine Logik hier
irgendwie versteckt ist. Sagen wir zum Beispiel, wenn ein
Mitglied Ihres Teams, wenn Sie in einem großen Team arbeiten, an diesem Kurs
arbeitet und
Sie hier an diesem Kurs arbeiten. Sie müssen sich keine Gedanken darüber machen wie der Ruhestand berechnet wird. Du weißt es nicht, vielleicht ist es
dir sogar egal. Du weißt nicht einmal, wie hoch
das Rentenalter ist. Das ist okay, denn
das Einzige, was wir aufrufen
müssen , ist diese
Methode hier. Dann kann sich unser Freund in unserem
Softwareteam vielleicht mit den Feinheiten
auseinandersetzen, wenn mit den Feinheiten
auseinandersetzen herauszufinden
, wie hoch
das Rentenalter Das Prinzip ist also, dass
es die
Informationen vor Ihnen versteckt, sie abstrahiert Und das ist einer der wichtigsten Punkte
der objektorientierten
Programmierabstraktion Sie müssen nicht
wissen, wie das funktioniert. Wenn Sie beispielsweise eine Kaffeemaschine
besitzen, müssen
Sie nicht
wissen, wie sie funktioniert. Sie wissen,
wie es innerhalb der gesamten Elektronik funktioniert . Sie
müssen
es nur mit Wasser auffüllen und die Taste
drücken. Das
versuche ich hier also irgendwie zu erklären. Wir müssen nicht
wissen, wie das funktioniert, wir müssen nur
die Methode aufrufen und sie erhält einen wahren oder falschen Wert. Das ist also einer der
Vorteile der objektorientierten
Programmierung und
so funktionieren Objektmethoden in Sea Shop.
41. 9-4. Zugriffsmodifikatoren (öffentlich, privat usw.): Jetzt werde ich im Shop über
Zugriffsmodifikatoren sprechen. Klingt ein bisschen kompliziert, aber ich werde es aufschlüsseln Es ist also sehr einfach und
Sie werden
alles verstehen, was mit
Zugriffsmodifikatoren im Shop zu tun Was ist also ein Zugriffsmodifikator? Bevor wir nun über
die Art von Aufgabe gesprochen haben, die eine
Klasse haben würde, modelliert sie quasi ein
Objekt aus der realen Welt. In diesem Beispiel. Hier habe ich einen Videospielkurs. Wenn ich zum Beispiel ein neues
Videospiel erstelle, braucht
es den Namen des Videospiels, seinen Herausgeber und eine
Bewertung für das Spiel. Sie können also sehen, dass eine Klasse hier ein Videospielobjekt
darstellt. Es ist wie ein Objekt aus der realen Welt. Und wenn wir Klassen erstellen, wollen
wir, dass alles
in der Klasse ist. In diesem
Videospielkurs
zum Beispiel es nur um
das Videospiel. Wir wollen hier also
über nichts anderes
als das Videospiel sprechen . Vielleicht zum Beispiel, was
wir essen , während wir das Videospiel
spielen. Oder vielleicht ein paar Informationen über den Benutzer, der das Spiel spielt. Weil diese
Benutzerinformationen vielleicht einer Benutzerklasse gehören
könnten. Oder vielleicht
wäre das Essen,
das der Benutzer
beim Spielen des Videospiels isst , in einem Essenskurs. Das ist
bei der 00-Programmierung sehr wichtig, man hält die Klassen so, wie man sie
nennt, sehr kohäsiv Und das bedeutet einfach, dass
alles in der Videospielklasse direkt mit einem Videospiel
zu tun Das ist das allgemeine Prinzip. Wie dem auch sei, das kommt nicht nur der Organisation des Codes
zugute, sondern ermöglicht es auch verschiedenen Personen
, an diesem Projekt zu arbeiten. Zum Beispiel vielleicht 100 Leute. Sie können also
ein oder zwei Personen delegieren ,
um beispielsweise an diesem Kurs zu arbeiten Eine andere Person
könnte sich hier zwar auf
diesen Hauptkurs konzentrieren , aber er hat mehrere Vorteile Aber wie hängt das mit
Zugriffsmodifikatoren und ähnlichen
Dingen Nun, betrachte
dieses Beispiel hier. Was ich mache, ich konstruiere hier
vier Videospielobjekte. Ich gebe einige Beispieldaten ein.
Was passiert hier
hinter den Kulissen, Was passiert hier
hinter den Kulissen wenn ich
diese vier Objekte konstruiere Ich richte hier nur
einige Variablen ein. Der Name, der Herausgeber
und die Bewertung. Sie können sehen, dass die Parameter in den Konstruktor aufgenommen
werden, und ich setze nur die Werte Im Geheimen
in dieser Klasse
generiere ich jedoch generiere ich eine neue eindeutige ID für jedes
Objekt, das wir Was hier passiert, ist,
dass ich hier eine Methode habe. Es geht nur darum, diese Variable hier
auf eine eindeutige ID einzustellen. Sie müssen
sich keine Gedanken darüber machen, was das bewirkt, aber was es tut, es generiert eine eindeutige ID, die einzigartig ist und es
sollte niemals ein Duplikat geben. Dies ist eine eingebaute Funktion Sie dafür verwenden können Und es geht nur darum, diese
Variable hier auf eine eindeutige ID zu setzen. Wenn wir hier also ein Spiel
mit diesem Konstruktor erstellen, es immer eine eindeutige ID Aus diesem Teil
des Programms hier geht hervor, dass
wir keine Ahnung haben, dass
das passiert Wir geben
nur drei Werte weiter. Wir wussten nicht einmal, dass
es eine eindeutige ID hat. Wir haben keine Ahnung,
was hinter den Kulissen vor sich geht. Und das ist das Schöne an
objektorientierter Programmierung. Wir müssen es nicht wissen und es muss
uns auch nicht darum kümmern. Zum Beispiel habe ich hier gerade
dieses Objekt
namens Game One erstellt . Wenn ich hier reingehe, kann
ich den Herausgeber erneut bearbeiten. Ich kann es auf
einen anderen Wert ändern. Jetzt habe ich es gebaut. Nehmen wir zum Beispiel an, World of Warcraft Blizzard wurde von Riot Games
übernommen Dann möchte ich zum Beispiel
den Herausgeber später in der Software auf Riot Games umstellen Das kann ich problemlos machen. Was ist jedoch, wenn jemand
diesen ID-Wert hier
versehentlich ändern kann ? Ich
gehe hier raus,
Spiel eins, und du kannst dieses ID-Feld hier
sehen. Ich könnte das ändern
, was ich will. Die Sache ist, ich möchte nicht, dass
jemand dieses ID-Feld ändert. Es ist bereits einzigartig. Ich möchte nicht, dass ein anderes
Teammitglied diesen Wert ändert. Dadurch könnten die Daten beschädigt werden
, da die ID eindeutig ist. Und jeder könnte
diesen ID-Wert einfach in beispielsweise Ham
Sandwich ändern . Wissen Sie, das könnte
viele negative Auswirkungen haben. Erstens könnte es
die Software kaputt machen. Zweitens könnte es,
Sie wissen schon, zu Informationsverlust führen. Wissen Sie, es könnte viele
negative Auswirkungen auf die Software haben. Also, was ich
tun möchte, ich möchte
diese ID für die Klasse geheim halten . Ich möchte nur, dass die Klasse
selbst über
diese ID Bescheid weiß und die ID
intern für diese Klasse verwaltet. Ich möchte nicht, dass jemand anderes
in der Software irgendwelche anderen Klassen oder Teile der
Software verändert, diese ID berührt. Vielleicht können sie es sich einfach
ansehen, aber ich möchte nicht, dass sie es zum Beispiel
bearbeiten. Hier kommen
Zugriffsmodifikatoren ins Spiel. Zugriffsmodifikatoren erzwingen
jetzt eine sogenannte Kapselung. Sie stellen sicher, dass sensible
Daten, wie in diesem Fall die ID, vor
Benutzern oder Personen
oder sogar vor anderen
Softwareteilen verborgen sind, oder sogar vor anderen
Softwareteilen die
niemals Zugriff darauf haben sollten Das ist ein Beispiel für Kapselung
und warum Kapselung bei der Generierung objektorientierter Programme wichtig ist Schauen wir uns an, wie wir den Zugriff auf
bestimmte Variablen oder sogar
Methoden mithilfe von Zugriffsmodifikatoren einschränken
können bestimmte Variablen oder sogar
Methoden Lass uns in unsere Klasse gehen. Lassen Sie uns über verschiedene
Zugriffsmodifikatoren sprechen wir in C Sharp haben können Nun, der erste ist das,
was als öffentlich bezeichnet wird. Sie können es hier öffentlich sehen. Das bedeutet einfach alles, was als öffentlich
definiert ist, Sie könnten zum Beispiel eine
Variable haben, oder Sie können sogar eine Methode haben. Zum Beispiel diese hier unten, wenn ich sie öffentlich mache. Und das heißt, wenn wir
ein Objekt dieser Klasse erstellen, können
wir von
außerhalb der Klasse darauf zugreifen. Wir können von
überall in unserem Projekt darauf zugreifen. Überall in unserer Lösung. Ich habe Spiel eins eingegeben, dann ein kleines T dort, und jetzt können wir auf ID zugreifen Wir können hier auf die Methode „
Neue ID generieren“ zugreifen. liegt daran, dass diese öffentlich
sind und wir
von überall auf sie zugreifen können. Jetzt ist der andere Teil,
der als intern bezeichnet wird. Wir können hier Variablen haben, wir können interne
Konstruktoren haben, wir können interne Methoden haben Der Unterschied zwischen öffentlich
und intern besteht
darin, dass intern nur innerhalb
der aktuellen Assembly oder des aktuellen Projekts darauf zugegriffen der aktuellen Assembly oder des aktuellen Projekts Was bedeutet das?
Nun, komm her. Bisher haben wir an
einem Projekt gearbeitet. Was wir jetzt tun können, wir können
ein anderes Projekt in unserer Lösung haben . Wir könnten zum Beispiel 50
Projekte haben. Was das in unserem Projekt bedeutet. Hier, unserem Standardprojekt, nur die Klassen innerhalb können
nur die Klassen innerhalb
des Projekts auf
interne Dinge zugreifen. Wenn wir in einem anderen Projekt sind, repräsentiert dieses Projekt
vielleicht die Datenbank, wie die Datenschicht oder
vielleicht das Frontend wo sich all die vielleicht
grafischen Dinge befinden. Dann können sie nicht auf
interne Dinge zugreifen , weil es nur intern
im aktuellen Projekt ist. Wir werden später mehr über
mehrere Projekte sprechen, aber das ist im Grunde
das interne Schlüsselwort. Ein weiterer Zugriffsmodifikator
wird als geschützt bezeichnet. Wir werden später
über geschützt sprechen, also machen Sie sich
darüber vorerst keine Gedanken Das Letzte, über das ich
sprechen möchte, ist privat. Nun, privat ist sehr wichtig für das
Beispiel, das ich gerade gegeben
habe es um
den Zugriff auf die ID
von außerhalb dieser Klasse geht. Welche Privatsphäre wird dadurch erzwungen? Lokale Variablen wie diese
oder sogar Methoden wie diese sind nur
innerhalb der aktuellen Klasse
zugänglich Was ich getan habe, ich habe diese ID in
privat
geändert und ich habe
diese Methode auf auch privat geändert. Wenn ich
hier zu meinem Hauptprogramm zurückkehre und einen Punkt
hinter dieses Objekt setze, können
Sie sehen, dass
die ID-Eigenschaft, die ID-Variable, in dieser Liste
fehlt. Sie werden auch feststellen, dass
die Methode zum Generieren einer neuen ID ebenfalls in dieser Liste
fehlt. Sie können sehen,
was hier passiert. Es erzwingt die Kapselung. Es versteckt sensible
Informationen , weil wir nur wollen, dass die
Videospielklasse neue IDs generieren kann und Sie die ID für das Videospiel kontrollieren Niemand sonst in dieser ganzen Software muss etwas über IDs wissen. Es ist einzigartig für Videospiele und
sollte auch für Videospiele einzigartig bleiben. Daher sollten diese Felder privat
sein, da nur das Videospiel
davon wissen muss , es handelt sich um
private Informationen. Stellen Sie sich
das zum Beispiel so vor. Der Name des
Herausgebers ist jedoch öffentlich. Lassen Sie uns das Rating intern machen. Solange ich an demselben
Projekt arbeite, sollte
ich auf
Namen, Herausgeber und Bewertung zugreifen können. Was ich hier tun kann, Bewertung
benennen und Herausgeber angeben. Im Moment ist die ID privat. Wenn ich
zum Beispiel versuche, das trotzdem zu verwenden, geben Sie dort einige
Informationen in die ID ein. Sie können sehen, dass ich hier
einen Fehler habe. Und wenn ich mit der Maus darüber fahre, wird
angezeigt, dass auf die Videospiel-ID aufgrund
der
Schutzstufe nicht zugegriffen Das liegt daran, dass es privat ist. Wir können nicht wirklich auf
diese Informationen zugreifen , wenn wir versuchen die Software auszuführen
und zu kompilieren,
sie werden nicht einmal in Buchstaben umgewandelt. Sie können also sehen,
wie streng es durchgesetzt wird. Sobald ich diese
ID auf öffentlich oder intern ändere, wird
die rote Linie verschwinden. Der Schutz ist verschwunden. Wir können das
Programm wie gewohnt ausführen. Das ist also die Macht der
Zugriffsmodifikatoren in C Sharp. Es erzwingt die sogenannte
Kapselung und schützt unsere sensiblen Daten entweder vor
anderen Softwareteilen, anderen Segmenten der
vorhandenen Software
und sogar vor Benutzern, die an
verschiedenen Teilen
der Software arbeiten verschiedenen Teilen
der Es gewährleistet die Datenintegrität und verhindert viele nachteilige Probleme , die dadurch auftreten können Dies sind Zugriffsmodifikatoren
in C Sharp und warum sie bei der
Erstellung von Klassen und Objekten sehr nützlich Abschließend möchte ich darüber sprechen, was Zugriffsmodifikatoren haben kann Hier haben wir eine Methode mit einem Zugriffsmodifikator. Wir haben hier ein paar
Konstruktoren, die
Zugriffsmodifikatoren und auch
einige lokale Variablen haben Zugriffsmodifikatoren und auch
einige lokale Variablen Sie haben hier auch
Zugriffsmodifikatoren. Sie werden jedoch feststellen, dass die
Klasse, die all
diese Elemente enthält, auch einen Zugriffsmodifikator
hat Jetzt ist öffentlich der
schwächste Zugriffsmodifikator. Wenn etwas veröffentlicht
wird, kann jeder überall in der gesamten Lösung auf dieses Objekt zugreifen Die Klasse selbst
ist jedoch als intern gekennzeichnet. Und das bedeutet, dass nur
Klassen innerhalb des vorhandenen Projekts oder der
Assembly auf diese Klasse zugreifen können. Standardmäßig
überschreibt dieser
stärkere Zugriffsmodifikator alle schwächeren internen Werte Wir werden hier all diese Modifikatoren für den
öffentlichen Zugriff überschreiben. Und das liegt daran, dass
die umgebende Klasse als intern markiert
ist Standardmäßig erfolgt der Zugriff für
diese alle intern. Wenn sie öffentlich sind, wird es ungefähr so
aussehen. Selbst wenn sie als öffentlich
markiert sind, wird auf
diese Weise auf sie zugegriffen. Wenn ich
die Klasse jedoch als öffentlich markiere, ist das kein Problem,
da dies
der schwächste Zugriffsmodifikator ist der schwächste Zugriffsmodifikator Diese werden alle
öffentlich sein, falls du jemals mit Datei- und
Ordnerberechtigungen für
Betriebssysteme
gearbeitet hast
und verschiedene Einstellungen die Unterordner überschreiben
können Das funktioniert ganz ähnlich Zur Verdeutlichung: Wenn ich diese Klasse als privat
markieren könnte,
dann ist standardmäßig alles, was sich
darin befindet privat, unabhängig
vom Zugriffsmodifikator Das ist der Punkt, den ich
versuche zu vermitteln. Jetzt ist das Schreiben von Zugriffsmodifikatoren
in C Sharp optional. Wenn ich den
Zugriffsmodifikator aus der Klasse entferne, sind standardmäßig alle Klassen intern Ich könnte das schreiben
und das
wäre genau das Gleiche
wie das Es ist optional, wird aber standardmäßig
als intern vorausgesetzt. Alles
innerhalb der Klasse,
Methoden, Konstruktoren,
Eigenschaften oder Variablen ist jedoch standardmäßig alle privat, sofern sie nicht explizit
als öffentlich oder intern gekennzeichnet
sind .
Dann wird davon ausgegangen, dass
sie privat sind Das zu schreiben wäre genau dasselbe wie
das zu schreiben. In diesem Fall ist
privat optional. Wir könnten den Modifikator für den
privaten Zugriff
aus der Methode und
der Variablen hier oben entfernen aus der Methode und
der Variablen hier oben Und es wird
genau den gleichen Effekt haben denn standardmäßig wird
alles innerhalb der
Klasse als
privat angesehen, alles innerhalb der
Klasse wenn es
keinen Zugriffsmodifikator gibt
42. 9-5. Eigenschaften: Ich werde
über Immobilien im Geschäft sprechen. Jetzt werden wir uns auch mit den Schlüsselwörtern get
und set
befassen, auch bekannt als
Getter und Setter Also, was bedeutet das alles? Nun, lassen Sie uns einen Blick darauf werfen. Wenn Sie sich
bisher an
die anderen Tutorials zur
objektorientierten Programmierung gehalten haben, dann wird das
absolut Sinn machen und darauf aufbauen. Falls nicht, dann empfehle ich Ihnen
dringend, sich
diese anzusehen , damit Sie
gleich verstehen was ich Ihnen zeigen werde. Was ist eine Ladenimmobilie? Warum sollten wir sie verwenden? Shop-Eigenschaften erzwingen also eines
der Kernprinzipien der 00-Programmierung,
nämlich die Kapselung Und damit wird nur sichergestellt, dass vertrauliche Informationen von nirgendwo anders
zugänglich sind Beispiel, als wir hier über
diese private Variable gesprochen haben, sie ist nur
innerhalb der Klasse zugänglich, und dann hat
zum Beispiel
niemand, der auf sie zugreift ,
die Kontrolle darüber. Das wird das also noch einen Schritt weiter vorantreiben
. Deshalb werde ich
hier ein Szenario
vorstellen und Ihnen
einen der Vorteile der Verwendung
von Sharp-Eigenschaften, Getter
und Setter zeigen Verwendung
von Sharp-Eigenschaften , Getter
und Setter In diesem Beispiel haben wir hier
eine Videospielklasse definiert. Sie hat
hier verschiedene Variablen, die wir verwenden können und einen Konstruktor mit
drei Parametern Hier richten wir
vier Videospielobjekte ein. Spiel 123.4
Im Konstruktor erstellen
wir einen
Namen für das Videospiel, den Herausgeber des Spiels und eine Bewertung für das Spiel. Sagen
wir, wenn unser
Programm gestartet wird, werden
all diese Daten in das
System geladen Irgendwann später in der Software
möchte der Benutzer Änderungen vornehmen Zum Beispiel der Name
dieses Spiels hier. Sie haben auf die Schaltfläche Bearbeiten geklickt, vielleicht in dem Typen, und wollen den Namen
ändern Aus welchem Grund auch immer, vielleicht hat das Videospiel jetzt
einen anderen Namen Wir werden den Benutzer hier nach
einem neuen Namen für dieses
Spiel fragen , Game One. Und sie werden
etwas in das System eingeben. Nehmen wir zum Beispiel an, wir fragen sie nach einem neuen Namen, können
wir mit
dem Variablennamen hier festlegen. Vielleicht haben sie versehentlich G auf der Tastatur gedrückt und
dann Enter gedrückt. Was wir hier tun,
wir geben nur ihre Eingabe in diese
Variable weiter. Überhaupt kein Problem. Wir machen mit unserem Tag weiter. Aber vielleicht
ist das keine gute Idee. Vielleicht möchten wir
diese Eingabe zuerst validieren. Vielleicht möchten wir sicherstellen, dass der Spielname
mindestens zwei Zeichen hat oder
keine numerischen Zeichen
oder ähnliches enthält . Vielleicht müssen wir das
überprüfen. Hier können C-scharfe
Eigenschaften ins Spiel kommen. In diesem speziellen Szenario gibt es viele Gründe für die
Verwendung von C-Sharp-Eigenschaften, aber das ist nur ein Beispiel, das
wir durchgehen werden. Was ich in diesem Fall
tun könnte
, ist , dass
ich, anstatt die
Namensvariable direkt zu setzen, hier eine Methode namens update name erstellen kann. Und das kann unseren
neuen Namen vom Benutzer übernehmen. Was es kann, ist, dass es
verschiedene Validierungsprüfungen durchführen kann. Es kann sagen, okay, ist der neue Name weniger oder
gleich einem Zeichen? Wenn ja, können wir
den Namen nicht aktualisieren und wir können den Namen auf
andere Weise überprüfen. Und dann können
wir den Namen endlich aktualisieren. Ich
kann hier zum Beispiel sagen,
Spiel eins, um den Namen zu aktualisieren. Anstatt eine Variable zu
setzen, kann
ich jetzt eine Methode verwenden. Um
dies zu erreichen, gebe ich unseren potenziellen neuen Namen ein
, den uns der Benutzer gibt. Dann gibt
diese Methode entweder
true zurück , wenn sie kann, oder
false, wenn sie nicht kann. Und dann aktualisiere die interne Variable in einer Namensvariable hier
intern innerhalb der Klasse. Und das ist in diesem Fall durchaus akzeptabel ,
anstatt eine
Methode zu verwenden, denn was
passieren könnte, ist, dass wir vielleicht
eine Methode benötigen , um dann den Herausgeber zu
aktualisieren, oder wir brauchen dann eine andere
Methode, um die Bewertung zu aktualisieren. Aber jetzt verwenden wir Methoden , um zum Beispiel den Namen zu aktualisieren. Nun, wir können immer noch
auf den Namen selbst zugreifen, also müssen wir den
Zugriff auf den Namen einschränken, da wir nur
das Namensfeld mit unserer
neuen Methode, dem Namen aktualisieren, aktualisieren möchten . Hier kommen also im Wesentlichen die Eigenschaften von
C-Sharp ins Spiel. Und das Prinzip,
lokale Variablen nur für eine
Klasse privat zu machen , Sie können in unserer Klasse hier sehen dass
wir all diese
Variablen haben, genau hier haben wir
drei öffentliche und eine private. Wir sind ein Beispiel durchgegangen und ich werde dir jetzt
sagen, dass es
üblich ist , all
deine Variablen innerhalb von
Klassen privat zu machen . Das bedeutet, dass niemand
außerhalb der Klasse diese Variablen
in irgendeiner Weise
ändern kann . Wenn ich auf das Spiel zugreife, ein Objekt. Jetzt kann ich nicht direkt auf den
Namen zugreifen. Ich kann nicht auf die
Publisher-Variable zugreifen, nichts. Ich kann nur mit
unserer
Aktualisierungsmethode auf den Namen zugreifen oder ihn aktualisieren. Und genau das wollen wir denn wenn der Benutzer hier
eine Eingabe eingibt, wollen
wir, dass sie validiert wird. Wir wollen
sicherstellen, dass der Name
mindestens so viele Buchstaben oder,
du weißt schon, verschiedene andere Dinge hat mindestens so viele Buchstaben oder, . Und dann wollen wir es
endlich aktualisieren. Diese Methode hier ist also eine akzeptable Lösung
, wie das geht. Und es erzwingt, dass alle unsere Variablen hier
privat sind , weil
sie sensibel sind Wir wollen nicht, dass andere
Leute, wissen Sie, auf diese zugreifen und
irgendwelche alten Werte eingeben, und erzwingt die Kapselung
ebenso wie Aber was wäre, wenn ich dir sagen würde, dass es
einen einfacheren Weg gibt , diese Methode anzuwenden
? Wir müssen nicht jedes Mal, wenn
wir
eine Variable aktualisieren, eine solche Methode schreiben . Vielleicht gibt es einen anderen Weg. Hier kommen die
Eigenschaften von C-Sharp ins Spiel. Also werde ich
eine neue C Sharp-Eigenschaft erstellen. Wenn wir jetzt eine Eigenschaft erstellen, geben
wir ihr einen Zugriffsmodifikator Ich nenne es
öffentlich, weil ich möchte, dass jeder auf
unser Namensfeld zugreifen Dann ist der Name eine Zeichenfolge. Wie Sie hier sehen können, ist
Name eine Zeichenfolge, dann muss ich ihr einen Namen geben. Wenn Sie nun
beispielsweise
Eigenschaften und Variablen erstellen , werden diese
auch als Felder bezeichnet. Die Felder selbst werden normalerweise und in der Regel
alle in Kleinbuchstaben geschrieben. Sie können hier sehen, dass all dies
Groß- und Kleinschreibung ist. Die Eigenschaften selbst haben nur einen
Großbuchstaben als Anfangsbuchstaben. Wenn die Variablen
hier zwei Wörter haben, dann würde es
ungefähr so aussehen. Zum Beispiel
Groß-/Kleinschreibung ohne Leerzeichen. Das ist gängige Praxis. Die lokalen Felder hier, die lokalen Variablen in
Kleinbuchstaben und die Eigenschaften werden am Anfang immer groß geschrieben Das ist einfach eine gute Praxis. Sobald wir das gemacht haben,
werde ich Ihnen jetzt eine Eigenschaft mit dem Scharfen
C in
ihrer Grundform zeigen . Jedes Mal, wenn wir den Namen
des privaten Feldes aktualisieren möchten, gehen
wir diese
Eigenschaft hier durch, genau wie damals, als ich
über das Beispiel gesprochen habe. Jedes Mal, wenn wir das Namensfeld
aktualisieren möchten, verwenden
wir diese Methode. Nun, anstatt
diese Methode hier zu verwenden, werden
wir stattdessen diese
C-Sharp-Eigenschaft verwenden. Immer wenn wir hier auf
diese lokale Variable zugreifen wollen, werden
wir stattdessen immer
unsere Eigenschaft verwenden. Betrachten Sie dies hier als Accessor
für unsere lokale Variable. Damit die Variable
tatsächlich ihren Wert erhält, wird sie sie
mit dem Schlüsselwort return zurückgeben Jedes Mal, wenn wir einen Wert setzen wollen, die lokale
Variable diesem speziellen Schlüsselwort, entspricht die lokale
Variable diesem speziellen Schlüsselwort, das
hier als Wert bezeichnet wird. Das ist der Wert, der hier
übergeben wird. Schauen wir uns jetzt ein Beispiel dafür
an. Wenn wir hier auf unsere
Hauptklasse eingehen, anstatt diese
Methode hier in unserem Beispiel zu verwenden, möchte
ich nur den Namen des ersten Spiels
sagen. Das ist unser
Ladeneigentum genau hier. Dann können wir dem tatsächlich
einen Wert wie zum Beispiel geben. Nun, was hier passiert, wir verwenden den Eigenschaftsnamen, aber intern
innerhalb dieser Klasse geht
es tatsächlich hier rein
und legt den Wert fest. Dieser Abschnitt genau hier
in dieser Get-Anweisung. Hier wollen
wir diese Validierung durchführen. Lassen Sie uns das alles hier kopieren und
dann diese
geschweiften Klammern in eine neue Zeile setzen Lassen Sie uns das vorerst löschen. Was wir hier tun ist, dass jedes Mal, wenn wir diese Shot-Eigenschaft setzen, diese Set-Anweisung aufgerufen wird. Sie können hier sehen, wenn wir
ein Gleichheitszeichen mit einem neuen
Wert für diese Shop-Eigenschaft verwenden , intern diesen Set-Block, all das wird
am Ende ausgeführt, wir wollen nur unsere
lokale Variable hier,
name, auf den
Wert setzen , der übergeben wird Dieser magische
Schlüsselwort-Wert, über den ich gerade
gesprochen habe , wird genau
diesem Wert hier entsprechen, was auch immer zugewiesen wird Jedes Mal, wenn diese
Eigenschaft hier gesetzt ist, was wir tun, setzen
wir sie auf, dann führen wir die ganze Überprüfung
hier durch. Wir müssen das
magische Schlüsselwort Value verwenden, das ist der Wert, den wir
tatsächlich überprüfen. Dies würde genau
das Gleiche bewirken wie diese Methode hier. Value ersetzt in dieser Instanz nur den
Namen Lassen Sie uns das einfach
überprüfen und
noch einmal durchgehen. Wir geben dem
Namen der Shop-Immobilie genau hier einen Wert. Jetzt wird der Wert gleich sein, es könnte was auch immer sein. Es ist
nicht wirklich wichtig. Dann kommt der
Ausführungsablauf hier rein, und diese Set-Methode wird aufgerufen, weil wir hier einen Wert
setzen, dieses magische Schlüsselwort. Der Wert wird gleich sein ,
weil das der
Wert ist, der übergeben wird. Jetzt überprüfen wir
, ob die Länge
des Namens des Benutzers kleiner oder gleich eins ist. Wenn ja, nun, wir
können es nicht aktualisieren, dann Pech gehabt, wir führen jede andere Validierung durch,
was auch immer es sein mag. Wenn wir es endlich aktualisieren können, werden wir
unseren privaten Variablennamen, der
das ist, auf den Wert setzen , der übergeben wird. Das ist der Zauber, wenn man hier
eine Shop-Property und
das festgelegte Schlüsselwort verwendet hier
eine Shop-Property und
das festgelegte Schlüsselwort Wir brauchen keine
ganz neue Methode. Um dies zu erreichen, können
wir eingebaute
Funktionen verwenden Die wichtigste Erkenntnis
daraus ist, dass Ladenimmobilien den Zugriff auf vertrauliche Informationen
kontrollieren Und diese Artikel sind alle unsere lokalen Bereiche, hier gelten sie alle als
sensible Informationen Wir möchten nicht, dass Benutzer
hier einfach irgendwelche alten Werte eingeben. Wir wollen vielleicht eine
Überprüfung, um sicherzustellen , dass die übergebenen Werte
korrekt sind. Sie wissen, dass sie gültig sind oder aus
irgendeinem anderen Grund. Und wenn sie es dann endlich sind, können wir in diesem Fall
unsere sensiblen und wertvollen
privaten Variablen aktualisieren unsere sensiblen und wertvollen . Das ist also der Vorteil der
Verwendung von C-Sharp-Eigenschaften. Wir haben ziemlich ausführlich über das
Schlüsselwort set gesprochen. Lassen Sie uns das Schlüsselwort
get ganz schnell behandeln. Das Schlüsselwort get erhält
nur den Wert unserer
privaten Variablen. Auch hier können wir
unterwegs verschiedene Dinge tun , bevor wir es
letztendlich zurückgeben. Wir können hier alles tun, was wir wollen, genau wie bei dem eingestellten
Schlüsselwort hier.
Wir können alles tun, was wir wollen. Aber letztendlich
werden wir es endlich hier rausbringen. Was wir hier tun können,
lassen Sie uns den Namen
des Spiels hier
im Konsolenfenster ausgeben . Wenn diese Zeile hier ausgeführt wird, geben wir im Spiel nur
einen Namen im Fenster aus. Du kannst es also genau hier sehen. Also, was passiert, ist intern, wenn wir diesen Wert
tatsächlich
bekommen, also wollen wir den Namen des Spiels herausfinden. Intern wird dieser
Get-Block aufgerufen. Wir können hier alles machen, was wir
wollen, alle Prüfungen, jede Validierung, die wir in einer Datenbank oder einer Datei protokollieren
könnten. Und dann können wir endlich
unsere sensiblen Informationen hier zurückgeben , das private Feld hier raus und dann raus zum Fenster. Sie können das Schlüsselwort get sehen, in diesem Fall
das Abrufen unserer
lokalen Variablen hier steuert . In ähnlicher Weise
steuert das Schlüsselwort set die Initialisierung eines Werts für unser wertvolles sensibles
lokales Feld genau hier. Und auch hier ist es immer
eine
gute Praxis, für
jedes Ihrer
privaten Felder eine C-scharfe Eigenschaft zu haben eine
gute Praxis, für
jedes Ihrer
privaten Felder eine C-scharfe Eigenschaft . Und standardmäßig sollten Sie Ihre lokalen Felder
immer
privat machen, es sei denn, es gibt
mildernde Umstände oder besondere Gründe Eines der anderen
Dinge, die wir mit
C-Sharp-Eigenschaften tun können , ist
, sie schreibgeschützt zu machen. Damit meine ich,
dass der Benutzer auf die privaten Variablen zugreifen
kann, sie
aber nicht initialisieren kann, er kann ihnen keinen Wert geben Nehmen wir zum Beispiel
das Publisher-Feld an, wir möchten, dass es
schreibgeschützt ist. Was meine ich damit? Sagen wir zum Beispiel,
wenn ich
den Herausgeber für
eines dieser Spielobjekte ermitteln möchte , würde
ich Game One Publisher verwenden. Und das wäre so, als ob ich
nur lesen kann, wenn ich auf
die Informationen zugreifen könnte. Aber wenn ich tatsächlich
versuche, die Daten einzustellen, zum Beispiel den
Namen festzulegen, kann ich das nicht tun. Es lässt mich nicht, wie mache
ich das? Vielleicht ist es eine nützliche Sache. Was wir hier tun können, ist
eine neue Immobilie für
unseren Verlag zu erstellen . Auch hier haben wir unser
vertrautes Format, wir schreiben Großbuchstaben,
nur um es sich zu merken. Dann hilft
uns Visual Studio, indem es uns Hinweise gibt, was
wir vielleicht tun möchten Das ist großartig, ich werde sie benutzen. So macht man eine
Eigenschaft schreibgeschützt. Das tun wir, wir definieren einfach überhaupt
kein festgelegtes Schlüsselwort. Gehen Sie nur hier rein. Du kannst kein Set alleine haben
, du brauchst immer einen Get. Aber du kannst auch einfach einen Get haben
, der es nur zum Lesen macht. Schauen wir uns das Beispiel
an. Wenn wir nun
Publisher auf dem Bildschirm anzeigen möchten , können
wir das einfach tun. Wir können den
Herausgeber auf dem Bildschirm anzeigen. Es ist überhaupt kein Problem,
es wird funktionieren. Wenn ich versuche, hier tatsächlich einen
Wert einzugeben, möchte
ich diesen
Herausgeber auf etwas wirklich aktualisieren. Sie können sehen, dass
hier ein Fehler vorliegt, es gibt eine rote Linie. Wenn ich mit der Maus darüber fahre, können
Sie hier sehen, dass Eigenschaft oder ein Indexer
nicht zugewiesen werden kann, sie sind schreibgeschützt Das liegt nur daran, dass
wir hier kein festes
Schlüsselwort festgelegt haben Schlüsselwort festgelegt Es gibt keinen Setter, wir können
hier keinen Wert festlegen. Dies ist sehr nützlich, wenn Sie
hier
sensible Felder haben hier
sensible Felder , für die Sie nur Lesezugriff wünschen Vielleicht möchten wir hier
unser ID-Feld lesen, aber wir möchten nicht, dass der Benutzer
es zum Beispiel festlegt. Dann hätten wir
so etwas , bei dem wir hier nur
Lesezugriff auf unsere lokalen
Variablen gewähren . Eine andere Sache, die wir sogar tun
können, ist
Zugriffsmodifikatoren zu
unseren hinzuzufügen und Schlüsselwörter festzulegen Hier haben wir unseren Namen hier, wir wollen, dass jeder
den Namen bekommt Aber vielleicht wollen wir die Einstellung
dafür privat
machen. Nur Dinge in unserer Klasse
hier können das tatsächlich tun. Was wir hier tun können, wir können den Setter privat
machen. Und das heißt, wenn wir versuchen,
diesen Namenswert hier von
irgendwo außerhalb dieser Klasse zu setzen , wird
er nicht in Buchstaben umgewandelt Wenn ich hier also zur
Hauptdatei gehe,
versuche
ich, den Namen als Wert zu initialisieren .
Ich bewege den Mauszeiger darüber Sie können sehen, dass es in
diesem Zusammenhang nicht verwendet werden kann , da auf das
Setzubehör nicht zugegriffen Wir können es eigentlich nicht von
irgendwo außerhalb dieser Klasse aus einstellen irgendwo außerhalb dieser Klasse Sobald ich das entferne, können
Sie sehen, dass der Fehler verschwindet und wir können den
Namen erneut festlegen. Sharp-Eigenschaften sind
eigentlich ziemlich mächtig, wir haben sie gerade erst angesprochen,
aber ich denke, das wird
ausreichen, um Ihnen Einstieg in Ihre
Bemühungen, sie zu nutzen Was Sie daraus
mitnehmen sollten ,
ist, dass Eigenschaften in C Sharp, die den Zugriff mithilfe von
Getter und Setter auf
Ihre privaten Felder kontrollieren ,
die Teil
Ihrer C-Sharp-Klassen sind Danke fürs Zuschauen.
43. 9-6. Vererbung: Okay, Erbschaft in C Sharp. Sie haben
das Wort vielleicht schon einmal gehört, vielleicht haben
Sie es nicht gehört, aber ich werde
es jetzt erklären. Was ist also Vererbung
in C Sharp? Im Grunde besteht das
Kernprinzip der Vererbung darin, die Wiederverwendbarkeit von Code zu erhöhen Und das ist selbst
in Bezug auf
objektorientierte Programmierung sehr wichtig , nicht in Bezug auf
objektorientierte Die Sache ist, wenn wir Code kopieren
und duplizieren, dann wird es
irgendwann wirklich
schwierig sein, unsere Software zu warten Es wird
eine große Dateigröße haben und Sie werden eine Menge Probleme
haben. Immer, immer
Code wiederverwenden, wo immer möglich. Schauen wir uns
ein Beispiel für
Vererbung in C Sharp an. Also, was ich hier habe, ist eine
sehr einfache Anwendung. Ich habe ein neues Tierobjekt erstellt und dafür habe ich eine
Tierklasse. Schauen wir uns
die Tierklasse an. Also hier ist mein Tierunterricht. Hier gibt es zwei private Felder, Name und Alter. Der Name des
Tieres könnte also Rocky sein und Rocky könnte sieben Jahre alt sein, als ob Rocky zum Beispiel
ein Hund sein könnte. Ich habe hier zwei grundlegende
Methoden, bei denen nur der Name
des Tieres im Konsolenfenster
wiedergegeben wird,
und noch eine andere Methode, die das Alter
des Tieres wiedergibt Ich habe hier zwei Ladenflächen, zwei öffentliche Grundstücke, die mir die
Kontrolle über meine privaten
Felder, Name und Alter, ermöglichen Kontrolle über meine privaten
Felder, Name und Alter, Es ist also eine sehr einfache Klasse. Ich habe hier ein
Tierobjekt geschaffen. Ich habe die Namen Property
und Rocky Age auf sieben gesetzt. Jetzt verwende ich hier nur diese
Methoden, die
diese Werte einfach auf dem Bildschirm wiedergeben,
wenn wir die Anwendung ausführen. Jetzt können Sie sehen,
dass es sehr einfach ist. Mein Name ist Rocky, ich
bin sieben Jahre alt. Das ist also eine grundlegende
Tierklasse. Nehmen wir an, ich
möchte meine Anwendung erweitern. Vielleicht möchte ich eine
Software, mit der ich einen Zoo mit Tieren
erstellen kann. Vielleicht möchte ich einen Hundekurs, Rattenkurs, einen Katzenkurs,
einen Hamsterkurs Ich möchte vielleicht
20 Klassen denen jeder auf seine Art ein
Tier repräsentiert Wenn wir jetzt hierher kommen, können
wir hier mit
der rechten Maustaste auf das Projekt klicken und eine neue Klasse hinzufügen. Und nehmen wir an, wir
wollen eine Hundeklasse einrichten. Dieser Kurs wird
alles mit einem Hund zu tun haben. Zum Beispiel hat der
Zoo vielleicht Hunderte von Hunden und wir möchten
unsere Hunde in einer
eigenen Hundeklasse verwalten . Das ist absolut vernünftig. Auch hier könnten wir
einen Katzenkurs, einen Hamsterkurs, viele Dinge Aber was wir wollen, unsere Hundeklasse, wir wollen all
diese Funktionen dieser Tierklasse
hier haben, weil unser Hund einen
Namen haben wird, er wird ein Alter haben Aber vielleicht hat es noch
ein paar andere Dinge, wie vielleicht Methoden, die mit dem Graben
zu tun haben Und nicht alle Tiere können graben, zum Beispiel vielleicht etwas, das für einen Hund
spezifisch ist Aber wir wollen diese
Kernfunktionalität. Unser Hund wird einen Namen und ein Alter
haben. Ich will all das Zeug und
das werde ich in meinen Hundeunterricht geben. Also jetzt kann ich
irgendwie darauf aufbauen. Ich kann einige Methoden
hinzufügen, weißt du, wenn der Hund gräbt oder der
Hund um Leckerlis bettelt, oder vielleicht bestimmte Hundetricks Aber das Problem ist, dass wir
all diese Kernfunktionen kopiert haben all diese Kernfunktionen , was
funktionieren wird, kein Aber das Problem ist, wenn
ich eine andere Klasse habe, vielleicht eine Katzenklasse oder
eine Meerschweinchenklasse, möchte ich, dass sie auch
diese Kernfunktionalität haben . Und das Problem ist, dass ich all diese Informationen in
etwa 20 verschiedenen Klassen
haben werde und es wirklich
schwierig sein wird, sie zu verwalten. Und nicht nur das, es
wird,
wie ich schon sagte, die
Dateigröße der Anwendung erhöhen . Wie umgehen wir
dieses Problem hier? Oder der Laden hat etwas, das wir
nutzen können , und das
heißt Vererbung. Inheritance in C Sharp ist sehr einfach zu starten, aber vielleicht
komplexer zu meistern. Aber lassen Sie uns anfangen und
einen Blick darauf werfen, wie wir das machen können. In unserer Klasse benötigen wir keine dieser
Funktionen. Was wir tun können, ist
die Funktionalität der
Tierklasse zu erben die Funktionalität der
Tierklasse Das ganze Zeug hier, der ganze öffentliche Kram sowieso Und wir können zu unserer Hundeklasse gehen
und einen Doppelpunkt verwenden und dann die
Klasse eingeben, von der wir die Funktionen
erben wollen von der wir die Funktionen
erben In diesem Fall wird es einfach
tierisch sein, wenn wir das tun. Ein sehr
kleiner Code hier. Jetzt
kennt unsere Hundeklasse alle öffentlichen Methoden hier und alle öffentlichen Eigenschaften, die wir in dieser Klasse haben
könnten. Schauen wir uns ein Beispiel an. Im Moment können Sie sehen, dass unsere
Hundeklasse völlig leer ist. Unsere Tierklasse
hat all diese Logik. Lassen Sie uns ein neues
Objekt für einen Hund erstellen und sehen, ob wir einige
dieser Eigenschaften und
Methoden hier
tatsächlich verwenden können . Lassen Sie uns ein neues
Objekt für einen Hund erstellen. Ich nenne ihn einfach Do. Wir
können dem Hund einen Namen geben. Bingo, warum nicht das Alter des Hundes? Wir können es zum Beispiel auf
drei setzen. Ich werde sie einfach umbenennen. Sie können hier sehen, dass es unter
diesen Immobilien
keine roten Linien gibt. Bei der
Verwendung dieser Methoden treten keine Fehler auf. Wir können die
Anwendung sogar ausführen, kein Problem. Und jetzt schau, mein Name ist Bingo. Ich bin drei Jahre alt. Sie können hier sehen, dass der Hund alle
Funktionen vom Tier
geerbt hat , alle öffentlichen Methoden
und Eigenschaften vom Tier. Sie können hier die
Hundeklasse sehen. Sie ist völlig leer. Aber Sie können sehen, dass wir den ganzen Code hier
wiederverwenden , was wirklich
effizient ist und das ist der Punkt der Vererbung. In diesem Beispiel hier sagen
wir, dass Tier entweder
die Elternklasse ist, so wie Sie einen
Elternteil und ein Kind haben, wo das Kind
die Fähigkeit erben könnte, zu atmen, bluten
oder
Dinge in Ihrer DNA zu essen Daher stammt die
Terminologie. Das Tier wäre in diesem Fall der Elternteil und der Hund
wäre das Kind. Aber einige andere Synonyme
dafür
wären die Basisklasse
oder die Oberklasse Hund wäre das Kind,
die abgeleitete Klasse
oder die Unterklasse sind alles Synonyme, aber sie bedeuten
im Grunde
dasselbe Wenn Sie über
Erbschaft in C Sharp nachdenken, müssen
Sie eine Sache berücksichtigen, ein Gedanke muss Ihnen durch den Kopf
gehen, und das ist a ist ein Hund, ein Tier ist eine Katze. Ein Tier ist eine Ratte, ein Tier. Wenn ja, dann
ist Erbschaft perfekt für Sie. Und du
missverstehst das Konzept nicht. Denken Sie immer daran, wenn Sie in
einem Geschäft erben es sich um eine Beziehung handelt Erbschaft ist ein sehr
langwieriges Thema. Aber noch eine Sache
werde ich erklären,
damit absolut klar ist,
was ich tun werde. Ich werde
eine Methode innerhalb
unserer Hundeklasse definieren , die für Hunde einzigartig
ist. Ich möchte, dass das zum Beispiel
Bellen ist. Weil alle Hunde bellen, lassen Sie mich eine Methode entwickeln
, bei der Hunde bellen. Sie können also sehen, dass ich hier
eine Methode namens Bark erstellt habe. Und alles, was es tut, es schreibt
in das Konsolenfenster. Wuff, wuff. So sehr einfach Und genau wie bei
Menschen, wenn man eine hat, kann
man Dinge erben,
wenn man geboren wird, wie ich bereits erwähnt habe Aber der Elternteil kann nicht vom
Kind erben. Wenn das Kind zum Beispiel
eine neue Fähigkeit besitzt, wie zum Beispiel das
Bellen, dann weiß das Tier
davon nichts Genau wie in einer
Eltern-Kind-Beziehung Wenn Ihr Kind eine neue Fähigkeit besitzt, es vielleicht Künstler geworden Das heißt nicht, dass der
Elternteil ein Künstler ist. Weißt du, Erbschaft
funktioniert so nicht. Lass mich dir jetzt ein
Beispiel dafür zeigen. Also haben wir in
der Hundeklasse eine Methode namens Bell definiert. Wenn ich hier zu unserem
Hauptkanonenprogramm gehe und hier einen kleinen Punkt
nach dem Tier setze, können
Sie sehen, dass das Tier keine
Ahnung von der Bellmethode hat Es steht nicht einmal in dieser
Liste, was erwartet wird. Aber wenn wir hier zum
Hund gehen und eintippen, haben
wir dann unsere Methode namens Bellen, die wir
gerade entwickelt haben? Wir können die Anwendung
jetzt ausführen, Sie können sehen, dass Sie es können. Der Hund
bellt also und dann wiederholen wir nur den Namen und
das Alter des Das ist ein sehr einfaches Beispiel für
Erbschaft in einem Geschäft.
44. 9-7. Methoden-Override (Polymorphismus): Okay, Methode statt Reiten. Wenn Sie das vorherige
Tutorial zur Vererbung noch nicht gesehen haben, empfehle ich Ihnen dringend, es
sich anzusehen, da es auf das
folgt,
was ich hier habe. Ich habe eine grundlegende Tierklasse. Wir geben der
Tierklasse einen Namen und ein Alter. Jetzt habe ich einen Hundekurs. Und wieder
hat der Hund einen Namen und Alter und auch hier gibt es eine
Katzenklasse. Und sie machen verschiedene
Dinge mit dem Tier. Ich sage den Namen
Alter und mache ein Geräusch für den Hund
und dasselbe für die Katze. Wenn ich hier in meinen Tierunterricht gehe, haben
wir die üblichen Dinge, die Methoden aus
dem letzten Tutorial. Aber wir haben
hier noch eine weitere Methode und sie heißt Make Noise. Alles, was sie tut, ist
etwas auf dem Bildschirm
wiederzugeben, das
zufällige Tiergeräusche macht Ich habe eine Hundeklasse, die
von einem Tier erbt. Sie erbt alle öffentlichen
Funktionen, die wir für
sie definiert haben Und eine Katzenklasse, die auch von Tieren
erbt,
aber sie tun nichts Der Katzen- und Hundeunterricht
bringt nichts Wenn wir das Programm ausführen, das Sie hier sehen können,
heiße ich Henry Ich bin fünf Jahre alt. Macht zufällige Tiergeräusche. Und das Gleiche gilt für
die Katze. Was wir hier tun, wir erben all
diese Funktionen Aber Sie können
insbesondere sehen, dass wir hier diese Methode namens make Noise
erben Nun, das ist Teil der
Tierklasse,
wir wissen zum Beispiel vielleicht nicht, was für ein Tier wir haben, wir haben nur ein generisches
Tier namens Henry Aber in meinem Hundeunterricht weiß ich, dass Hunde bellen. Zum Beispiel S, ich
möchte, dass Lassie eine Bar macht. Ich möchte nicht, dass Lassie zufällige
Tiergeräusche macht. Gleiche gilt für die
Katzenklasse. Wir haben Felix. Ich hätte zum Beispiel gerne,
dass die
Katze das macht.
Ich könnte das ganz einfach tun, indem ich hier
eine neue Methode definiere , die in der Hundeklasse
bellen heißt. Dann kann
ich in der Katzenklasse eine Methode
namens make noise oder per,
miau oder so ähnlich definieren ,
die nur bei Katzen vorkommt Aber was wir tatsächlich tun können, ist diese Methode, die
hier als Make Noise bezeichnet wird,
außer Kraft Das bedeutet, dass wir diese
Noise-Funktionalität
erben können diese
Noise-Funktionalität
erben Aber das wird es nicht tun, es wird etwas anderes tun Das ist etwas anderes, das wir in unserer Kinderklasse
definieren können. Zum Beispiel die Hundeklasse. Wie überschreiben wir diese Methode? Wie erben wir
das und wie überschreiben wir es? Nun, in der
Kinderklasse hier, Hund, erben
wir die Methode
schon , weil wir
zufällige Tiergeräusche machen Aber wir wollen, dass der Hund bellt. Also, wie machen wir das? Was wir in der Elternklasse tun
müssen, also in diesem Fall Tier, müssen
wir die Methode zu dem machen,
was man virtuell nennt. Und was das ist, es ist ein
neues Schlüsselwort namens virtual. Und das sagt einfach, okay,
jeder, der diese Klasse erbt, kann
dieser Methode
seine eigene Definition geben, wenn Sie
möchten. Es ist deine Wahl Das musst du jetzt nicht. Das mache ich nicht mal. Ich führe das Programm aus, ich erbe
all diese Funktionen. Virtual bedeutet im Grunde
, okay, die Option besteht darin, Ihre eigenen
Inhalte neu zu definieren Für diese Methode ist es optional, müssen
Sie nicht.
Das ist virtuell. Aber was wir tun wollen, ja, wir wollen tatsächlich
unsere eigene Funktionalität. zum Beispiel in dieser
untergeordneten Klasse hier, Machen Sie zum Beispiel in dieser
untergeordneten Klasse hier, was ich
tun möchte , wenn ich hier die Methode make
noise aufrufe. Ich möchte bellen. Ich
will, dass der Hund bellt. Um das zu tun, sage ich
bellen oder wuffen, oder vielleicht beides. Warum nicht? Ich habe
diese Methode von oben kopiert, aber wir setzen hier keine virtuelle Methode ein. Wir verwenden ein neues Schlüsselwort
namens override. Und das ist wieder ein
spezielles Schlüsselwort. In der Basisklasse, der Elternklasse, verwenden wir
das Schlüsselwort virtual. In der untergeordneten Klasse verwenden
wir das Schlüsselwort override. Das heißt im Grunde, okay, ich erbe diese Methode
von der Elternklasse animal, aber ich möchte meine eigene Definition Ich möchte deine
Cano-Logik überschreiben und meine eigene Override setzen, die immer in die untergeordnete Klasse
geht, in diesem Fall Hund In der Basisklasse müssen wir es
auf virtuell setzen. Wenn wir nicht virtuell angeben, können wir es nicht überschreiben. Sie passen zusammen wie ein
Paar in unserer Katzenklasse. Nun, ich will die Katze jetzt zu mir es
zum Beispiel so einfach, ist es
zum Beispiel so einfach,
als ob ich die Anwendung
starte. Jetzt können Sie hier sehen, dass ich Henry
heiße. Jetzt ist Henry ein generisches Tier. Er ist kein Hund oder
er ist keine Katze. Henry macht zufällige
Tiergeräusche. Lassie
or Less ist jedoch ein Hund. Wenn wir die Methode „Hier
Lärm für den Hund machen“ nennen, dann wird
der Hund bellen und wuffen. Nun, die Katze wird
keine
zufälligen Tiergeräusche machen , weil die Katzenklasse auch die virtuelle Methode überschreibt Mach Lärm und die
Katze miaut. Sie können sehen, dass das ein
ziemlich einfaches Beispiel dafür wie wir
diese Methode hier wiederverwenden können, Geräusche
machen, ist, wie wir
diese Methode hier wiederverwenden können, Geräusche
machen, die
in unserer Elternklasse definiert sind, aber ihr unsere eigene
Definition geben Dies ist die Wiederverwendung von vorhandenem
Code wie dieser Methode hier. Aber wir wollen diese
Funktionalität nicht, wir wollen unsere eigene. Der Prozess der Definition
unserer eigenen Definition ist ein Beispiel für den
sogenannten Polymorphismus Was ist das? Es ist
ein griechisches Wort, das viele Formen oder viele Formen
bedeutet. Aber es ist ein Schlüsselprinzip der
objektorientierten Programmierung. Sie haben also die ganze Zeit ein Beispiel für
Polymorphismus
gemacht ,
vielleicht ohne es zu merken Aber das ist das Schlüsselprinzip
der 00-Programmierung und es ist sehr wichtig, wie
Sie bereits gesehen haben Es wird durch
Vererbung und Wiederverwendung von Code erreicht. Aber nicht nur das, sondern auch die Bereitstellung einer eigenen
Definition für etwas Das ist also Polymorphismus. Das ist also ein Beispiel für das Überschreiben von
Methoden in C Sharp.
45. 9-8. Mehrstufige Vererbung: Okay, mehrstufige Vererbung. Wenn Sie die
vorherigen Tutorials
zur Vererbung noch nicht gesehen haben, empfehle
ich Ihnen dringend,
sie sich jetzt anzusehen, da sie
auf diese
mehrstufige Vererbung aufbauen. Schauen wir uns also hier ein
Beispiel an. Hier habe ich einen Tierkurs, hier ist er genau hier. Es definiert einige grundlegende
Dinge, die mit Tieren zu tun haben, besonders diese Methode macht
hier Lärm. Diese Methode ist nun virtuell, was bedeutet, dass alle untergeordneten Klassen
dieser Basisklasse Tier
optional ihren eigenen
Inhalt für diese Methode definieren können . Okay, wir haben darüber gesprochen, jetzt haben wir zwei neue Klassen. Eine heißt Fleischfresser und ihre Elternklasse ist Tier
und eine heißt Der Fleischfresser ist wie Fleischfresser und ein Pflanzenfresser ist
Pflanzenfresser und ein Pflanzenfresser ist ein Tier . Es erfüllt also diese Art von Beziehung. Und der Pflanzenfresser setzt die Methode der Tiere
der Elternklasse außer Kraft und definiert seine eigene Funktion, nämlich dass ich ein Pflanzenfresser bin
, Pflanzenfressgeräusche mache und
das Gleiche gilt für Fleischfresser definiert seine eigene Funktion, nämlich dass ich ein Pflanzenfresser bin
, Pflanzenfressgeräusche mache und
das Gleiche gilt für Fleischfresser. Es überschreibt die virtuelle Methode und definiert seinen eigenen Code. Es überschreibt die virtuelle Methode und definiert seinen eigenen Code. Ich bin ein Fleischfresser und macht Geräusche beim
Fleischessen. Okay? Wenn wir
ein Objekt erstellen, das ein Fleisch- oder Pflanzenfresser ist,
und diese Methode ausführen, erhalten
wir dieses wir Jetzt Katze und Hund. Jetzt ist Katze ein Fleischfresser. Der Hund ist auch ein Fleischfresser. Sie können sehen, was hier
passiert, ist, dass der Hund fast wie der
Enkel eines Tieres
ist Der Fleischfresserunterricht findet
zwischen Hund und Tier statt. Die Basisklasse ist hier
Tier, dann Tiere, Kind ist der Fleischfresser,
dann ist das Kind des
Fleischfressers der Hund Das ist ein Beispiel für Vererbung auf mehreren Ebenen
. Wir haben hier eine Hierarchie. Wir haben den Enkel, den Hund. Der Vater ist der Fleischfresser. Der Großvater wäre zum Beispiel
das Tier. Hier gibt es mehrere
Vererbungsebenen, können
Sie perfekt machen, was
Sie in C Sharp finden Das ist nur ein Beispiel. Sie können hier sehen, dass der Hund auch die
Methode Make Noise überschreibt Es bellt, wuff. Schauen wir uns also ein
Beispiel an. Hier erstelle ich ein neues Tier, das ist die Basisklasse,
wie den Großvater Ich erschaffe einen neuen Hund, der
wie der Enkel und eine neue Katze ist , und dann rufe ich bei jedem von ihnen die Methode
Make Noise auf Ich habe kein Objekt für Fleischfresser. Ich habe kein Objekt für Pflanzenfresser. Lassen Sie uns die Anwendung hier ausführen. Macht zufällige Tiergeräusche , weil wir nicht wissen,
welches Tier Henry ist Das haben wir damals definiert. Hund und Katze haben ihre eigenen
Definitionen für Lärm machen. Bell, Wolf und O, was passiert, wenn ich
diese Methode hier von Hund entferne? Was passiert? Erbe ich
Fleischfresser? Erbe ich ein Tier
wie der Großvater von diesem? Nun, ich zeige es dir gleich, es erbt die übergeordnete Klasse, also kannst du jetzt sehen, dass ich keine Methode
namens
make noise Wenn der Hund Geräusche macht, schaut
er sich seine Elternklasse an, und in diesem Fall ist es ein Fleischfresser Carnivore
überschreibt eigentlich das Geräusch von make noise und gibt eine eigene Definition,
wenn Das ist Henry, das
zufällige Tier Noise. Lassen Sie uns das einfach mal
ins Auge fassen. Das ist Henry, das ist der Hund. Weil die Hundeklasse das
jetzt nicht außer Kraft setzt. Jetzt springt es zu seinem Elternteil, dem Fleischfresser
, der es Jetzt sagt der Hund, ich bin ein Fleischfresser, macht
Fleischfressgeräusche
und die Katze hat immer noch
ihre eigene Methode
definiert, und die Katze hat immer noch sodass die Katze immer noch miaut definiert Aber das ist ein sehr
einfaches Beispiel mehrstufige Vererbung in C Sharp und Wie viele
Vererbungsebenen können Sie haben? Wie groß kann zum Beispiel dieser
Tierstammbaum sein? Nun, es gibt kein
wirklich festgelegtes Limit, aber wenn
Sie Software erstellen, möchten Sie sie nicht
absolut lächerlich machen. 234 Stufen vielleicht, das hängt
vielleicht von der
Größe Ihrer Anwendung ab. Bei zehn oder 50
Erbschaftsstufen kann
ich mir kein
Beispiel vorstellen, kann
ich mir kein
Beispiel vorstellen warum Sie das
jemals tun wollen würden. Aber der Zweck dieses
Tutorials ist nur,
Ihnen zu zeigen, dass das möglich ist
und Sie wissen, dass es so ist, Leute es in der realen Welt benutzen. Es gibt noch eine andere Art der Vererbung, die
als Mehrfachvererbung bezeichnet wird. Hier
kann eine Klasse, zum Beispiel eine Katze, zum Beispiel eine Katze, nicht
nur von einem
Tier erben, sondern vielleicht auch von etwas anderem wie Katzen oder Also zwei Klassen. Nun, Shop unterstützt dies
nicht nativ, aber es kann
über Schnittstellen erreicht werden, auf
die wir
in einem späteren Tutorial eingehen Es gibt also verschiedene
Layouts für die Vererbung, aber dies ist nur ein Beispiel
für mehrschichtige Vererbung Also kann ich dir damit anfangen? Ich hoffe, dieses Tutorial hat
Ihnen geholfen, viele der Möglichkeiten
der
Vererbung im Geschäft in Betracht zu ziehen.
46. 9-9. Das versiegelte Keyword: Ich möchte im Shop über
das Schlüsselwort Sealed sprechen und es sieht genauso aus. Das Schlüsselwort sealed ist sehr
nützlich, um die
Vererbung auf Klassenebene einzuschränken .
Was bedeutet das? Hier habe ich ein Beispiel für mehrstufige
Vererbung in C Shop. Ich habe eine Spielklasse, die
wie die Mutter ist , zum Beispiel. Ich habe ein Videospiel,
das ist das Kind. Und dann habe ich Super Mario, das Enkelkind Es sieht also ungefähr so aus. Also hier ist das Basisklassenspiel. Es gibt nur eine Methode
, die sagt, was cool ist, und sie ist als virtuell gekennzeichnet. Das bedeutet, dass alle
untergeordneten Klassen dieser wählen
können, diese
Methode zu überschreiben, wenn sie möchten. Dann
habe ich unter dem
Basisspiel ein Spiel namens
Videospiel, das
vom Spiel erbt und diese Methode
überschreibt Aber anstatt zu sagen, dass
das Spiel cool ist, heißt
es, dass dieses
Videospiel cool ist Dann habe ich die
Enkelklasse in dieser Anwendung, die vom
Videospiel übernommen wurde Auch sie überschreibt die
What-Is-Call-Methode. Jetzt heißt es, dass Super Mario angerufen wird. Wenn ich mir diese
Anwendung hier ansehe, in der ich drei Objekte einrichte und diese Methoden
einfach
aufrufe, wird
sie nur
die Ergebnisse dieser Methoden ausgeben .
Das ist Polymorphismus Was ich mit
dem Schlüsselwort sealed machen kann, ist, dass ich die
Vererbung auf eine Klasse einschränken kann Ein Videospiel ist wie das
Füllen dieses Sandwichs. Sein Elternteil ist Game, aber sein Kind ist Super Mario. Wenn ich zum Beispiel sage, dass
dies eine versiegelte Klasse war, bedeutet
das, dass keine anderen Klassen von dieser Klasse erben
können, sie kann
also
keine weiteren Kinder haben Stellen Sie sich vor, es wäre vielleicht eine Phasektomie oder
etwas Ähnliches Aber du willst
versuchen, dich daran zu erinnern , dass jetzt, wenn ich
zum Kinderkurs gehe, du siehst, dass es ein
Problem gibt Super Mario kann nicht von einem Videospiel der
versiegelten Klasse abgeleitet werden, weil Videospiele keine
weiteren Kinder haben können. Es ist versiegelt Es verhindert hier die Vererbung auf
Klassenebene, was meine ich auf Klassenebene? Das heißt einfach in
dieser Zeile genau hier. Wir können
es jedoch auch auf Methodenebene verwenden. Und das schränkt jede weitere
Vererbung einer Methode ein, nicht der gesamten Klasse,
sondern nur einer Methode Wir können dies nicht als Faustregel in die
Basisklasse aufnehmen, wir können es niemals in die Master-Klasse,
die ultimative Elternklasse, Was wir tun würden, wir definieren hier
eine Methode namens
What is cool. Wir markieren es als virtuell. Wenn etwas als virtuell
markiert ist, bedeutet
das, dass die untergeordnete
Klasse
ihre eigene Definition bereitstellen kann , indem sie die Methode
überschreibt Wir haben das schon einmal gemacht. Jetzt gehe ich zum unmittelbaren Kind, das ist ein Videospiel. Ich setze diese
Methode außer Kraft, oder? Dies ist das erste
Mal, dass wir
diese Methode überschreiben , weil sie
das unmittelbare Kind ist Hier kann ich das Schlüsselwort sealed
verwenden. Sie können
Sealed nur mit Override verwenden. Sie können es nicht mit Virtual verwenden. Es muss mindestens
eine Stufe niedriger sein. Jetzt schränke ich jeden
weiteren Zugriff auf diese Methode ein. Was jetzt cool ist, die
arme Super Mario-Klasse, sie kann diese
Methode nicht mehr verwenden. Du kannst sehen. Also kann das
geerbte Mitglied nicht überschrieben werden, was so heißt
, weil es versiegelt ist. Die Verwendung des
Schlüsselworts sealed verhindert auf
Klassenebene jegliche weitere
Vererbung der Klasse selbst. Und eine Methodenebene verhindert die Methode weiter
außer
Kraft gesetzt wird, solange die Methode als versiegelt gekennzeichnet
ist Das ist also die Stärke des Schlüsselworts
sealed in C Sharp.
47. 9-10. Abstrakte Kurse und abstrakte Methoden: Lassen Sie uns über abstrakte
Klassen und abstrakte Methoden sprechen. Was sind sie? Warum
sollten wir sie benutzen? Schauen wir uns
dieses Beispiel hier an und knüpfen an das vorherige an. Wenn Sie
die anderen Tutorials noch nicht gesehen haben, empfehle
ich Ihnen dringend,
sie anzusehen , da sie einem von diesen
folgen. Wir haben hier unsere Basisklasse, Tier, und wir sind gerade dabei, ein Tier namens Henry
einzurichten. Wir haben unseren Hund, der vom Tier
erbt, und wieder eine Katze, die vom Tier
erbt Und wir wiederholen nur
den Namen des Tieres, des Hundes und
der Katze Hier ist unser Tierkurs.
Es macht nicht viel. Wir haben drei Methoden. Wir haben markiert, machen Lärm, sagen Alter und sagen
Namen. Alles war virtuell. Wenn die untergeordneten Klassen diese
überschreiben wollen, können sie das tun. Wir überschreiben jetzt denselben Namen. Wenn wir den
Namen des Hundes bekommen, heißt es:
Oh, mein Name ist dann der Name des Hundes und
dann Wuff am Ende Und das Gleiche gilt für die Katze.
Es ist nicht viel los. Wir haben nicht wirklich darauf
aufgebaut. Wir führen das Programm aus,
das können Sie zum Beispiel
sehen. Es ist ganz normal. Stellen Sie
sich nun vor, Sie haben eine sehr
große Software. Sie haben zehn weitere Leute, die an der Software
arbeiten, und Sie möchten
für jedes Tier einen Kurs. Sie emulieren zum Beispiel einen
Zoo. Du entwickelst eine
Software für Zoo oder sogar
ein Pokémon-Spiel Und du willst eine Klasse für jeden
Charakter oder jedes Tier. Sie könnten
all diese Klassen von einer Person in
Ihrem Team erstellen lassen, aber in Teams von vielleicht
zehn oder 100 Personen werden
Sie das
delegieren Sie werden nicht der Einzige
sein, der diese Klassen
erstellt In diesen Klassen hier haben wir einen, der sagt, mach Lärm und
es bellt und wummelt. Wir haben einen, in dem es heißt, sag den Namen
und es
sagt den
Namen des Tieres, zum Beispiel den Hund hier Und der Hund wirft, nachdem er seinen
Namen wiederholt hat.
Das Gleiche gilt für die Katze Aber was ist, wenn unser Teamkollege Randy
zum Beispiel eine Hamsterklasse ins Leben
ruft Vielleicht vergisst er, diese Methode zu überschreiben. Er erinnerte sich daran, den Namen zu sagen, aber vielleicht hat er vergessen, das Geräusch zu
machen, wenn die Anwendung läuft, anstatt make noise zu
überschreiben und
es macht Hamstergeräusche Es wird hier nur den Standardsound der Klasse „Can
Apparent“
erzeugen ,
zufällige Tiergeräusche Wie können wir also
Randy, unserem Freund, sagen, dass du vergessen hast, diese Methode
außer Kraft zu setzen, dass deine Hamster
keine Hamstergeräusche machen Nun, wir können das sogar in unserer Elternklasse
Tier durchsetzen in unserer Elternklasse
Tier Was wir in Animal tun können, wir können sagen, okay, ich werde
einen Vertrag aufsetzen und sagen dass
jede Klasse, die
diese Klasse erbt,
sagen wir, diese drei Methoden hier überschreiben muss sagen wir, diese drei Methoden hier Sonst kompiliert die Software
nicht einmal. Wir können nicht einmal die Software ausführen , die sicherstellt, dass
unser Freund Randy zum Beispiel die Methoden
überschreibt, die unser Freund
Randy überschreiben soll Wir können etwas einführen, das abstrakte Klassen
genannt wird. Was tun
abstrakte Klassen, um das zu erreichen? Stellen Sie sich das in Ordnung vor, wenn ich eine abstrakte Klasse
und eine abstrakte Methode haben möchte, jede Klasse, die diese Klasse
hier
erbt muss
jede Klasse, die diese Klasse
hier
erbt,
diese Methoden überschreiben Sie müssen
eine Definition angeben. Wenn das eine abstrakte Methode ist die zu einer abstrakten Klasse
gehört, wenn Randy, unser Freund, eine Hamster-Klasse
erstellt, dann läuft die Software
nicht einmal Wenn er keine eigene
Definition für diese Methoden bereitstellt , ist
das der Vorteil
einer abstrakten Klasse und
einer abstrakten Ich werde dir zeigen,
wie man das einrichtet. Das Erste, was
wir tun, um
eine abstrakte Klasse einzurichten , ist, die Klasse als abstrakt zu
markieren. Das ist genauso einfach, wie das abstrakte
Schlüsselwort dort zu
schreiben. Das macht ein paar Dinge. Sobald wir eine
Klasse als abstrakt markiert
haben, können wir aus dieser Klasse kein
Objekt mehr erstellen. Was bedeutet das? Wenn wir hier zum Programm
gehen, können
Sie sehen, dass wir
hier
ein tierisches Objekt namens Henry erstellen . Jetzt wissen wir nicht,
welches Tier Henry ist, er wurde nur
in unserem Beispiel verwendet. Aber Sie können
jetzt hier sehen, dass sich
unter dieser neuen
Instanzzeile genau hier eine rote Linie befindet. Wenn ich mit der Maus darüber fahre, wird angezeigt, dass keine Instanz des abstrakten Typs oder
des
Interface-Animals erstellt abstrakten Typs oder
des
Interface-Animals Das liegt daran, dass Sie, wenn Sie eine Klasse als abstrakt markieren
, keine
Instanz dieser Klasse mehr erstellen können Nun, Henry, wir
müssen entscheiden,
was für ein Tier
Henry zu diesem Zeitpunkt ist. Er ist entweder ein Hund, ein Hamster, eine Katze oder etwas anderes Aber jetzt haben wir diese
Tierklasse als abstrakt markiert. Wir können kein
Exemplar eines Tieres erstellen. Henry muss gehen und wir müssen entscheiden
, wer Henry ist. Aber das ist beabsichtigt. Wenn Sie eine abstrakte Klasse haben, können
Sie keine
Instanz dieser Klasse erstellen. Jetzt abstrakte Methode. Also haben wir unsere
abstrakte Klasse eingerichtet. Jetzt werden wir
eine abstrakte Methode erstellen. Wie ich bereits erwähnt habe, muss, wenn
eine Methode abstrakt ist, jede untergeordnete Klasse jede untergeordnete Klasse, die
diese Klasse erbt, eine Definition
bereitstellen Zum Beispiel erbt unsere
Hundeklasse Do von Animal. Was ich tun werde, ich werde diese beiden Methoden löschen Der Hund erbt einfach
das normale Zeug. Jetzt markiere ich
diese Methode als abstrakt. Das ist eine abstrakte Methode. Wenn ich eine
Methode als abstrakt markiere, können
wir keine
Definition für die Methode angeben. Wie ich bereits erwähnt habe, erzwingt
sie in allen untergeordneten
Klassen,
ihre eigene Definition anzugeben , weil wir nicht einmal
eine Instanz
dieser Klasse erstellen können und wir
lediglich erzwingen untergeordnete Klassen
ihre eigene Definition angeben Dann macht es keinen
Sinn, hier überhaupt
eine Definition zu haben ,
weil sie irrelevant ist Sie würde niemals
aufgerufen oder erreicht , wenn Sie eine
abstrakte Methode definieren, es ist nur eine Vorlage. Es heißt nur, okay, für
alle untergeordneten Klassen müssen
Sie Ihre eigene
Definition für diese Methode angeben. In der Katzenklasse
machen wir genau das. Wir haben hier unsere eigene Methode und wir überschreiben sie, wenn Sie eine Methode als
abstrakt
definieren , um
Ihre eigene Definition bereitzustellen, genau wie bei virtual verwenden Sie hier
das Schlüsselwort override In der Hundeklasse können
Sie jetzt sehen, dass ein Fehler vorliegt Wenn ich
hier mit der Maus über den Hund fahre, heißt es: Schau, Hund implementiert nicht das vererbte abstrakte Mitglied
Tier, das Geräusch macht Sie können sehen, dass die Software
nicht einmal kompiliert. Wir können die Software einfach nicht
kompilieren. Aus diesem
Grund müssen
wir diese Methode definieren. Unser Freund Randy, der
seine Definition für seinen Hamster vergessen hat , der
Hamstergeräusche macht Nun, die Software kann
physisch nicht
kompiliert werden , es sei denn, unser Teamkollege denkt daran, diese Methoden zu überschreiben. Das ist eine sehr gute Verwendung einer abstrakten
Methode. Wir können das für
all diese Methoden tun. Sagen Sie zum
Beispiel Name. Dafür können wir eine
Vorlage definieren. Sie fragen sich vielleicht, welchen Sinn es hat, überhaupt eine Methode
zu haben? Warum dann zum Beispiel
überhaupt sagen, gut altern? Das liegt daran, dass all unsere
Kinderklassen wie Katze und Hund hier immer noch
sagen wir, Alter gebrauchen können. Zum Beispiel können wir in diesen Methoden sagen,
Alter aufrufen , wir können sie aus jeder
untergeordneten Klasse dieser Methode verwenden. Diese Methoden sind immer noch nützlich. Das ist also eine Standardmethode, aber das ist eine abstrakte Methode. Bei den abstrakten Methoden zwingen
wir im Grunde alle Tierklassen, etwas
zu implementieren. eine Definition,
eine Funktion zu geben , genau das ist
eine abstrakte Methode. Sie zwingt alle untergeordneten Klassen , eine
Definition für sie zu implementieren. Wir können jedoch immer noch normale Methoden verwenden, wie
zum Beispiel das Alter. Wir können immer noch
virtuelle Methoden verwenden und Hund und Katze
die virtuellen Methoden überschreiben lassen. Diese sind völlig in Ordnung, aber das ist der
Sinn der Zusammenfassung. Verwendung abstrakter Klassen hier,
wie bei Animal,
erzwingt also nicht nur die Abstraktion, über
die wir zuvor mit
Zugriffsmodifikatoren gesprochen haben, sondern auch den Polymorphismus, bei dem wir unsere eigene Funktionsdose für diese Methoden definieren können Die Verwendung abstrakter Klassen hier,
wie bei Animal,
erzwingt also nicht nur die Abstraktion, über
die wir zuvor mit
Zugriffsmodifikatoren gesprochen haben,
sondern auch den Polymorphismus,
bei dem wir unsere eigene Funktionsdose für diese Methoden definieren können
. Nicht nur das, abstrakte Klassen können
auch erzwingen, dass abstrakte Klassen können
auch erzwingen jede untergeordnete Klasse, die von
animal erbt , diesen Methoden eine gewisse Funktionalität
verleiht Betrachte es als eine Blaupause oder einen Vertrag oder
etwas Ähnliches jede untergeordnete Klasse, die von
animal erbt, diesen Methoden eine gewisse Funktionalität
verleiht.
Betrachte es als eine Blaupause oder einen Vertrag oder
etwas Ähnliches. Ich weiß, dass dieses Tutorial viel zu verarbeiten sein
mag,
aber Sie können es gerne immer wieder abspielen,
bis Sie
es verstehen aber Sie können es gerne immer wieder abspielen,
bis Sie es Aber das ist das generische
Prinzip hinter abstrakten Klassen und
abstrakten Methoden im Shop
48. 9-11. Das Keyword: Ich werde über
dieses Schlüsselwort in C Sharp sprechen, es sieht einfach so aus. Was das ist, es ist im Grunde eine Abkürzung für eine
Instanz einer Klasse. Hier haben wir eine Klasse namens Dog, und ich erstelle eine Instanz. Dies kann eine Abkürzung
für diese Instanz hier sein. Wenn ich mir meine Hundeklasse hier ansehe, gibt es eine Methode
namens Make Noise. Wenn wir diese Methode aufrufen, schreiben wir
einfach Bark Woof in
das Konsolenfenster. Wenn wir uns das ansehen, rufen
wir jetzt Make Noise an. Wenn ich das Programm starte,
können Sie sehen, dass es nicht viel tut. Wenn ich in diese Hundeklasse gehe, kann
ich auf diese
aktuelle Instanz verweisen , wenn diese Methode aufgerufen
wird. Ich gehe zum Beispiel hier rein Wenn ich das eintippe, kann
ich mich auf
alles beziehen , was mit
dieser aktuellen Instanz zu tun hat, die hier erstellt
wird. Schauen wir uns ein
Beispiel dafür an, nur damit ich es Ihnen beweisen kann. Ich habe eine Klasse
namens Helper erstellt. Jetzt macht Helper nicht viel. Es gibt eine Methode
namens Make More Noise. Es benötigt einen Parameter, nämlich den Typ Hund, und es gibt die
Instanz des Hundes. Dies wird als Parameter
an diese Methode übergeben. Wir schreiben gerade eine Zeile, ich mache mehr
Lärm wegen des Hundenamens. Wenn ich hier in meine Hundeklasse gehe, werde
ich
eine neue Instanz
von Helper erstellen , damit ich die Klasse
benutzen kann. Dann werde ich
Hilfe benutzen, mehr Lärm machen. Ich möchte
einen Fall von Hund weitergeben. Was ich tun kann, ist das
Schlüsselwort this einzugeben, weil es
die Instanz darstellt , die ich hier erstellt habe. Wenn wir die Methode
für diese Instanz aufrufen. Stellen Sie sich vor, Sie
erinnern sich hier daran. Nun, das ist
genau dieser Fall. Stellen Sie sich vor, das wäre das. Wenn wir nun Helper aufrufen, rufen
wir die
Methode auf, machen mehr Lärm. Diese Instanz wird übergeben
. Es hat einen langen Weg zurückgelegt. Jetzt wiederholen wir nur
den Namen des Hundes,
der zu
dieser aktuellen Instanz gehört Wenn ich das Programm jetzt starte, kannst
du Barkworfi'k sehen. Mehr Lärm Was? Es ist leer, weil wir dem Hund keinen Namen
gegeben haben. Geben wir dem Hund einen Namen. Also, Hundename. Nennen wir ihn Rocky. Warum nicht Jetzt hat der Hund einen
Namen. Lass es uns noch einmal ausführen. Jetzt mache ich mehr
Lärm für Rocky. Sie können sehen, das ist die
Stärke des Schlüsselworts, das. Es benötigt die aktuelle Instanz, es ist im Grunde eine
Abkürzung dafür. Stellen Sie sich vor, das wäre eine Abkürzung
für die aktuelle Instanz. Und wir können damit machen, was
wir wollen. Wir können auf Eigenschaften
zugreifen, auf alle privaten Felder oder sie sogar als Parameter an verschiedene
Methoden übergeben. Das ist die Stärke
dieses Keywords im Shop. Eine andere Sache, die wir mit
diesem Schlüsselwort in C Sharp machen können. Hier ist ein gutes Beispiel. Ich sehe, dass Leute das
oft tun, wenn wir
einen Konstruktor für eine
Klasse wie Animal haben , zwei Parameter berücksichtigt, zum Beispiel Name und Alter In unserem Konstruktor wollen wir unser Objekt
konstruieren. Was wir tun, wir setzen unseren lokalen Feldnamen auf
den Parameter, wie folgt Dann setzen wir auch das Alter auf den Parameter
, einfach so. Jetzt haben wir das getan.
Wir können
dieses Schlüsselwort tatsächlich verwenden , um
diese Namensinstanz zu unterscheiden. Dies ist der Parameter aus
dieser Namensinstanz. Dies ist das private Feld. Was wir tun können, um es
offensichtlicher zu machen, ist Folgendes zu sagen. Nun, dieser Name
bezieht sich auf diese, weil dies die aktuelle
Instanz dieser Klasse ist, sie wird sich auf
diese beziehen. Das Gleiche gilt für das Alter. Das bezieht sich auf
die Instanz, die hier ist. Der Name bezieht sich hier jedoch auf diese Instanz, da sie sich nicht
in der aktuellen Instanz befindet. Es wird
als Parameter übergeben. Sie werden das oft sehen, wenn Sie Konstruktoren
einrichten, und es unterscheidet nur die Namen, sodass es
keine Mehrdeutigkeit gibt Es ist eindeutig offensichtlich,
was vor sich geht. Die aktuelle Instanz hier
entspricht dem Parameter. Sie werden das
bei Ihren zukünftigen Bemühungen ziemlich oft sehen.
49. 9-12. Das Basis-Keyword und die Basis-Klassenkonstrutoren: Das Basisschlüsselwort im Shop. Was ist das Basis-Keyword? Jetzt würden Sie das
Basisschlüsselwort verwenden, wenn Sie versuchen von einer untergeordneten
Klasse wie Dog aus
darauf zuzugreifen. Hier ist dies eine untergeordnete Klasse, wir wollen auf alles
in der Basisklasse zugreifen, daher das Basisschlüsselwort. Betrachten Sie es als eine
Abkürzung für den Zugriff auf Methoden, Eigenschaften und
ähnliches. Hier habe ich zum Beispiel eine
Basistierklasse, die ein paar private
Felder und einige Methoden
hat. Zum Beispiel diese Methode hier, sie heißt Tiermethode, sie ist öffentlich und Teil
der Tierklasse. Was ich von
der Kinderklasse Hund aus machen kann, ich kann hier reinkommen und Base
sagen und dann kann ich Tiermethode
zugreifen, weil in
diesem Fall eine
Kinderklasse ist. Base ist optional, aber Sie
können sehen, wie es funktioniert. Es sorgt für ein bisschen Klarheit. Was ich hier habe, ich habe zum Beispiel eine Methode
namens Info, die nur auf dem Bildschirm
ausgibt einige Informationen über
diesen aktuellen Hund auf dem Bildschirm
ausgibt. Wenn ich hierher gehe, habe ich hier
ein neues Objekt erstellt ,
eine Hundeinstanz. Ich habe ihm einen Namen, ein Alter und eine Rasse gegeben. Und dann gebe ich die Informationen hier einfach
aus. Wenn wir das Programm ausführen, können
wir also einige
Informationen über den Hund sehen Was Sie häufig sehen werden, ist nur ein bisschen
mehr Klarheit, da Name und Alter hier beide
in der Basisklasse Tier definiert sind . Sie können also den Namen und das
Alter sehen , das sorgt für mehr Klarheit. Wenn Sie sich den Code ansehen, können
Sie schnell erkennen, oh okay, sind Mitglieder der
übergeordneten Klasse, um dort nachzuschauen. Allerdings ist Breed ein
Mitglied dieser Klasse, also nicht
das Basisschlüsselwort,
aber du kannst ganz einfach erkennen, dass du weißt, wo diese hingehören, wenn du dir nur
dieses Schlüsselwort ansiehst. Aber das ist nicht das
Hauptmerkmal der Basisklasse. Worüber ich jetzt
sprechen möchte, ist, ob Sie in der Elternklasse
zum Beispiel
ein Tier haben . Wenn ich einen Konstruktor
in Animal This einrichte, können
Sie sehen, dass es damit ein kleines
Problem gibt Wenn ich jetzt versuche, das Programm
auszuführen, wird
es mich nicht zulassen.
Wenn ich zu meiner untergeordneten Klasse übergehe,
zu einer der untergeordneten Klassen, dieser Fehler aufgetreten Diese kleine rote Linie. Wenn ich mit der Maus drüber
fahre, erscheint hier eine etwas kryptische
Fehlermeldung Jetzt werden
Konstruktoren standardmäßig nicht
vererbt, weil sie nicht
wirklich Mitglieder einer Klasse sind Aber jetzt habe ich hier einen
Konstruktor in Animal definiert. Jetzt hat es ein Problem. Ich kann
meine Software nicht einmal kompilieren. Was wir hier
tun werden, ist hier
einen Konstruktor in Dog zu definieren . Also, wenn ich hier
mein Hundeobjekt erstelle, muss
ich nicht
all diese Eigenschaften einstellen Ich kann
sie
hier einfach in Parameter eingeben , wenn ich
unsere neue Instanz erstelle. Schauen wir uns an,
wie wir das machen können. Wenn wir ein Hundeobjekt erstellen, möchte
ich einen Namen angeben
, der in der Elternklasse enthalten ist, ein Alter, das auch in
der Elternklasse enthalten ist ,
und auch eine Rasse. Ich will das, da
alle Parameter und Rasse Teil der
Hundeklasse ist, nicht der Basisklasse. Wenn ich hier zur
Hundeklasse übergehe,
der Kinderklasse, fange ich an, einen Konstruktor
zu erstellen Ich möchte
den Namen des Hundes, das Alter
des Hundes
und auch die Rasse angeben Es sieht ungefähr so aus. Jetzt gibt es hier eine Abkürzung. Was wir hier tun können, ist
Name und Alter an die Basisklasse zu übergeben . Das machen wir so, dass
wir hinter
dem Konstruktor hier einen Doppelpunkt und das Schlüsselwort base
setzen Dann öffnen und schließen Sie
hier Klammern. Das ruft so ziemlich den
Konstruktor der Basisklasse auf. Unser Konstruktor verwendet hier zwei
Parameter. Base
ist in diesem Fall eine Abkürzung für den Konstruktor
der übergeordneten Klasse Der Konstruktor akzeptiert zwei
Argumente. Wenn wir hierher zurückkehren, nimmt
es den Namen und das Alter an Jetzt haben wir es hier mit
diesen beiden Parametern zu tun. Sie werden in
die Basisklasse geworfen und der
Konstruktor wird aufgerufen Dann müssen wir nur noch etwas mit
der Rasse
machen , das stellen wir hier Jetzt können wir hier
unsere Parameter einrichten , wenn wir die neue Instanz
erstellen. Jetzt brauchen wir nichts davon. Im Grunde wird das
genau das Gleiche tun ,
wenn ich das Programm starte. Jetzt können Sie sehen, dass es
alle Informationen ausgibt. Noch einmal, wie
funktioniert das? Wir erstellen eine neue
Instanz der Hundeklasse. Wir rufen den
Dog-Konstruktor auf
, der drei Parameter aufnimmt Hier ist unser Hundekonstruktor. Ja, es werden
drei Parameter berücksichtigt. Sobald der Konstruktor aufgerufen wurde, nimmt
er diese beiden Parameter auf
und überträgt sie in die Basisklasse Oben in der Basisklasse können
Sie sehen, dass es
zwei Parameter gibt.
Hier ist er, der
Konstruktor wird mit zwei Parametern aufgerufen Wir haben nur einen Konstruktor.
Er hat zwei Parameter, dann wird dieser aufgerufen Dadurch
werden hier unsere Eigenschaften, Name und Alter, festgelegt, wodurch anschließend
unsere privaten Felder durch Getter und Setter Sobald der Konstruktor konstruiert
hat geht
unser Animal-Object-Flow wieder raus und dann wird der Rest des
Dog-Konstruktors Das bestimmt nur das
hiesige Feld, hier
brüten, um zu brüten Das ist im Grunde so, wie es im Hintergrund
funktioniert. Es ruft nur den
Basisklassenkonstruktor auf. Schreiben Sie hier, Sie
fragen sich vielleicht , warum wir das nicht
einfach entfernen können? Und ich mache Basisname gleich Name und dann
zum Beispiel Alter Nein, es wird nicht funktionieren weil diese
Terminologie hier oben, die Doppelpunktbasis,
tatsächlich
den Konstruktor der
übergeordneten Klasse selbst aufruft den Konstruktor der
übergeordneten Klasse Es ist also erforderlich und dann löst
sich dieser Fehler ohne das von selbst Und selbst wenn Sie
diese Basen dort einfügen, wird
dieser Fehler immer noch hier ausgegeben, weil der Konstruktor der übergeordneten Klasse nie erstellt
wird Es erzeugt also nie
dieses Tierobjekt, weil
es die übergeordnete Klasse ist Die Kinderklasse Hund
hängt davon ab. Deshalb ist es hier erforderlich. Und das ist die Stärke
des Basis-Keywords im Shop.
50. 9-13. Schnittstellen: Schnittstellen im Shop. Schnittstellen sind eine weitere Möglichkeit, Abstraktion im Geschäft
zu erreichen Wir haben bereits ein wenig über
abstrakte Klassen gesprochen. Abstraktion ist ein wichtiges
objektorientiertes Prinzip, bei dem lediglich die
internen Details versteckt und nur
die Funktionalität
angezeigt werden Schauen wir uns die Benutzeroberflächen
im Shop als kleine Auffrischung Ich beziehe mich hier nur auf
dieses Projekt, bei dem wir einen abstrakten
Tierkurs
gemacht haben hier nur auf
dieses Projekt, bei dem wir einen abstrakten
Tierkurs
gemacht Hier ist unsere abstrakte
Tierklasse. Wir haben hier einige private Felder und öffentliche Methoden und auch
einige öffentliche Immobilien. Ich habe hier eine abstrakte Methode, weil die Hundeklasse hier von der
abstrakten Klasse Tier erbt, sie muss
diese abstrakte Methode überschreiben Sie ist gezwungen, das zu tun. Und das ist der Sinn abstrakter Klassen
durch Polymorphismus Wir überschreiben diese
Methode, machen Lärm. Und wir geben nur Wuff,
Wuff für unseren Hundeunterricht aus Wenn wir ein neues
Hundeobjekt erstellen und die Methode ausführen,
machen wir Lärm, wir
bekommen nur wuff, wuff. Im Prinzip ist das dort die
abstrakte Klasse. Wir sind gezwungen,
diese abstrakten Methoden zu überschreiben. Schauen wir uns hier an, wie wir eine Tierschnittstelle
erstellen können und wie
sich Schnittstellen
auch von abstrakten
Klassen unterscheiden. Schnittstellen im Shop, ziemlich
ähnlich wie abstrakte Klassen. Was ich tun werde, ist
eine brandneue Oberfläche im Shop zu erstellen . Dann werde ich
Ihnen einige Unterschiede
zwischen abstrakten
Klassen und Schnittstellen zeigen . Dann
wird unsere Hundeklasse hier unsere
brandneue Oberfläche verwenden. Das wird gleich alles
klar werden. Wenn wir hier auf der
rechten Seite zu unserem Projekt gehen, klicken wir mit der
rechten Maustaste, gehen wir zu Hinzufügen
und dann zum Kurs Aus dem Menü hier wählen wir
einfach Interface. Jetzt können wir der Schnittstelle einen
beliebigen Namen geben , aber ich möchte
eine Tierschnittstelle erstellen. Bei der Erstellung von
Schnittstellen empfiehlt es sich immer vorher ein großes
I zu verwenden. Das liegt daran, dass wenn
Sie Schnittstellen hinzufügen oder zumindest ein
wirklich großes Projekt
mit vielleicht Dutzenden oder
Hunderten von Schnittstellen haben , Sie diese
von normalen Klassen unterscheiden können. Hier haben wir Tiere und
man kann Tiere sehen. Das ist eindeutig ein Interface, nur weil wir es so
benannt haben. Das ist einfach eine gute Übung. Der Unterschied zwischen einer
Schnittstelle wie dieser hier und einer Klasse, dieser hier. Hier ist nur der Unterschied zwischen dem Schlüsselwort,
das
darin besteht, dass wir ein
Klassenschlüsselwort für eine Klasse und das
Interface-Schlüsselwort für eine Schnittstelle haben. So ziemlich alles andere
hier ist dasselbe. Das ist der einzige subtile
Unterschied hier. Jetzt können
Sie Schnittstellen in C Sharp als so
gut wie zu 100%
völlig abstrakt betrachten . Was bedeutet das?
Nun, wenn Sie sich das Tutorial zur abstrakten Klasse
wie dieses hier angesehen haben, haben
wir hier einige abstrakte
Methoden. Wenn wir eine abstrakte Methode haben, definieren
wir dafür keinen Körper. Weil unsere Klassen diese abstrakte Klasse
erben, definieren
sie ihre eigenen
Methoden für sie, wie zum Beispiel die Hundeklasse und die
Katzenklasse Sie stellen Code zur Verfügung. Wenn wir zu unserer
abstrakten Klasse gehen, hat
sie zum Beispiel keinen Hauptteil. Eine abstrakte
Klasse kann jedoch
ihre eigenen Methoden definieren , z.
B. den Namen, das Alter. Sie können auch verschiedene
andere Dinge tun. Dies gilt nicht für
Schnittstellen. Betrachten Sie eine Schnittstelle als eine rein abstrakte Klasse, in der
Sie keine Körper definieren. Es gibt eine kleine Ausnahme für diese Regel, die sich auf
private Mitglieder bezieht, aber darauf werde ich
vielleicht später oder zu einem anderen
Zeitpunkt eingehen . Betrachte Interfaces als
eine rein abstrakte Klasse. Wir definieren für unsere Methoden keine Körper in
Schnittstellen. Wenn ich hier zu meiner
Hundeklasse komme, die von
dieser abstrakten Tierklasse erbt, können
Sie sehen, dass ich
eine Methode, die Geräusche macht, überschreibe und ihr
dann meine
eigene Funktionalität gebe Ich möchte dasselbe in meiner
Oberfläche tun. In meiner Schnittstelle möchte ich eine Methode
namens make noise
definieren, die abstrakt sein wird ,
weil das der
Zweck der Schnittstelle ist. Wenn ich eine neue Methode namens
make noise definiere, wie du sagst, weil sie abstrakt ist, habe ich hier
keinen Körper. Und das ist standardmäßig öffentlich. Der Zugriffsmodifikator
ist standardmäßig öffentlich. Und das liegt nur an der Gestaltung von Schnittstellen, weil wir wollen, dass jeder
diese Schnittstellen benutzt Also haben wir einfach so
unsere allererste Methode
in unserer Schnittstelle definiert . Sehr einfach, nicht wahr? Weil es standardmäßig öffentlich und
abstrakt ist. Wir benötigen keine
Zugriffsmodifizierer wie public. Es ist optional und wir
benötigen das abstrakte Schlüsselwort nicht. So
definieren Sie beispielsweise eine öffentliche abstrakte Methode in
C Sharp für eine Schnittstelle. Jetzt gehe ich rüber zu meinem Hundeunterricht. Im Moment erbt es von dieser abstrakten Klasse und
mir geht es gut. Ich möchte
die Schnittstelle implementieren. Also werde ich einfach ein I
voranstellen. Also verwendet es jetzt unsere Schnittstelle statt unserer abstrakten Klasse. Nun, wie können wir das umschreiben
, damit es mit
unserer Schnittstelle hier funktioniert? Nun, wenn wir von
einer abstrakten Klasse erben und wir eine abstrakte Methode
haben, wie wir bereits erwähnt haben
, verwenden
wir hier das
Schlüsselwort override Aber bei Schnittstellen
verwenden wir das Schlüsselwort override nicht, es wird überhaupt nicht benötigt Das ist völlig ausreichend. Zum Beispiel eine andere Sache. Wenn wir uns dafür entscheiden, keine Methode für unsere Schnittstelle zu definieren und es einfach so zu belassen. Wenn wir hier mit der Maus drüber fahren, heißt das, dass Dog
das
Interface Member Make Noise nicht implementiert ,
genau wie abstrakte Klassen Es zwingt uns,
eine Implementierung für
diese Methode bereitzustellen , damit es uns dazu
zwingen kann Wenn Sie zum Beispiel große Teams
haben, ist das sehr praktisch, weil dann alle Ihre Klassen
einigermaßen standardisiert sind. Und dann werdet ihr hier alle
diese Methode außer Kraft setzen , genau wie wir es
bereits in abstrakten Klassen besprochen haben. Jetzt habe ich diesen Hundekurs hier. Es implementiert die
Make Noise-Methode, die wir in unserer Oberfläche
definiert haben ,
und definiert durch Polymorphismus seine
eigene Funktionalität Wenn ich
hier zu dem Programm übergehe, in dem wir
ein brandneues Hundeobjekt erstellen ,
und wir
die Methode make noise aufrufen die Methode make noise die
über die Schnittstelle verfügbar ist, erhalten
wir
genau das gleiche Ergebnis Lassen Sie mich also auf
einige Gemeinsamkeiten und
auch einige Unterschiede
zwischen abstrakten Klassen in
C-Shop und auch zwischen
Schnittstellen eingehen einige Gemeinsamkeiten und
auch einige Unterschiede zwischen abstrakten Klassen in . Denn oberflächlich betrachtet erreichen
sie vielleicht
schon einmal etwas
sehr Ähnliches, erreichen
sie vielleicht
schon einmal etwas
sehr Ähnliches wenn wir versuchen,
eine Instanz einer
abstrakten Klasse zu erstellen . Es würde uns nicht lassen.
Es ist nicht möglich, und das liegt am Design. Selbst wenn ich zum Beispiel versuche, dasselbe
mit einer Oberfläche zu
tun , wird
es mir nicht möglich sein selbst Visual Studio
bietet dafür keine Autocomplete-Funktion an Wenn ich hier mit der Maus über diesen neuen
Instanzversuch fahre, heißt
das, dass er keine Instanz
des abstrakten Typs
Interface Animal
erstellen kann des abstrakten Typs
Interface Es ist also nicht möglich. In einer abstrakten Klasse können
wir einen Konstruktor haben, aber er wird nur
von den untergeordneten Klassen aufgerufen, nicht irgendwo außerhalb dieser Vererbungskette
mit Schnittstellen Sie können keinen Konstruktor haben
, weil Sie
unter keinen Umständen eine Schnittstelle
konstruieren würden unter keinen Umständen eine Schnittstelle
konstruieren Die Schnittstelle
verhält sich einfach wie ein Vertrag, sodass alles, was
die Schnittstelle implementiert die verfügbaren Methoden
überschreiben
kann Keine Konstruktoren in Schnittstellen. Wenn wir das tun wollen, dann ist
der Zweck, dass wir
eine Klasse haben und dann eine Schnittstelle
implementieren,
oder wir erben von einer abstrakten
Klasse und definieren dann unsere eigenen Überschreibungen für
diese Aus diesem
Grund erstellen wir beispielsweise keine neuen Instanzen abstrakter
Klassen und Schnittstellen und
benötigen daher keinen Konstruktor Etwas anderes, das wir auch
angesprochen haben, war die Tatsache , dass abstrakte Klassen genau hier Felder
haben können, die man
in einer Schnittstelle nicht haben kann Auch hier können wir in Methoden Körper in
abstrakten Klassen
definieren. Bei Schnittstellen
können wir das jedoch nicht, weil es
rein abstrakt ist. Dies sind hier einige Unterschiede. Möglicherweise stellen Sie sich
die folgende Frage. Warum sollte ich überhaupt
eine Schnittstelle verwenden , wenn ich in
einer abstrakten Klasse zum Beispiel Felder verwenden kann, ich kann
Methodenkörper definieren, wenn ich will. Warum sollte ich eine Schnittstelle verwenden? Was ist der Sinn? Es
scheint begrenzter zu sein, ja. Vielleicht ist es
zum Beispiel zu 100% abstrakt, aber warum
sollte ich eines verwenden? Nun, Schnittstellen
unterstützen zum Beispiel die Idee der Mehrfachvererbung in
C Sharp. Wenn ich ein
Tierinterface wie Animal
habe, kann ich zum Beispiel ein Interface
namens Maybe Carnivore
erstellen namens Maybe Carnivore Dann kann unsere Hundeklasse
tatsächlich von Tier
und Ikonivorre oder vielleicht etwas
anderem wie Pflanzenfressern implementieren und Ikonivorre oder vielleicht etwas
anderem wie Pflanzenfressern Es kann also von
mehreren Klassen hier oben aus implementiert werden,
mehrere Schnittstellen, mehrere Schnittstellen, und das kann man mit abstrakten Klassen nicht machen Das ist also eine
der Hauptstärken von Schnittstellen in C Sharp. Schauen wir uns jetzt
ein Beispiel an. Wenn ich hierher komme, klicke
ich mit der rechten Maustaste auf das Projekt und gehe zu Klassenschnittstelle hinzufügen. Ich werde einfach Iconivorre
kreieren,
weil Hunde Fleischfresser weil Hunde Es ist auch ein Tier. Vielleicht gibt es eine bessere
Art, das darzustellen, aber lassen Sie uns einfach dieses Beispiel
durchgehen. Sie können also sehen, was das für
einen Sinn hat. Bei Fleischfressern werde ich einfach eine Methode definieren,
die
vielleicht Fleisch essen heißt , weil
alle Fleischfresser Einfach so. Auch hier ist es standardmäßig
abstrakt und öffentlich. Das ist alles, was wir in diesem Fall brauchen. Wenn ich nun
mehrere Schnittstellen
erben oder von ihnen implementieren möchte , trenne ich wie zuvor
die Klasse vom Doppelpunkt Und dann füge ich die Klasse oder Schnittstelle ein, die ich
implementieren oder von der ich erben möchte Aber wenn ich
von mehreren Schnittstellen erben möchte, setze
ich hier einfach ein Komma Dann kann ich zum Beispiel das nächste
Schnittstellen-Icon einfügen. Jetzt können Sie sehen, dass es eine
rote Linie gibt, weil sie unser neues Mitglied
Eat Meat nicht implementiert, was wahr ist Wir haben dafür keine
Methode definiert. Wenn ich hierher gehe und Fleisch essen
eintippe, implementiere ich jetzt diese
Methode hier von iconivor Ich implementiere diese
Methode jetzt von Animal aus. Jeder ist glücklich,
es gibt keine roten Linien, alles ist zufrieden. Ich kann dann meine
eigene Definition festlegen, so
etwas wie Fleisch essen. Wenn ich dann hier zu
meiner Bewerbung komme, gebe ich zum Beispiel
Fleisch essen ein. Nun, das ist die
Methode, die wir über unser
brandneues Schnittstellensymbol
implementieren. Oder Fleisch essen. Oh, lassen Sie uns das
loswerden, weil wir keine neue Instanz
einer Schnittstelle
erstellen können . Jetzt erstelle ich
ein neues Hundeobjekt und esse jetzt etwas Fleisch. Und das ist ein Mitglied
unserer neuen Oberfläche. Sie können hier sehen, dass dies
ein sehr schnelles Beispiel für
Mehrfachvererbung in C Sharp ist. Und das wird durch die
Verwendung von Schnittstellen erreicht, was mit abstrakten Klassen
nicht möglich ist. Das sind die Vorteile von beiden. Sie können sehen, dass
wir durch die
Verwendung von Schnittstellen in C Sharp und auch durch
abstrakte Klassen C Sharp und auch durch
abstrakte Klassen Abstraktion erreichen können, was ein wichtiges Prinzip der objektorientierten
Programmierung ist Testen Sie jetzt Ihr Wissen über
Vererbung oder fragen Sie
vielleicht einfach ab, ob Sie dieses
Thema vollständig verstehen Wenn ich zum Beispiel hier zu
meiner Hauptanwendung übergehe, kann
ich hier eine neue Methode erstellen. Ich nenne es
zum Beispiel Make Noise. Es wird keinen Wert
zurückgeben,
es wird nur ein Geräusch über
unsere Tiere im
Konsolenfenster
machen . Und
hier wird ein Parameter benötigt , weil der Hund
unsere Schnittstelle Tier implementiert , weil wir wissen, dass ein Hund ein Tier ist, wenn wir über
Erbschaft sprechen , bevor ein Hund
Befriedigungsmittel eine Beziehung ist Ebenso unsere Katzenklasse. Eine Katze ist ein Tier, ein Hamster ist ein Tier Dann können wir einfach
hierher gehen und Tier
als Parameter eingeben, weil unser Hund dieses Interface hier
implementiert Dann können wir Dinge von hier aus erledigen. Wir können sagen, mach Lärm. Was wir hier tun können, wir
können ein Hundeobjekt erstellen. Dann können wir unseren Hund an
diese Methode
namens Make Noise weitergeben . Dann, weil der
Hund ein Tier ist, wird
das funktionieren, kein Problem. Es wird hier
die Methode Make Noise für das Objekt aufrufen ,
bei dem es sich um ein Tier handelt. Es ist ein Tier. Wenn ich ein Katzenobjekt erstelle, kann
ich dieselbe Methode verwenden da Cat Tiere
implementieren würde. In diesem Fall könnte ich
eine Dolphin-Klasse erstellen ,
solange sie Animal implementiert. Auch hier kann ich diese
Methode aufrufen, kein Problem. Sie können sehen, dass dies die
Macht der Vererbung ist, aber Sie können auch Dinge
wie Schnittstellen verwenden. Das funktioniert auch mit
abstrakten Klassen, genau wie zuvor, kein Problem. Solange meine Hundeklasse von der
abstrakten Klasse Tier
erbt Sie können jetzt sehen, ob
ich dieses Programm starte, Sie können sehen, dass es jetzt wuff, wuff
sagt Ähnlich verhält
es sich, wenn ich eine
Katzenklasse wie diese hier habe, implementiert sie aus Animal die
Methode make noise und überschreibt hier
ihre eigene Logik, nämlich O. Dann gehe ich zum Programm, erstelle ein neues Katzenobjekt, dann möchte ich mit der Katze
Krach machen Und solange es unsere Schnittstelle
implementiert, wird es
funktionieren, kein Problem Sie können sehen, welche
Macht Vererbung und warum wir Schnittstellen verwenden. Wir müssen nur die Schnittstelle an
die Software
weitergeben ,
zum Beispiel als Methodenparameter oder
sogar als Rückgabe von einer Methode oder so ziemlich allem. Auch hier gilt: Wenn ich das Programm starte, können
Sie durch den
Polymorphismus erkennen, dass
wir die Methode make
noise für Hund und Katze außer Kraft setzen,
aber auch Schnittstellen
verwenden, aber auch Schnittstellen
verwenden um das Objekt an das Programm weiterzugeben Sie können sehen, dass es ziemlich mächtig ist und die Möglichkeiten auch endlos
sind Sie können hier sehen, ob ich
diese Schnittstelle zu unserer
abstrakten Klasse ändere .
Gehen Sie zur Klasse und stellen Sie
sicher, Gehen Sie zur Klasse und stellen Sie dass sie
die abstrakte Klasse implementiert. Bei abstrakten Klassen verwenden wir das
Schlüsselwort Override, weil das
der Unterschied zwischen
diesen Klassen und Interfaces ist. Das spiegelt sich auch
in der Hundeklasse wider. Und dann geh zurück zu
unserem Hauptprogramm hier. Dann führe das Programm aus. Sie können sehen, dass wir
eine abstrakte Klasse weitergegeben haben und sie funktioniert
genauso wie eine Schnittstelle. Aber es gibt
subtile Unterschiede, wie wir bereits besprochen haben, zwischen Schnittstellen
und abstrakten Klassen. Dies ist jedoch ein
Beispiel sowohl Vergleich als auch für
die Vorteile der
Verwendung von Schnittstellen zur Erfüllung Mehrfachvererbung in C Sharp. Ich hoffe, dieses Tutorial hat dir geholfen und danke fürs Zuschauen.
51. 9-14. O-O-Zusammenfassung: Wir haben also gerade einige Tutorials
zur objektorientierten
Programmierung fertiggestellt zur objektorientierten
Programmierung Jetzt haben wir so ziemlich
jedes Prinzip des
Programmierparadigmas
durchgesehen jedes Prinzip des
Programmierparadigmas Und jetzt schließen
wir einfach den Kreis und
reflektieren, was wir gelernt haben, und einige Stichwörter
und ähnliches fallen lassen Also nochmal, wie ich zu
Beginn unserer 00-Reise erwähnt habe , C sharp ist eine objektorientierte
Programmiersprache. Und die Verwendung von 00 hilft Ihnen
wirklich dabei, Ihre Projekte zu
strukturieren. Wenn Ihre Projekte sehr
umfangreich werden, werden
sie
viel einfacher zu verwalten sein. werden Sie in
Zukunft viel Wert auf Wiederverwendbarkeit von Vielleicht werden Sie in
Zukunft viel Wert auf Wiederverwendbarkeit von
Code legen Wenn Sie diese Reise fortsetzen, werden
Sie
mit anderen Menschen zusammenarbeiten Vielleicht in einem Unternehmen
, das sich auch mit
Programmieren auskennt . Sie
werden alle dieselben Techniken
zum Schreiben von Software kennen und bereits
verstehen. Sie werden also sehr
schnell durchstarten. Lassen Sie uns einige
der Begriffe noch einmal durchgehen ,
damit Sie sie vollständig verstehen. Und dann werden wir
zu etwas anderem übergehen . Objektorientierte Programmierung. Auch hier ist es ein Paradigma
, also eine Art, etwas
zu tun Wir haben über Unterricht gesprochen. Jetzt modellieren Klassen Objekte aus der
realen Welt. Wenn Sie also eine
Software über eine Bibliothek haben, dann könnte ein Kurs ein Buch sein. Da es sich bei einem Buch um ein Objekt aus der
realen Welt handelt, sollte
Ihr Kurs sehr zusammenhängend
sein Das bedeutet, dass es in dem Kurs
über das Buch nur um das Buch gehen
sollte Es sollte nicht darum gehen, dass der
Benutzer das Buch liest. Wenn Sie also eine
Buchklasse haben, sollten sich
alle Methoden, alle Eigenschaften
immer auf das Buch beziehen. Das ist eine sehr gute Praxis, und Ihre Kurse sollten lose miteinander verknüpft
sein Das bedeutet, dass es in Ihrem Buchunterricht um das Buch gehen
sollte. In Ihrer Benutzerklasse
sollte es um den Benutzer gehen. Und sie sollten nicht
wirklich viel mit anderen Objekten
gemeinsam haben . Jetzt erstellt Objects eine
neue Instanz einer Klasse. Eine Klasse ist so etwas wie die Vorlage mit allen
Methoden und Eigenschaften. Und wenn wir
eine neue Instanz davon erstellen wollen, können
Sie eine oder
Tausende haben, wenn Sie möchten. Das nennt man das
Erstellen eines Objekts. Ein Objekt ist also nur eine
Instanz einer Klasse, und wenn Sie eine Instanz erstellen, wird
das als Instanziierung bezeichnet Nun, Vererbung, Vererbung
fördert die Wiederverwendung von Code, und wenn Sie Code wiederverwenden, wird er wartungsfreundlicher Wir müssen Code nicht kopieren und in jede einzelne Klasse
einfügen,
denn wenn wir
eine Klasse wie Hund haben, dann kann sie von Animal erben Wenn wir eine Klasse namens Katze haben, kann sie
wiederum
vom Tier erben Und viele dieser Klassen
werden dieselben Funktionen haben. Sie werden also viel weniger Code verwenden und
schreiben. Und wenn Sie
viel weniger Code schreiben, bedeutet
das, dass Ihr Code viel wartungsfreundlicher und einfacher zu
verwalten
sein wird einfacher zu
verwalten Nicht nur das, die Dateigröße der Software wird minimal sein Und wenn Sie auch die
Software testen, können
Sie viel
weniger Code zum Testen haben. Alles in allem
ist Vererbung also ein sehr gutes
Prinzip, das es zu praktizieren gilt. Wir haben über Polymorphismus gesprochen, dieses seltsame griechische Wort, das viele Formen oder viele Formen
bedeutet, was wir durch die Überlastung von
Methoden erreicht haben Wenn wir über Methoden sprechen, wie wir
verschiedene Parameter haben können aber denselben Methodennamen In jüngerer Zeit
haben wir aber auch über Polymorphismus mit
Methodenüberschreibung gesprochen . In einer
Basisklasse wie Animal können
wir sagen, dass wir Lärm machen Wenn wir dann
in einer Hunde-, Katzen- oder
Hamsterklasse
von dieser Klasse erben , können wir
diese Methode überschreiben und Wir können das Ergebnis sehen , wenn wir die Anwendung ausführen,
zum Beispiel wenn wir die verwenden, bellt der Hund , wenn
wir
die Methode make noise verwenden Wenn man die Katzenklasse benutzt, miaut
die Katze Wir können dieselbe Methode wiederverwenden , aber unterschiedliche
Funktionen bereitstellen Das ist Polymorphismus. Die letzten beiden Jetzt
verwirren die letzten beiden Personen die beiden , weil sie sich sehr ähnlich sind
und Hand in Hand gehen. Und das ist Verkapselungsabstraktion. Jetzt verbirgt die
Kapselung die interne Funktionalität eines Objekts Sie ermöglicht nur den Zugriff über
einen öffentlichen Funktionsumfang. Zum Beispiel, als
wir über
öffentliche und private
Zugriffsmodifikatoren gesprochen haben, weil wir
unsere sensiblen Informationen,
wie zum Beispiel unsere privaten
Felder, verbergen möchten wie zum Beispiel unsere privaten
Felder, Aber greifen Sie nur über
öffentliche Methoden auf sie zu, damit wir die Daten überprüfen und
sicherstellen können , dass niemand etwas
kaputt Solche Dinge zum Beispiel. Und auch Seeshop-Immobilien. Wenn man von Abstraktion spricht, bedeutet das, nur
wichtige Informationen anzuzeigen und die wichtigsten Details zu verbergen
. Und das haben wir mit
abstrakten Klassen
und auch mit Interfaces gemacht. Stellen Sie sich also wie bei einer Kaffeemaschine vor, wenn Sie einen Kaffee zubereiten möchten, drücken
Sie den
Kaffeebrühknopf. Wenn du ein
Auto starten willst, drehst du den Schlüssel. Sie müssen nicht
wissen, wie ein Anlasser in einem Auto funktioniert, wie ein Generator
funktioniert oder wie die Batterie aufgeladen Als Benutzer, als Entwickler müssen
Sie nur den
Schlüssel drehen, damit das Auto funktioniert Ähnlich wie bei einer
Kaffeemaschine brühen Sie einen Kaffee, Sie müssen nicht wissen,
wie die Elektronik funktioniert, wie das Wasser erhitzt wird. All das wird
dir weggenommen , es sind unnötige
Informationen Wenn Sie nur ein
Endverbraucher dieser Dinge sind, wie zum Beispiel eine Kaffeemaschine oder
der Fahrer eines Autos, müssen
Sie das einfach nicht wissen Und das ist Abstraktion. Und das sehen wir
im täglichen Leben, jeden Tag, mehrmals am Tag Und das ist der
Unterschied zwischen Verkapselung und Abstraktion Auch hier sind beide wichtige Begriffe der
objektorientierten Programmierung wichtig, aber sie gehen häufig Hand
in Hand Und manchmal kann es sich aus diesem Grund oft so
anfühlen, als ob die Grenze zwischen
Verkapselung und
Abstraktion etwas verschwommen ist Grenze zwischen
Verkapselung und
Abstraktion etwas verschwommen Verkapselung und
Abstraktion Herzlichen Glückwunsch, wir haben alle Prinzipien der
objektorientierten Programmierung
durchgesehen Prinzipien Und wenn Sie sich für
eine andere Sprache wie
C plus Plus oder Java entscheiden , können
Sie diese
Prinzipien vermitteln und
fast sofort mit der Arbeit beginnen Es ist nicht an C gebunden.
Sharp ist sehr beliebt und wird auch in
vielen Programmiersprachen verwendet.
52. 10-1. Übung - Pyramiden zeichnen: Heute werden wir
Pyramiden zeichnen und zwar in unserem
Konsolenanwendungstyp Und wir
lassen den Benutzer entscheiden wie groß
seine Pyramide sein soll Wenn der
Benutzer beispielsweise 45 eingibt, wird
hier eine Pyramide generiert. Und sie wird 45 Zeilen hoch
sein, wie Sie hier sehen können. Es sieht ziemlich
cool aus, nicht wahr? Wenn der Benutzer jedoch
beispielsweise die Zahl Fünf eingibt,
wird seine Pyramide nur
fünf Zeilen hoch sein. Das ist ein bisschen eine Übung. Es wird nicht nur Ihre C-Sharp-Programmierkenntnisse
testen, sondern auch Ihre logischen Fähigkeiten. Wie Sie ein Problem betrachten
und eine Lösung entwickeln können, indem es in
kleine Untergruppen aufteilen und dann das
Problem angehen Also werde ich
dieses Problem lösen und Ihnen zeigen, wie ich
an diese Aufgabe
herangehen würde , damit Sie sehen können, wie mein Verstand funktioniert und wie ich
dieses spezielle Problem Es ist durchaus üblich
,
solche Übungen zu sehen , wenn man
ein Vorstellungsgespräch führt. Der Interviewer
könnte Sie zum Beispiel fragen, wie Sie
ein kleines bisschen
Software entwickeln , um
eine Form oder eine Pyramide oder
etwas Ähnliches zu erzeugen eine Form oder eine Pyramide oder
etwas Ähnliches Weil jeder
Syntax und Code im Internet nachschlagen kann Syntax und Code im Internet Aber was viele
Arbeitgeber
heutzutage gerne tun, ist zu testen, wie Ihr Verstand funktioniert, zum Beispiel
logisches Denken. Sie heraus, ob Sie vor Ort und
vielleicht auch unter Druck eine Lösung finden können. Also werde ich
eine Lösung dafür entwickeln und
Ihnen Schritt für Schritt
zeigen, wie ich darüber denke, damit Sie
sehen können , wie mein Verstand funktioniert und
wie ich dieses Problem angehe. Lass uns gehen. Der erste Schritt besteht darin, das Problem zu analysieren. Wenn der Benutzer eine Zahl eingibt, bezeichnet
dies die
Höhe der Pyramide Nicht nur die Höhe
der Pyramide, sondern auch die Anzahl der
Linien, die gezeichnet werden Sie können sehen, dass es hier
fünf Linien gibt. Die Pyramide endet, wenn
es ein Pfundsymbol gibt, und die Basis der Pyramide
bedeckt hier die gesamte Linie. Aber Sie können hier sehen, dass es
die Höhe der Pyramide ist, die mit dieser Zahl bezeichnet wird Die Pyramide ist fünf Linien hoch, das ist zu beachten Das zweite, was zu beachten ist, ist, dass all diese Quadrate bevölkert
sind. Falls sie hier nicht
mit Hashes gefüllt sind, das Pfund-Symbol für
die Pyramide Dann werden sie
mit dem Hintergrund gefüllt, der durch Bindestriche gekennzeichnet ist. Hier können Sie sehen, dass die Spitze
der Pyramide
ein Pfundsymbol hat und dann auf beiden Seiten In der nächsten Zeile können Sie sehen, dass die Pyramide um zwei statt
um eins zunimmt Hier sind es jetzt drei, und dann gibt es auf jeder Seite einen
Bindestrich weniger Auch unten
wächst die Pyramide um zwei pro Zeile, und dann
schrumpft der Bindestrich Wir haben hier ein paar Regeln. Mit jeder neuen Linie wächst die
Pyramide um zwei. Und jede neue Zeile, der Bindestrich, wird auf jeder Seite
um eins geschrumpft Eine letzte
Bemerkung ist, dass in diesem Beispiel, in dem ich
eine Pyramidenhöhe von fünf habe, wir hier neun Zeichen
entlang der Breite haben, fünf unten und neun Wir haben eine Menge
Daten, mit denen wir arbeiten können. Lassen Sie uns sehen, wie wir
eine Lösung für dieses Beispiel entwickeln können. Wenn Sie unseren
Tutorials zuvor gefolgt sind, haben
Sie vielleicht das Beispiel gesehen, das wir gemacht haben, als wir einen
Würfel auf dem Bildschirm gezeichnet haben. Nun, diese Übung ist
etwas anders, sie ist etwas komplexer, aber die Prinzipien und Verfahren hinter den
Kulissen sind ziemlich ähnlich. In diesem Beispiel verwenden
wir einige Schleifen, wir verwenden vier Schleifen. Dieses Beispiel sollte
nicht anders sein. Wenn wir in unserem Kopf
sich wiederholende Daten wie diese
und solche sehen , sollten
wir denken: Okay, da muss es sich um
eine Schleife handeln. Etwas muss sich in einer
Schleife drehen und iterieren, um
diese Bindestriche hier zu erzeugen Dann brauchen wir eine weitere Schleife,
um dann diese Pfundsymbole zu generieren Und dann vielleicht eine dritte Schleife hier, um
mit den Bindestrichen Es gibt ein paar Möglichkeiten, wie wir dieses
Problem angehen können. Vielleicht könnten wir
eine Schleife haben, in der wir einfach den Charakter
gegen den Pyramidenteil austauschen. Ja, das könnte auch funktionieren. Bei der Entwicklung solcher
Lösungen. Es gibt eine ganze Reihe von
Lösungen für das Problem, aber Sie haben die Wahl. Wenn Sie diese Entscheidung treffen, möchten
Sie die einfachste und zeiteffizienteste Entscheidung treffen . Generieren Sie aber auch den Code
, der besser wartbar ist, in Zukunft von Ihnen
selbst
besser wartbar ist,
aber
von allen Teamkollegen, die Ihren Code
tatsächlich übernehmen und ihn in Zukunft entwickeln, besser wartbar Ihren Code
tatsächlich übernehmen Es gibt viele Dinge, über die man nachdenken muss. Ich denke, ich würde
dieses Problem so angehen , dass
eine Hauptschleife
entlang der Y-Achse verläuft. Wir haben eine Hauptschleife, die jede Zeile nacheinander
generiert. Dann werde
ich innerhalb dieser Schleife eine Schleife haben, die diese Bindestriche
generiert Eine zweite Schleife, die den
Pyramidenteil
generiert, und das ist Und dann eine dritte Schleife, die mit diesen Bindestrichen
weitergeht,
eine Hauptschleife, die die
Y-Achse Dann innerhalb dieser Schleife, glaube
ich, drei separate Das ist eine perfekte Lösung, um dieses Problem
anzugehen. Schauen wir uns das jetzt
an und schauen ob wir so
etwas entwickeln können. Also hier ist der Code, den
wir bisher haben, er macht überhaupt
nichts, er gibt nur einige
Nachrichten an den Benutzer heißt ihn in der Software willkommen Danke, dass du die App benutzt. Das ist es, was es tut. Und dann stellen
wir dem
Benutzer die Frage. Wir nehmen die Eingabe des Benutzers, konvertieren sie in eine Ganzzahl und speichern sie in
einer Integer-Variablen. Was ich jetzt tun möchte, ich
werde eine Methode erstellen. Denn wenn ich eine Methode erstelle, kann
ich sie von mehreren Stellen aus
mehrmals aufrufen
und dann
Pyramiden generieren, wo immer ich will Ich denke, die gesamte Logik zum
Generieren der Pyramide mit
der benutzerdefinierten Größe
sollte hier in eine Methode gehören Und dann ist es leicht für alles andere
wiederverwendbar. Ich werde
eine Methodenvorlage erstellen. Jetzt hat die Methode
keinen Rückgabetyp mehr
, weil ich nur möchte, dass die Methode die Pyramide
zeichnet. Es wird
ein Parameter erstellt ,
und das entspricht nur
der Größe der Pyramide. Da ist unsere grundlegende Methode. Als Erstes habe ich
gesagt ich eine Schleife erzeugen würde, die
jede Zeile nacheinander ausdrucken würde, und zwar
entlang der Y-Achse. Ich werde dafür
eine Schleife erstellen. Diese Schleife hier steht also für
die Höhe der Leinwand. In diesem Fall also die Höhe der
Pyramide, da die Pyramide die Oberseite der Leinwand,
auf
der wir zeichnen, und auch die Unterseite
berührt , kann man mit Sicherheit sagen, dass unabhängig von
der Zahl , die der Benutzer angibt, die volle
Höhe der Pyramide angibt, wir haben keinen Hintergrund über der Pyramide und keinen Hintergrund
unter der Pyramide. Wenn Sie die Y-Achse von einer Achse aus nehmen, die
kleiner oder gleich der
Größe der Pyramide ist, und die um eins
erhöht,
stellen Sie sicher, dass wir
die Pyramide entlang der
Y-Achse zeichnen , die nach unten verläuft. In dieser Schleife
habe ich erwähnt, dass eine
mögliche Lösung
darin besteht , drei
separate Schleifen zu haben Die erste, um die
Bindestriche auf der linken Seite zu zeichnen,
die zweite, um die Pyramide zu
zeichnen, und die dritte, um mit den Bindestrichen
auf der rechten Seite
fortzufahren Lassen Sie mich diese Loops jetzt einrichten, ohne wirklich darüber nachzudenken Zum Beispiel habe ich
bereits diese nette Vorlage. Ich habe
diese Vorlage
gerade generiert nur logisch über das Problem
nachgedacht Ich brauche eine Schleife, um nach unten zu zeichnen, um der
Größe der Pyramide zu entsprechen Dann brauche
ich in jeder Zeile etwas, das die Pyramide und den Hintergrund
auf jeder einzelnen Linie erzeugt das die Pyramide und den Hintergrund
auf jeder einzelnen Linie Ich habe
hier schon eine
nette kleine Vorlage , ohne wirklich zu viel
über das Problem nachzudenken. Wenn wir die
Bindestriche auf der linken Seite zeichnen, wollen wir nur einen Bindestrich auf dem Bildschirm
ausgeben Lass uns das jetzt machen.
In ähnlicher Weise zeichnen
wir, wenn wir die Bindestriche
auf der rechten Seite zeichnen, einen In ähnlicher Weise benötigen
wir beim
Zeichnen der Pyramide das Pfundsymbol So ziemlich das
Einzige, was wir
jetzt tun müssen , ist herauszufinden, wann
diese Schleifen enden. Als wir uns das
Beispiel zuvor angesehen haben und der Benutzer zum Beispiel die Zahl
fünf eingegeben hat, dann hatte die Pyramide
eine Breite von neun, aber eine Höhe von fünf. Die allererste Zeile der
Pyramide hatte ein Pfundsymbol, aber sie hatte vier
Bindestriche auf jeder Seite Wir müssen herausfinden, wann wir aufhören sollen,
Bindestriche zu zeichnen. Um herauszufinden, wann wir aufhören müssen, Bindestriche auf
der linken Seite zu
zeichnen, müssen
wir herausfinden, wann wir diese Vorderschleife
beenden müssen Ebenso, wie breit wir die Pyramide auf
jeder Seite zeichnen
sollten und wann wir
aufhören sollen, Bindestriche auf
der rechten Seite zu zeichnen Und wenn Sie solche
Software entwickeln, werden Sie an
manchen Tagen
ultimative Klarheit haben Das wird für Sie einfach sein, Sie geben einfach die Werte ein. Weißt du, du
hast einen schönen Tag. Aber manchmal, wenn ich einfach müde bin oder nicht in
der richtigen Einstellung oder du vielleicht ein
Anfänger bist und weißt, dass
du es irgendwie in deinem Kopf
durcharbeitest Nun, dann ist es keine Schande, so etwas wie
Microsoftic Cell oder einen
Notizblock zu
verwenden , nur um
all Ihre Zahlen aufzuzeichnen , damit Sie dann Ihren freien
Gehirnraum nutzen
können, um eine Lösung für
das Problem oder vielleicht
etwas anderes
auszuarbeiten das Problem oder vielleicht Es ist also keine Schande, Knoten
oder ähnliches zu erstellen , das
ist völlig normal Lassen Sie mich Excel öffnen und
einige dieser Zahlen hier zeichnen. Ich habe Microsoftic Cell
hier geöffnet und
die Lösung hier abgebildet Nun, unerwartete Lösung. Wie dem auch sei, wenn
der Benutzer zum Beispiel die Zahl Fünf eingibt, dann wissen wir, dass unsere Pyramide fünf Einheiten hoch sein
wird. Wenn der Benutzer fünf eingibt, wird eine Pyramide generiert , die
ungefähr so aussieht. Die Lösung, die wir bisher
entwickelt haben. Ich habe eine Schleife, die jede Zeile nacheinander
druckt. Das ist unsere Hauptschleife. Wir haben das mit y bezeichnet.
Sie können hier sehen, dass ich es gerade
die Variable y genannt habe, y ist gleich eins Und es reicht bis zur Größe
der Pyramide. Weniger oder gleich dem,
was ich tun werde. Ich werde die
Variable y genau hier platzieren. Das nächste Ding in dieser Schleife, ich habe drei Schleifen. einer Schleife wird dieser Inhalt generiert, der nächsten Schleife wird dieser Inhalt
generiert und in der dritten Schleife wird dieser Inhalt
generiert. Ich werde das auch hier drüben
hinstellen. Das wird der
erste Satz von Bindestrichen sein. Das wird die Pyramide sein, und das ist der zweite
Satz von Jetzt, wo y eins ist, ist
dies das erste
Mal, dass unsere Schleife eine Schleife wiederholt Wir wollen vier
Bindestriche auf der linken Seite erzeugen, wir wollen ein
Zeichen für die Pyramide
und auch vier Bindestriche auf
der rechten Seite erzeugen, wenn Jetzt wiederholt sich unsere Schleife
zum zweiten Mal, wir
generieren diese Zeile Unsere erste Schleife wird drei Bindestriche
erzeugen. Unsere zweite Schleife wird drei Segmente
für die Pyramide
generieren Auch hier werden die Bindestriche auf der rechten Seite gleich sein, dann drei und dann
die dritte Zeile Sie können sehen, wohin
das führt, zwei, die Pyramide wird fünf sein
und die Bindestriche zwei, dann Zeile Nummer vier
und Zeile Nummer Ich werde es einfach ausfüllen. Jetzt können Sie
hier einige Zahlen
darüber sehen , wie viele Zeichen für jede
Iteration der Schleife
gedruckt werden für jede
Iteration der Schleife
gedruckt Damit können Sie nun
herausfinden, was Sie tun müssen. Sie haben mehr Klarheit
in Ihrem Kopf. Sie müssen sich diese Zahlen nicht
merken. Sie können Ihre Gehirnleistung
darauf beziehen , über eine
Lösung für das Problem nachzudenken Schauen wir uns an, wie wir eine
Lösung für dieses Problem finden. Wenn der Benutzer
die Zahl fünf eingibt, entspricht fünf der
Größe unserer Pyramide. Unsere variable Größe, die in unsere Methode
einfließen
wird, wird fünf sein, wenn die Schleife
zum ersten Mal ausgeführt wird. Denken Sie daran, dass y unsere Schleife ist. Wenn die Schleife zum ersten Mal ausgeführt wird, ist
y gleich Eins. Wir können sehen, dass, wenn y eins ist, die Anzahl der Bindestriche
auf jeder Seite hier eins geringer
ist als die
Größe der Pyramide die Schleife zum zweiten Mal ausgeführt wird, können
Sie sehen, dass die Bindestriche auf jeder Seite um zwei kleiner sind als
die Größe der Pyramide Eine kleine
Regel finden Sie hier. Sie können sehen, dass wir,
wenn die Größe
fünf ist und wir
eins von der Größe subtrahieren, die Anzahl der
Bindestriche auf jeder Seite erhalten Wenn Y 25 ist, zwei
wegnehmen ist 35, drei
wegnehmen Sie können sehen, um
die Anzahl der Bindestriche auf jeder Seite Wir nehmen die Größe
der Pyramide in diesem Beispiel als fünf und
subtrahieren Y davon Das gibt uns die Anzahl der Bindestriche
auf jeder Seite. Schauen wir uns die Generierung
dieser Bindestrichschleifen an. Dies sind die beiden
Schleifen, die
die Bindestriche
hier links und auch rechts erzeugen die Bindestriche
hier links und auch rechts Wir sagten, dass die
Anzahl der Bindestriche für jede Zeile der
Gesamtgröße der Pyramide entspricht Und wir subtrahieren Y davon. Wir sagen einfach Größe minus Y. Um die Übersichtlichkeit zu erhöhen, setzen wir dort
Klammern ein, das erhöht die Lesbarkeit.
Ich bin ziemlich zuversichtlich Jetzt geben
wir für jede Zeile die
richtige Anzahl von
Bindestrichen auf der linken
und auch auf der rechten Seite Viele Entwickler neigen
dazu, die Anwendung frühzeitig auszuführen Dafür gibt es mehrere
Gründe. Erstens können Sie sehen, ob Ihre
letzte Änderung korrekt war. Und zweitens können Sie
sich einfach den aktuellen Status
der Anwendung ansehen. Wenn überhaupt,
macht es Ihnen ein bisschen mehr Freude zu sehen, was
Sie bereits getan haben. Lass uns einen Blick darauf werfen. Jetzt rufen wir
tatsächlich die Methode auf, jetzt nehmen wir
die Nummer des Benutzers. Wir rufen die Methode und dann
wird diese Methode ausgeführt. Schauen wir uns
die bisherigen Ergebnisse an. Wenn ich die Zahl fünf eintippe, können Sie
jetzt sehen, dass
sich alles in einer Zeile befindet . Also warum ist das so? Das liegt daran, dass
wir nach all
diesen drei Schleifen nicht wirklich eine brandneue Leitung
ausgeben Auch hier gibt es ein kleines
Problem. Jedes Mal, wenn wir ein Zeichen
ausgeben, geben
wir eine
brandneue zweite Zeile Das ist auch ein Fehler. Jedes Mal, wenn wir ein Zeichen
ausgeben, wollen
wir keine neue Zeile
schreiben, wir wollen nur
dieses Zeichen schreiben. Also verwenden wir die Konsole, um
das zu tun , wenn wir eigentlich eine neue Zeile
wollen. Nun, dann machen wir das nach all diesen Loops. Schauen wir uns
jetzt die Anwendung
an und sehen, wie sie aussieht. Sie können jetzt also sehen, dass wir
eine Art Rumbusform haben. Es sieht ziemlich interessant aus, aber Sie können sehen, dass die
Anzahl der Bindestriche korrekt Wir beginnen mit 43210. Jetzt müssen wir
diesen mittleren Teil
hier reparieren , der die Pyramide ist Schauen wir uns
an, wie das geht. Ich gehe zurück zu
Excel, ich bin wieder in Excel. Jetzt möchte ich
herausfinden, wie diese Zahlen anhand
unserer verfügbaren Informationen
generiert werden können. Wir haben die Größe der Pyramide und wir haben auch den Wert von y. Bei jeder Iteration der Schleife haben
wir bereits die Anzahl der Bindestriche für jede
Zeile berechnet Das sieht ziemlich einfach aus, aber wie generieren wir
diese Zahl anhand der Informationen, die wir in Zeile
eins haben Hier
ist die Pyramide ein Zeichen, Sie können dort in Zeile
zwei sehen, die Pyramide besteht aus drei. Sie können sehen, dass
die Pyramide in jeder neuen Zeile um zwei Pfund-Symbole zunimmt, 13579, hier sind das alles
ungerade Zahlen Wie können wir
diese Zahlen
anhand der Informationen, die
wir hier haben, generieren anhand der Informationen, die
wir hier haben Für diejenigen unter Ihnen, die gut in Mathematik
sind, ist
es wahrscheinlich ziemlich
einfach für Sie, aber manchmal sind Entwickler heutzutage nicht wirklich gut in
Mathematik. Vielleicht war es in den 70ern und 80ern alle Mathematiker
und Ärzte ein bisschen programmierten, ziemlich offensichtlich, aber
heutzutage ist es IT-Programmierung Es ist eine eigenständige Fähigkeit, manchmal lässt sie sich nicht
direkt in die Mathematik übertragen Aber wenn Sie hier
bei diesem Y-Wert etwas bemerken, nehmen
wir die Zahl Drei. Wenn wir zum Beispiel
drei mit zwei multiplizieren, erhalten wir sechs. Und dann subtrahieren wir
eins davon, dann erhalten wir den Wert fünf Nochmals, vielleicht vier. Zum Beispiel vier mal zwei ist acht. Eins subtrahieren ist 75
mal zwei ist zehn, subtrahieren eins ist neun Und ich denke, das ist
eine Regel, die im
gesamten Feld
funktionieren könnte , aber wir sollten in solchen Fällen immer
mit 1,0 testen Eins mal zwei ist 21 ist eins. Ja, das scheint auch zu funktionieren. Ich denke, das könnte
eine Regel sein, die funktioniert. Was wir sagen können ist, dass p gleich
y multipliziert mit
zwei ist , nimm eins weg. Das ist eine Regel, die für die Generierung
der Pyramide auf der Grundlage
der Zeilennummer selbst
funktionieren sollte der Pyramide auf der Grundlage
der Zeilennummer selbst Es gibt vielleicht noch viel mehr
Lösungen für dieses Problem, aber diese ist sicherlich
eine, die
für uns funktionieren würde, basierend auf y hier. Zurück zu unserer Software Hier haben wir den Wert von y bei jeder Iteration der Schleife Was wir hier machen, wir wollen
zum Beispiel die Pyramide auf
jeder Linie erzeugen , wenn y
gleich drei ist Dann wollen wir
fünf dieser Pfund-Symbole erzeugen. Hier haben wir gesagt, dass Y mit zwei multipliziert und dann eins davon
subtrahiert Es würde
ungefähr so aussehen. Ich glaube, das würde funktionieren, aber um ein bisschen Klarheit zu schaffen, verwende
ich immer zusätzliche
Klammern wie diese. Es macht es nur lesbarer sodass wir sehen können, was vor sich geht. der Gebote würden Sie damit aber
genau
das gleiche Ergebnis erzielen Aufgrund der Masse der Gebote würden Sie damit aber
genau
das gleiche Ergebnis erzielen, weil Multiplikation vor
Subtraktion kommt Aber in solchen Fällen
würde ich es immer so schreiben Schauen
wir uns zum Beispiel jetzt das Beispiel an
und sehen, was vor sich geht. Wenn wir die Zahl fünf ausgeben, die Zahl fünf
eingeben,
können Sie sehen, dass wir jetzt
eine schöne Pyramide erhalten. Das ist ziemlich cool, nicht wahr? Funktioniert das für
größere Zahlen? Sagen wir 35. Das sieht ziemlich gut aus. Ja,
es sieht so aus, als ob es funktioniert. Sie können sehen, so würde ich ein Problem bei so
etwas
angehen. Wir haben so ziemlich
90% des Codes geschrieben , indem wir nur das Problem
analysiert haben. Wir mussten nicht wirklich
über C Sharp und Programmierung nachdenken . Wir haben uns buchstäblich nur die Pyramide
angesehen, das Problem ein wenig analysiert und es in kleinere Teile
aufgeteilt Das Einzige, was schwierig
war, war, die Grenzen
für diese vier Schleifen
herauszufinden Also, wie viele Bindestriche
wir zeichnen sollten, wie viel von der Pyramide wir auf jeder Linie zeichnen
sollten, und wieder die
Bindestriche auf der rechten Seite Und auch eine kleine Komplikation bei neuen Linien und solchen
Dingen, was Manchmal macht jeder
Fehler, das ist normal. Aber Sie können sehen, wie wir diese Probleme
isoliert und Microsoft Excel
verwendet haben, um
die Zahlen zu berechnen, sodass wir
all diese Informationen nicht wirklich
im Kopf behalten mussten. Wir können das Problem einfach hier
nehmen, alles
zerlegen, alle Zahlen berechnen und
dann müssen wir nur noch
herausfinden, wie wir
diese Zahlen aus den
Informationen, die wir haben, erhalten , entweder der Höhe
der Pyramide oder
dem Wert von y bei jeder
Iteration der Schleife So können Sie sehen, wie wir
das Problem gelöst haben, ohne
wirklich darüber nachzudenken Wir haben nicht wirklich
Gehirnleistung genutzt. Alles, was uns in den
Sinn kam, wurde in
Excel abgelegt und wir können daraus
quasi eine Lösung finden So würde ich
eine Situation wie diese angehen. Vor allem, wenn ich wirklich müde oder
verkatert wäre und nicht denken könnte, dann, du weißt schon, lass die
Tools die Arbeit für dich erledigen. zurück
zu Visual Studio kommen Wenn wir
jetzt zurück
zu Visual Studio kommen, zeichnen wir
ziemlich coole Pyramiden Wir können
den Hintergrund sogar
durch einen schönen leeren weißen Bereich ersetzen durch einen schönen leeren weißen Bereich Und vielleicht können wir zwei Pyramiden
zeichnen. Ich meine, wir haben es in eine Methode gesteckt, sodass wir die
Methode jetzt viel einfacher wiederholen können Und das ist die Macht der Methoden. Wenn ich jetzt
zum Beispiel
die Zahl fünf einfüge,
erzeugen wir jetzt drei Pyramiden
übereinander Das ist ziemlich cool, nicht wahr? Wie dem auch sei, so würde
ich ein
Problem wie dieses angehen. Auch dies ist eine häufige Sache, die Sie in Vorstellungsgesprächen finden
können. Aber die eigentliche Stärke
eines Programmierers besteht darin, logisches Denken auf die
Probe zu Wie funktioniert dein Verstand? Ein guter Programmierer ist
niemand, der
sich Syntax merken und Informationen
wiedergeben kann . Ein guter Programmierer ist jemand
, der logisch denken, ein Problem
aufschlüsseln
und eine passende Lösung finden kann ein Problem
aufschlüsseln
und eine passende Lösung und Das ist es, was ein guter
Programmierer ausmacht. Ich hoffe, Sie fanden
diese Übung nützlich und danke Ihnen fürs Zuschauen
53. 10-2. Lösungen, mehrere Projekte und Namespaces: In diesem Tutorial zeige ich Ihnen
, wie Sie mehrere Projekte
in Visual Studio
einrichten Ich werde ein wenig über die
Terminologie wie Lösungen,
Projekte, Assemblys
und auch über Namensräume sprechen . Ich kann Ihnen auch zeigen, wie Sie auf
Dateien aus verschiedenen
Assemblys zugreifen können. Dies wird in Zukunft sehr
nützlich sein. Wenn wir Visual Studio öffnen, können
wir hier diesen Dialog führen in dem wir
ein brandneues Projekt erstellen können. Hier klicken wir darauf und
dann erstellen wir einfach eine Konsolenanwendung. Wenn ich hier auf Weiter klicke
, werde ich nach
dem Namen meines Projekts gefragt. Da ich mich hier für eine
Konsolenanwendung entschieden habe, handelt es sich um
eine grafische Benutzeroberfläche, die
dem Benutzer möglicherweise angezeigt wird. In ähnlicher Weise könnten Sie eine
Windows Forms-Anwendung haben, die ebenfalls Gooey ist Dies sind jedoch die Projekte mit grafischer
Benutzeroberfläche, da sie ein Fenster haben, das wir
sehen können, wenn wir dieses Projekt benennen ist es beispielsweise
üblich, In Anwendungen ist es beispielsweise
üblich,
eine so genannte dreischichtige
Architektur
zu haben , bei ein Projekt
die Oberfläche darstellt. Vielleicht hätte
es auf einer Website, die über eine HTML-Konsolenanwendung verfügt, über eine HTML-Konsolenanwendung verfügt,
das schwarze Fenster und jegliche Logik, die damit zu tun hat. Und dann haben Sie
eine mittlere Ebene, manchmal auch Geschäftsebene genannt
, und sie enthält alle
Hintergrundberechnungen, die gesamte Logik, alles, was mit den Gehirnen
der Anwendung
zu tun hat. Und vielleicht ist die dritte
Ebene wie eine Datenbank, in der es um all die
Daten geht. Die Fähigkeit,
Daten aus einer Datenbank abzurufen. Weißt du, vielleicht ist es mit
einer Oracle-Datenbank
oder einer SQL-Datenbank gekoppelt . Also alles, was
mit der Datenschicht zu tun hat. Dies ist allgemein als dreischichtige Architektur
bekannt. Wenn Sie dieses Projekt in
C Sharp hier in Visual Studio erstellen , erstellen wir
zuerst
den Typen hier. Und das ist die
Konsolenanwendung in diesem Beispiel. Also werde ich es so
etwas nennen. Normalerweise ist das,
was ich und andere Softwarefirmen tun, wenn man den Typ kreiert, man den Typen in den
Namen des Projekts einfügt. Wenn das Projekt zum Beispiel
Test App heißt, siehst
du vielleicht so
etwas, wie Test App Guy. Oder teste einen Typen. Oder vielleicht ein Typ, der Ap testet,
so ähnlich. Anhand des Namens weißt du sofort, dass du
es mit dem Typen zu tun hast, der grafischen Benutzeroberfläche. Also werde ich zum Beispiel einfach Apoe
testen. Sie müssen es nicht so
machen,
aber das ist eine gute Praxis und
es ist auch weit verbreitet Wenn Sie
Ihre Bemühungen fortsetzen, werden
Sie das ziemlich oft sehen Ich werde
das Projekt jetzt erstellen. Hier haben wir unseren Mann. Es macht nicht wirklich viel. Es ist nur ein schwarzes Fenster, das sofort geschlossen
wird. Aber dieses Projekt hier, wenn wir nach rechts rüberkommen, steht
dieses Projekt für
alles, was mit unserem Mann zu tun hat. Alles grafische, was
der Benutzer sehen könnte,
alles, was mit dem Typen zu tun hat, all das ist hier
enthalten. Sie können
hier oben sehen, dass wir eine Lösung haben. Jetzt kann die Lösung
eine Reihe von Projekten enthalten, vielleicht 102030, und wir können hier
verschiedene Projekte hinzufügen Lassen Sie uns zum Beispiel eine Geschäftsebene
erstellen. Und das wird zum Beispiel den
ganzen Code, die gesamte Logik, alle
Berechnungen enthalten. Auch hier gilt:
Wenn es sich bei der Erstellung einer Lösung nur um ein
kleines Testprojekt handelt, zum Beispiel sehr klein, vielleicht
machen Sie nur ein kurzes Modell,
dann
ist es ziemlich ehrgeizig, eine
dreischichtige Architektur zu haben . Es wird vielleicht nicht benötigt, aber wenn Sie im Voraus wissen es sich um ein großes Projekt dass
es sich um ein großes Projekt handelt
oder um etwas, das mit
einer Datenbank kommunizieren oder
sehr komplex sein könnte . Dann müssen Sie
Ihre Architektur berücksichtigen, bevor Sie mit der
Erstellung eines weiteren Projekts beginnen. Jetzt werden wir
die Geschäftsebene erstellen. Wenn ich also mit der rechten Maustaste auf
die Lösung Hinzufügen klicke, kann
ich hier zu einem neuen Projekt wechseln. Und bei der Auswahl der Projekte habe ich meinen Typ schon hier,
diese Konsolenanwendung. Also ich
will nicht wirklich noch eine, besonders jetzt,
vielleicht in der Zukunft. Das hängt von meinen Bedürfnissen ab. Jeder hat unterschiedliche Bedürfnisse. Aber etwas für eine
Geschäftsebene, in der Sie Code
haben und
so ziemlich nur reinen Code. Dann willst du etwas, das als Klassenbibliothek
bezeichnet wird. Wenn ich hier auf Weiter klicke, kann
ich die Klassenbibliothek
wieder aufrufen, wie ich will. Aber wenn meine Anwendung so
als Test-App bezeichnet wird, haben
wir vielleicht so etwas wie
B L eine Geschäftsschicht oder LL eine Geschäftslogikschicht
oder so etwas Ähnliches. Etwas, das
eine andere Ebene
in der Anwendung darstellt . Normalerweise würde ich zum Beispiel gerne
Business Layer verwenden. Dann würde dieses Projekt all die
geschäftlichen Dinge
beinhalten, wie die geschäftliche
Seite des Systems, wenn Sie das hier sehen. Jetzt haben wir zwei Projekte. Wir haben unsere grafische
Benutzeroberfläche. Jetzt haben wir hier unsere
Geschäftsebene, die all die Berechnungen
und solche Dinge
enthalten wird . Wenn ich jetzt schreibe,
klicken Sie zum Schluss noch einmal auf die Lösung. Ich könnte
so etwas wie eine Datenschicht hinzufügen, vielleicht ein Datenbankprojekt
oder etwas Ähnliches. Es könnte auch eine
andere Klassenbibliothek sein die die Datenschicht
darstellt. Etwas ganz Ähnliches. Man könnte Dow für
Datenzugriffsebene sagen oder
etwas, das mit Daten zu tun hat. Oder sogar DB für Datenbank.
Es ist nicht wirklich wichtig. Ich könnte es so
etwas nennen. Dann
würde dieses letzte Projekt
hier, dieses dritte, alles repräsentieren, was damit zu tun unsere Lösung an
eine potenzielle Datenbank zu
binden, ob es nun Oracle, SQL, meine CQL oder so etwas ist
, es spielt keine Rolle Und jetzt haben wir drei Projekte. Nun, Architektur, es stehen so viele Architekturen zur Verfügung, wenn man
Software entwickelt, wie beim Bau eines Gebäudes Es gibt nicht den einen Weg
, ein Gebäude zu bauen. Es gibt so viele verschiedene Möglichkeiten, aber dieser ist sehr beliebt. Was passiert, ist, wenn Sie vielleicht 50 Leute in Ihrem Team
haben, Sie arbeiten für ein Unternehmen. Einige Leute werden sich zum Beispiel mit HTML auskennen
, aber sie werden
in diesem Projekt vielleicht nichts
über eine Datenbank
oder komplexe
C-Sharp-Berechnungen wissen vielleicht nichts
über eine Datenbank . Was also passiert ist, dass sie
nur an diesem Projekt arbeiten werden. Ebenso werden Sie, wenn Sie
ein Datenbankfan sind, nur an
diesem Datenbankprojekt hier arbeiten. Trennung Ihrer Lösungen nach verschiedenen Projekten hilft auch
bei der Teamarbeit und ähnlichen
Dingen. Nur Personen, die
sich
beispielsweise mit der Datenbank auskennen , würden
mit diesem Datenbankprojekt arbeiten. Das ist quasi ein Teil
der Argumentation dahinter. Wie komme ich zum Beispiel mit meinem Projekt
hierher? Dieser Typ, wie bringe ich ihn
dazu, mit diesem Projekt zu sprechen? Weil ich standardmäßig
drei Projekte hier
unter der Lösung hinzugefügt habe , aber keines von
ihnen kommuniziert miteinander. Wie erreichen wir das? Wenn ich zu meiner grafischen
Benutzeroberfläche gehe, zum Beispiel diesem Projekt hier, gehe ich hier
zu Abhängigkeiten. Je nach
Version von Visual Studio ist
dies die neueste Derzeit
heißt es Abhängigkeiten. Wenn Sie eine ältere Version haben, könnte
es Verweise
oder ähnliches heißen. Wenn Sie mit der rechten Maustaste darauf klicken und zu Projektreferenz hinzufügen
gehen. Wenn ich das mache, erscheint ein
Fenster. Jetzt kann ich alle
Projekte in
meiner Lösung sehen , wie in diesem Menü auf der
linken Seite Hier möchte ich
die Projekte überprüfen , die ich meinem Mitarbeiter zuordnen
möchte,
sagen wir, ich möchte mit
meiner Geschäftsebene sprechen , wo alle
Berechnungen durchgeführt werden Ich überprüfe das einfach
dort und drücke OK. Und jetzt, intern, meine
grafische Benutzeroberfläche, kann
das jetzt im Wesentlichen
mit diesem Projekt hier kommunizieren, der Geschäftsebene, auf
der alle Berechnungen durchgeführt werden. Lassen Sie uns hier ein Beispiel einbauen
, damit wir einfach etwas tun können. Es wird nicht viel bewirken. Richten Sie
hier eine sehr einfache Methode innerhalb
der sogenannten Geschäftsebene ein. Und das wird
einfach die Zeichenfolge hello zurückgeben. Das ist alles, was es tun wird. Ich nenne es Hallo. Ich nenne
es Hello Class. In unserer
Geschäftsebene hier drüben habe ich einen Kurs
namens Hello Class. Es hat eine Methode, und alles, was diese Methode tut, ist die
Zeichenfolge hello zurückzugeben. Wenn ich jetzt hier zu
meinem Projekt mit grafischer
Benutzeroberfläche zurückkehre , teste App Guy und ich tippe zum Beispiel Hello Class ein. Sie können sehen, dass es nicht
einmal in dieser Liste steht, aber ich habe
das Projekt tatsächlich auf dieses verwiesen. Warum kann ich nicht darauf zugreifen? Nun, hier kommen
Namespaces ins Spiel. Wenn Sie
diese Tutorials bisher verfolgt haben, werden
Sie diesen
Schlüsselwort-Namensraum ziemlich häufig sehen, fast in jeder Datei. Und dann hat es einen Namen. In der Regel wird
der Name des Namespace automatisch aus
dem Namen des Projekts generiert. Zum Beispiel heißt dieses Projekt
hier Test App Guy. Aber wenn ich zu
meiner Geschäftsebene übergehe, meinem Geschäftsprojekt, das ich erstellt habe, können
Sie sehen, dass es hier den Namen
des Projekts
übernommen hat.
Geben Sie jetzt den Namensraum ein. Es ist einfach eine logische
Art, Dinge zu organisieren. Wir haben zum Beispiel schon einmal
über den
Mathematikunterricht gesprochen , in dem wir Mathe-Kunst machen, absolute Kunst oder Quadratwurzel
oder so. Aber
wenn ich mit der Maus darüber fahre, kannst
du sehen, dass sie zu
einem Namensraum namens
System gehört , genau hier. Wenn ich ein
neues Projekt in Visual Studio erstelle, erhalte ich standardmäßig einige
Namensräume All diese Namensräume hier, diese sieben, werden mir standardmäßig
zur Verfügung gestellt. Im Grunde kann ich
jeden Code verwenden, den
Microsoft
mir zur Verfügung gestellt hat und der
in einem dieser
Namensräume hier enthalten ist , so
wie ich hier einen
Namespace mit einem Namen habe Und ich habe etwas Code hier drin. Standardmäßig kann ich
jeden Code in einem
dieser Namensräume verwenden . Das ist dem
, was wir hier haben, sehr ähnlich. Was ich tun muss, nun, ich muss mit
dem Namensraum sprechen , in dem ich diese Methode definiert
habe, weil das momentan nicht der Fall ist. Hier. Sie können sehen
, wo wir die Methode definiert haben, in einem
Namespace namens Test App PL. Wenn ich das kopiere, gehe ich
zurück zu meiner Charakterebene, genau hier, genau hier oben, ich verwende ein spezielles Wort
namens Benutzen was? Wenn Sie Does
verwenden, können Sie einen anderen Namensraum verwenden. Wenn ich hier einfach
diesen Namensraum einfüge, gefolgt von einem Sam-Dolon, wenn ich hello class eintippe, können Sie
jetzt sehen, dass ich Zugriff darauf
habe,
im Wesentlichen, indem ich
diesen Namensraum verwende. Ich habe Zugriff auf alles in diesem Namensraum,
in dieser Datei. Ich hoffe, das macht jetzt Sinn, denn die Hello-Klasse ist
im Test im B L-Namespace definiert, wie Sie hier sehen können, sie sich im Namespace Ich kann auf alle
Funktionen zugreifen. Ich werde hier
eine neue Instanz
der Hello-Klasse erstellen . Jetzt kann ich Hallo sagen und Hallo
zurückgeben. Und das wird
mir die Saite besorgen. So kann ich mit
einer anderen Klasse in
einem anderen Namensraum sprechen , sich in einem
anderen Projekt befindet. Der ultimativen Klarheit halber Wenn ich hier zu
meiner Lösung komme, gehe
ich hier zu meiner
Test-App-Business-Ebene. Und ich gehe
hier zum Beispiel zu einem Kurs. Man kann sagen, dass es den
Standard-Namensraum hat. Wenn ich eine brandneue Klasse erstelle, klicke
ich mit der rechten Maustaste auf Neue Klasse hinzufügen. Ich nenne es, wie ich
will, es spielt keine Rolle. Sie können wieder sehen, dass es
denselben Namensraum hat , weil
es aus dem Projekt stammt. Es spielt keine Rolle, wie
viele Klassen ich erstelle. Standardmäßig wird
der Name des Projekts
für den Namespace verwendet. Sie können
den Namespace jedoch
nach Belieben umbenennen . Sie können sehen, dass das die
Macht von Namespaces ist. In Shop können Sie verschachtelte
Namespaces haben, zum Beispiel einen Namespace innerhalb
eines Namespace, Namespace innerhalb
eines Namespace was in Visual Studio durchaus üblich ist. Sie können sehen, dass sich darin ein
Namespace namens System befindet. Es gibt einen namens Collections. Darin gibt es
eine, die als generisch bezeichnet wird. Stellen Sie sich einen Namensraum als eine Möglichkeit vor,
Dinge zu gruppieren Wenn Sie etwas
innerhalb eines Projekts haben, das mit einem
Projekt zu tun hat, Ihren gesamten Code, zum Beispiel auf der
Geschäftsebene, dem Herzstück der
Anwendung, dann ist
das ein Projekt,
eine Assembly zum Beispiel In diesem Projekt haben
Sie jedoch möglicherweise unterschiedliche Dinge. Zum Beispiel haben Sie vielleicht einen
Teil des Projekts, um die Fläche
eines Hauses oder etwas Ähnliches zu berechnen, aber innerhalb dieses Projekts haben
Sie vielleicht etwas
ganz anderes, wie die Berechnung einer Steuererklärung. Aber vielleicht müssen diese beiden
Dinge aus irgendeinem Grund innerhalb desselben
Projekts
existieren. Und in diesem Fall würden
Sie sie logischerweise in einem
anderen Namensraum
gruppieren Also alles, was mit der Arbeit
im Bereich eines Hauses zu tun hat, könnte
man den einen
Namensraum nennen und den
anderen für Steuererklärungen oder
was auch immer. Das Beispiel könnte alles sein und das könnte ein anderer Namensraum sein Sie
gruppieren also logisch vielleicht nach einer Aktivität oder
einer Funktion oder was auch immer Sie
entscheiden, wenn Sie an Projekte denken denken Sie an Architektur, wie
Sie Ihre Lösung strukturieren Aber wenn Sie an Namespace denken, denken Sie an logischere
Dinge, wie zum Beispiel, wie Sie ähnliche Codeteile
gruppieren Und das ist in diesem Fall irgendwie der
Unterschied. Also werde ich Ihnen nur noch
eine Sache in Bezug
auf mehrere Projekte
und Baugruppen und solche
Dinge zeigen noch
eine Sache in Bezug
auf mehrere Projekte . Nun, das ist ein ziemlich
kompliziertes Thema, wirklich ein
ziemlich umfangreiches Thema. Aber was ich Ihnen zeige,
reicht aus, um den Rest dieser Tutorials
gewissermaßen zu
verfolgen. Aber nicht nur das, sondern wenn Sie Ihre eigenen
Lösungen und Projekte
starten, haben
Sie eine allgemeine Vorstellung davon wie Sie die Dinge strukturieren
sollen. Und auch, wie Sie Ihren Code
organisieren, was sehr wichtig ist,
je größer Ihre Projekte werden. Wenn wir nun hierher kommen, haben
wir hier unsere Lösung mit unseren drei Projekten darunter. Jetzt stellt sich jedes von ihnen wie eine Baugruppe
dar. Es ist ein Wort, das Sie oft hören
werden, aber wenn Leute
über Assemblys
und den internen
Zugriffsmodifikator sprechen , dann ist es Teil
der Assembly, die normalerweise durch ein Projekt
repräsentiert wird Ein Projekt pro Baugruppe. Wenn ich
jetzt hier zu
dieser grünen Play-Schaltfläche komme , wenn ich darauf klicke, wird
unsere Lösung kompiliert, alle unsere Projekte
werden kompiliert und
für jedes unserer Projekte wird eine Assembly erstellt. Wenn ich jetzt zu meinem
Dateisystem gehe, verwende ich
jetzt ein Fenstersystem
für das Guy-Projekt hier. Es macht genau hier eine
EXE-Datei. Auch hier einige verschiedene
Dateien damit. Sie können aber auch sehen,
dass hier für
jedes unserer Projekte tatsächlich
eine DLL-Datei erstellt wird. Das sind hier
sogenannte Assemblys, weil wir in diesem Fall drei
Projekte haben, wir haben hier auch drei
Assemblys. Sie können hinter
die Kulissen schauen und sehen wie dies
in der realen Welt dargestellt wird. Wenn Sie diese
Software an Ihre Freunde weitergeben oder sie vielleicht
in eine Einrichtungsdatei packen, können
Sie hier sehen, wie
diese Projekte als
Binärdateien
dargestellt werden , normalerweise eine für jedes Projekt. Eine Sache, die ich erwähnen werde,
ist, dass es eher
optional ist, das
Schlüsselwort using hier oben
zu haben eher
optional ist, das
Schlüsselwort using hier oben , wenn ich mich entscheide, es zu entfernen Sie können
zum Beispiel sehen
, nicht mehr funktionieren wird
, weil es den Namensraum, in
dem diese Klasse
enthalten ist,
nicht finden kann . Was wir in diesem Fall tun können, ist es
einfach mit
dem Namespace zu qualifizieren. Jedes Mal, wenn ich die Hello-Klasse verwende, muss
ich dem System mitteilen,
wo sie sich befindet, Beispiel in welchem
Namensraum sie sich befindet. In diesem Fall kann ich es mit
dem Namensraum vor
dem Klassennamen
qualifizieren . Aber wenn ich
diese Klasse in
dieser Datei vielleicht 1020 Mal verwende , werde
ich hier eine Menge
redundanten Codes haben Anstatt das zu tun, kann
ich all
diese entfernen und einfach den Namensraum
oben in der Datei verwenden Und dann muss ich es nicht mehr jedes Mal
qualifizieren, wenn ich es benutze. Das ist also ein Vorteil der Verwendung
des Namespaces hier, NC Sharp
54. 11-1. Breakpoints und Code-Stepping: Debuggen, Debuggen in C Sharp. Was ist Debuggen Wenn Sie meinem Tutorial bisher gefolgt
sind, haben
wir mit der Sprache
C Sharp gearbeitet, wir haben viele verschiedene Dinge getan Objektorientierung, Schleifen,
Berechnungen, Methoden. Aber bei diesen
Übungen zum Beispiel und bei der Arbeit mit der Sprache ist es
so, dass Menschen Menschen sind. Sie werden Fehler machen, ob es nun beabsichtigt
oder unbeabsichtigt
oder einfach nur ein Diese Dinge passieren.
Hier kommt das Debuggen ins Spiel Debuggen ist jetzt ein lockerer Begriff. Das Wort Debuggen wird
in zwei verschiedenen Bedeutungen verwendet. Wir können sagen, okay, ich werde ein bisschen debuggen,
und das ist der Prozess
, bei dem versucht wird, Fehler zu finden Vielleicht hat Ihre Software keine Fehler, aber Sie werden versuchen
, welche zu finden, nur um
sicherzugehen , dass sie richtig funktioniert.
Das ist ganz normal. Sie können den
Begriff Debuggen auch verwenden, wenn Ihre Software ein Problem hat und Sie versuchen, das Problem zu
lokalisieren Sie würden also sagen,
ich werde versuchen, meine Software zu debuggen, weil ein Fehler
aufgetreten ist Ich weiß nicht, wo es ist, aber
ich muss versuchen, es zu finden. Es wird hier also in zweierlei Hinsicht verwendet. Also, wie ich schon erwähnt habe, Tatsache ist, dass
niemand perfekt ist. Wenn jeder perfekt wäre, würden Softwareunternehmen nicht einmal Testteams für die Durchführung von Tests
einstellen. Sie hätten keine
sogenannten Unit-Tests. Sie müssten Ihren Code nicht testen. Aber Tatsache
ist, dass wir nicht perfekt sind. Und deshalb
müssen wir uns mit
Debugging auskennen und versuchen, Fehler in unserer Software zu
finden Bisher haben
wir in dieser
Tutorial-Reihe Visual Studio verwendet Jetzt ist Visual Studio großartig. Es enthält viele Tools und
Funktionen, und
um ehrlich zu sein, haben wir kaum die Oberfläche
erkratzt Es hat einen Compiler, der unseren Code
kompiliert. Es hat die IDE, in die
wir tatsächlich
tippen können , um
Projektlösungen zu erstellen Es hat diese
Autocomplete-Funktion, auch bekannt als Intellisense So viele verschiedene Dinge,
aber eine andere Sache, die es auch hat, ist ein sogenannter Debugger Ein Debugger ist also eine
Software,
ein völlig eigenständiges Programm, das von Microsoft
geschrieben wurde Und die Aufgabe des
Debuggers besteht darin, sich
an eine andere
Software anzuhängen Dies wird als
Anhängen des Debuggers bezeichnet. Also, an welche Software hängt sich dieser
Debugger selbst an? Nun, das ist dein
Code, deine Software. Jedes Mal, wenn Sie die
grüne Play-Taste drücken, Ihre Software
im Hintergrund kompiliert Wenn Sie beispielsweise
Windows verwenden,
wird es beispielsweise zu einem
EX kompiliert Dann kann sich der Debugger in diesem Fall
selbst an diese
EXE-Datei anhängen , aber nicht nur Ihre Software Es kann sich an
einen anderen Ausführungsprozess anhängen , den Ihr System ausführt Es ist ziemlich mächtig.
Was ist also der Vorteil sich
dieser Debugger an Ihre Software Was ist der Zweck davon
? Warum sollte es das tun? Nun, wenn
sich ein Debugger an Ihre Software anhängt, können
Sie ein gewisses
Maß an Kontrolle
ausüben , während Ihr
Code ausgeführt wird Und es kann bestimmte
Codesegmente untersuchen, wenn
während der Ausführung
Ihrer Software etwas schief gehen könnte Stellen Sie sich vor, Sie können
Ihre Software
jederzeit pausieren . Angenommen, Ihre Software wird geladen, sie läuft in einer Endlosschleife. Zum Beispiel vielleicht eine Vierer-Schleife, und Sie können
die Ausführung einfach in der
Mitte der Schleife anhalten die Ausführung einfach in der
Mitte der Schleife Nehmen wir an, Sie haben eine Schleife mit vier
und es wird bis zehn gezählt. Sie können Ihre Software
zu einem bestimmten Zeitpunkt beenden, zum Beispiel, wenn sie
gerade bis vier gezählt hat. Während die
Software läuft, können
Sie also in Ihren Code gehen
und alles überprüfen. Sie können Werte von Variablen sehen. Sie können sogar
die Ausführung kontrollieren. Lassen Sie diese Vorderschleife also
beispielsweise manuell zwei weitere Iterationen
durchführen Und das kannst du selbst machen. Hast du jemals diese
Superheldenfilme gesehen, in denen der Typ wirklich schnell ist und
die ganze Welt eingefroren ist Aber weil er so schnell ist, kann
er in Echtzeit mit
Menschen interagieren Stellen Sie sich das
wie einen Debugger vor. Die Welt
geht ihren Geschäften nach. Aber dieses superschnelle Wesen, dieser superschnelle Held, kann quasi mit Lichtgeschwindigkeit
herumfliegen und Dinge modifizieren
und kontrollieren So funktioniert
ein Debugger. ist er
ziemlich mächtig und Um
ehrlich zu sein, ist er
ziemlich mächtig und unterhaltsam in der Bedienung Und das Anhalten
Ihrer Anwendung, während sie mit dem Debugger ausgeführt wird,
wird als Übergang in den Unterbrechungsmodus bezeichnet. Und als ich sagte, dass Sie die Ausführung
tatsächlich kontrollieren können. Wenn Ihre Software beispielsweise
läuft und sie gerade dabei ist, eine Methode
auszuführen, können
Sie diese Methode komplett überspringen, indem Sie sie überspringen und den Ablauf Ihrer Software
während
der Ausführung
kontrollieren , das wird Code-Stepping
genannt Der Debugger ist eigentlich eine
ziemlich leistungsstarke
Software,
und 99,999% der Entwickler
würden einen Debugger verwenden, um irgendeine Art von würden einen Debugger verwenden Schauen wir uns also ein Beispiel dafür
an. Nun, wie betreten wir diese Welt,
in der wir ein schneller Superheld sind Und wir können die Software pausieren
und Dinge ändern, Werte von
Variablen ändern
und Methoden überspringen
und all diese Dinge Wie machen wir das? Nun,
lassen Sie uns einen Blick darauf werfen. Wenn Sie also bisher
unseren anderen Tutorials gefolgt sind, wir
beim Schreiben von Code haben
wir
beim Schreiben von Code diese
grüne Play-Taste hier oben gedrückt. Wenn wir die grüne
Play-Taste drücken, läuft unsere Software. Und wenn wir
sie töten oder beenden wollen, kreuzen
wir entweder das Fenster
hier ab oder drücken die rote
Stopptaste hier oben. Also das haben wir
bisher gemacht. Wenn Sie hier links neben
dieser grünen Play-Schaltfläche gehen, werden
Sie hier eine
Drop-down-Liste sehen. Standardmäßig sollte dort D Bug stehen, aber darunter
steht auch Release. Nun, diese beiden Punkte hier
sind ziemlich wichtig. Wenn wir in dieser Liste Fehler
ausgewählt haben, wird jedes Mal, wenn wir
diese grüne Play-Taste drücken, auch
der Debuger ausgeführt und er hängt
sich auch an unsere Software an Für Neugierige: Wenn Sie in dieser Liste Version
auswählen, verwenden wir
dies normalerweise, wenn
wir die Software an eine andere
Person weitergeben möchten, da sie keine Debugging-Informationen enthält Aber jetzt wollen wir hier über Debug
sprechen. Jetzt wird dies als
Release-Modus bezeichnet. Im Moment wollen wir unser Programm
debuggen, wir wollen einige Fehler finden
und etwas Detektivarbeit leisten Wenn wir
als Entwickler Software
entwickeln und
Fehler finden und
unsere Lösung entwickeln, verwenden
wir normalerweise als Entwickler Software
entwickeln und
Fehler finden und unsere Lösung entwickeln, diesen
Release-Modus hier, Bug Und das ist der Grund, warum er Standard ist. Also, wie ich schon sagte, wenn wir die
Anwendung hier ausführen und unsere Software
im Hintergrund läuft,
hat sich der Debugger, der
Visual Studio-Debugger ,
an unsere Software angehängt Und das kann ich Ihnen beweisen,
wenn ich den Task-Manager öffne. Hier ist mein Task-Manager hier, sind alle
Anwendungen, die ich ausführe. Hier ist Visual Studio,
aber darunter können
Sie die Visual
Studio-Debugger-Konsole sehen Das läuft
im Hintergrund und ist tatsächlich an unsere Software
angehängt Aber bisher
haben wir das in unseren
vorherigen Tutorials nicht wirklich genutzt, aber in diesem
und den nächsten Tutorials werden
wir es ziemlich oft verwenden
. Schauen wir uns nun
den Visual Studio-Debugger an. Schauen wir uns hier
etwas Debugging an. Ich habe eine Beispielanwendung. Wenn diese Hauptmethode ausgeführt wird. Hier geht es in eine
endlose Drahtschleife über. Die Anwendung
wird niemals beendet. Jedes Mal, wenn sich diese Drahtschleife bitten
wir den Benutzer, einen Wochentag
einzugeben. Wir nehmen ihre Antwort, speichern sie in einer Variablen übergeben
dann ihre Antwort
an diese Methode hier,
je nachdem, welchen Wochentag sie eingeben. Wir haben eine
Switch-Anweisung, die
eine benutzerdefinierte Nachricht ausdruckt , je nachdem welchen Wochentag sie eingeben. Ganz einfach: Jedes Mal
, wenn eine Nachricht ausgegeben wird, wir einfach eine
Leerzeile ein und
kehren dann wieder zurück, um sie
nach einem anderen
Wochentag zu fragen Es ist eine ziemlich einfache
Anwendung mit dieser Anwendung
. Ich habe ein kleines Problem, wenn ich Mittwoch
eintippe Es gibt mir nicht die
tatsächliche Ausgabe, die ich will. Wenn ich Mittwoch eintippe, möchte
ich, dass es
Mittwoch oder Mythos ausgibt, was derzeit nicht der Fall ist Wenn ich beispielsweise Dienstag
eintippe, erhalte
ich eine Antwort für Dienstag Aber für Mittwoch
können Sie sehen, dass es mir mitteilt, dass ich einen ungültigen Tag
eingegeben habe. Jetzt weiß ich, dass es sich um eine
sehr einfache Software handelt, aber stellen Sie sich vor, diese Software
ist sehr kompliziert. Sie haben vielleicht 50 Dateien. Möglicherweise haben Sie Methoden, Methoden, Aufrufmethoden,
Methoden innerhalb von Schleifen. Sie können also sehen, dass es sehr
kompliziert werden kann. Schauen wir uns also an, wie wir eine solche Anwendung
debuggen können eine solche Anwendung
debuggen Bisher wissen wir mit unseren detektivischen Fähigkeiten
, dass Dienstag funktioniert Deshalb
kommt der Code in diese Methode. Die Switch-Anweisung wird ausgeführt und wir erhalten eine
Antwort für Dienstag. Mittwoch funktioniert
jedoch nicht. Es gibt also an dieser Stelle ein Problem mit
diesem Code. Zumindest würde
ich das denken. Es sieht also so aus, als ob, wenn
ich Mittwoch
eintippe , genau hier diese Art von
Standardabschnitt ausgegeben wird Warum macht es das?
Was ich in diesem Fall tun könnte, ist einen
sogenannten Breakpoint hinzuzufügen. Wenn du
hier auf die linke
Seite kommst , ist da ein grauer Balken. Wenn ich irgendwo
in dieser grauen Leiste hingehe, siehst
du dort einen grauen Kreis. Wenn ich mit der linken Maustaste klicke, wird ein roter Punkt hinzugefügt. Sie können also gleich
hier sehen, wie das heißt. Was bedeutet das Setzen eines Breakpoints? Warum wird es ein Breakpoint genannt? Nun, wenn ich die Software hier starte und irgendeinen
Tag der Woche eintippe, können
Sie sehen, wie der Code nicht mehr
ausgeführt Ich kann mich daran erinnern, wann ich Ihnen erklärt
habe, was ein Burger ,
und ich sagte, es ist wie
dieser Superheld, in Echtzeit verändern
kann, wissen
Sie, wie die
Lichtgeschwindigkeit Das ist die Untätigkeit des Debuggers. Jetzt hat sich der Debugger an
unsere Software
angehängt , indem einen sogenannten
Breakpoint, diese roten Punkte, Hier können wir so
viele einstellen, wie wir möchten. Jedes Mal, wenn der Code
einen dieser roten Punkte erreicht, friert
die Software ein. Es wird aufhören.
Mehr kann nicht getan werden. Wenn ich versuche, meine Software zu öffnen, kann
ich überhaupt nicht damit interagieren. Es ist völlig eingefroren. Und wir haben die volle
Kontrolle auf Code-Ebene. Dieses gelbe Stück hier, darauf ist es eingefroren. Und das ist unser erster Breakpoint. Also kann nichts anderes passieren. Die Zeit ist eingefroren. Also, was wir tun können, solange
es hier aufgehört hat, wir können Dinge inspizieren. Schau, wenn ich mit der Maus darüber fahre, kann
ich den Wert
unserer Variablen hier sehen Ich kann sehen, wie der Wert hier übergeben
wird. Es ist also ziemlich cool, nicht wahr? Es ist, als würde man mit
der Welt interagieren , während die
Welt eingefroren ist. Du weißt schon, spüre die Macht. Das ist also die Macht
eines Breakpoints. Es macht die Software kaputt. Und ich meine nicht
zerbrechen, wie eine Glasschale oder eine Glasvase zu
zerbrechen. Ich meine, Unterbrechungen in der Pause, wie Stopp. Stoppt die Hinrichtung Das ist also ein Breakpoint. Das nächste, worüber ich sprechen
möchte, ist das sogenannte Code-Stepping Was ist Code-Stepping? Im Moment
ist unsere Software in der Zeit eingefroren. Es ist an dieser
Leitung genau hier eingefroren. Die Switch-Anweisung wurde
noch nicht ausgeführt. Sie ist gelb, was bedeutet, dass sie im
Begriff ist , ausgeführt zu werden,
aber noch nicht. Was wir tun können, ist, dass wir die
nächste Codezeile
manuell ausführen können . Das nennt man Stepping, und wir können das manuell machen Wenn wir hierher kommen,
siehst du all diese Symbole hier. Dieser hier, da
steht: Schritt rein, dieser eine Schritt rüber, dieser eine Schritt raus. Und dieser eine Schritt zurück. Also viele verschiedene
Schritttasten genau hier. Aber was ist Treten? Nun, zum Beispiel dieser
hier, geh rüber. Sie sehen, die
Tastenkombination hier ist Zehn. Wenn ich Zehn drücke
, wird diese Aussage
übersprungen. Und das bedeutet, dass
der Code bis zur nächsten Codezeile
oder zum nächsten Codeblock
innerhalb einer Switch-Anweisung
ausgeführt wird. Hier wird unsere Eingabe aufgenommen, die so ziemlich
eine Garboard-Zeichenfolge ist Was passieren sollte, ist, dass diese
Codezeile ausgeführt wird , weil wir keinen Wochentag haben
, der unserer Eingabe
entspricht Wenn ich dann F drücke, was Schritt über ist, können
Sie sehen, dass der Code dann zu dieser Zeile hier
geht. Jetzt haben wir den Start
der Switch-Anweisung ausgeführt, und jetzt ist die Software
wieder in der Zeit eingefroren. In dieser Zeile können Sie sehen, dass wir dieser Zeile
keinen
Breakpoint haben, aber das spielt keine Rolle, weil
wir manuell darüber gegangen sind. Wenn wir möchten, dass die Software
weiter ausgeführt
wird, drücken wir zum Beispiel die
Play-Taste. Dann würde die Software
einfach weiterlaufen bis sie einen
dieser roten Breakpoints erreicht Aber wenn wir Schritt für
Schritt
Code in all
diese Dinge hineinfahren, wir manuell jeweils
eine Codezeile
oder einen Codeblock nach dem anderen aus, wie zum Beispiel eine
Switch-Anweisung Das ist also die Stärke von Stepping, und das ist einfach das manuelle Ausführen von
Segmenten Ihres
Codes nacheinander, wie er normalerweise ausgeführt
werden würde Jetzt ist die Software in dieser Zeile hier
eingefroren. Sie haben einen ungültigen Tag eingegeben. Wenn ich erneut Zehn drücke, zeigt unser Konsolenfenster
jetzt diese Zeile an. Wenn ich das Konsolenfenster öffne, können
Sie sehen, dass diese Zeile
jetzt ausgeführt wurde, aber auch hier
ist die Software zeitlich eingefroren. Auch hier drücke
ich auf diesem
Unterbrechungssymbol erneut F zehn, und jetzt sind wir dabei,
diese Zeile wieder in die
Konsole F ten zu schreiben , und jetzt wird die Methode ausgeführt. Das ist ziemlich cool, nicht wahr? Wenn Sie in
C Sharp in Visual
Studio arbeiten , müssen Sie den Code manuell
steuern Codeteile
manuell ausführen Das ist Code-Stepping. Es ermöglicht uns, Codezeilen manuell
auszuführen. Und das können wir selbst machen. Und wir können das tun, indem wir
Breakpoints setzen , um den Code
zunächst anzuhalten. Und dann können wir sogenannte
Schrittbefehle
verwenden , um rein zu gehen
, rauszukommen und all diese
Dinge. Aber was ist der Unterschied
zwischen Hineinsteigen, Aussteigen, Hinübertreten? Was sind diese Dinge? Nun,
betrachte dieses Beispiel hier. Wir haben die Anwendung ausgeführt, und ich rufe diese
Methode fünfmal hintereinander
auf keinem wirklichen Grund, außer
um Ihnen den Unterschied zu zeigen. Wenn wir Step Into ausführen, was 11 ist, dann werden wir zu
dieser Methode wechseln. Wenn ich F 11 drücke, können
Sie sehen, dass die nächste
Codezeile, die
ausgeführt wird, die offene geschweifte
Klammer genau hier ist, gefolgt von der
Switch-Anweisung Ich bin auf eine Methode gestoßen, ich bin hier eingetreten Was wir auch tun können, ist
die Methode zu überarbeiten. Ignoriere das alles einfach komplett. Vielleicht wissen wir, dass diese
Methode perfekt ist, daran ist
nichts falsch. Wir können also
diese gesamte Methode überarbeiten. Und dann wird die nächste Zeile, die
ausgeführt wird, diese hier sein. Da wir die
gesamte Methode Schritt für Schritt durchgehen, ist
das der Unterschied zwischen
Schritt in Schritt und Schritt über. Wir können einfach einen
ganzen Codeabschnitt überspringen. Sie haben
es vielleicht erraten. Was ist Step Out Nun, wir arbeiten gerade an einer
Methode. Ich kann auf Step Out Shift
11 klicken und wir können die Methode komplett
verlassen. Und das tun wir, wenn wir
die restlichen Methoden übernehmen. Fein. Wir wollen
hier raus und wieder da sein, wo wir vorher waren und dann in
etwas anderes einsteigen. Das ist also der Unterschied
zwischen diesen Schrittbefehlen. Normalerweise ist es nur ein Schritt in
etwas wie eine Methode, eine Klasse oder
etwas Ähnliches oder eine Eigenschaft, oder wir könnten es komplett
übergehen. Also ignoriere es einfach und
mach mit dem Rest weiter. Und wenn wir uns
in einer Methode wiederfinden und, weißt du, alles irgendwie gut aussieht, dann können wir sie hinter uns lassen. Diese werden also
Schrittbefehle genannt. Und der Vorgang des Verschiebens der Codeausführung wird
Code-Stepping oder Stepping genannt Das ist also der Unterschied zu
denen dort. Jetzt habe ich
Breakpoints erklärt. Code-Stepping,
Stepping-Befehle. Lassen Sie uns versuchen,
unser Problem hier zu finden. Es mag ziemlich offensichtlich aussehen,
aber denken Sie daran, dass wir gesagt haben, dass
am Mittwoch
nicht die richtige
Botschaft ausgegeben wurde. Also warum ist das so Lassen Sie uns hier also einen Grenzwert
für diese
Switch-Anweisung festlegen , da wir wissen, dass das Problem wahrscheinlich
in dieser
Switch-Anweisung liegt . Also werde ich
die Anwendung jetzt ausführen und Wednesday eingeben. Ich drücke die Eingabetaste
und wir sind dabei, diese Switch-Anweisung zu starten. Hier ist unsere Variable hier. Ich kann mit der Maus über die Eingabe fahren und ich kann sehen, schau Mittwoch Was jetzt passiert,
ist, wenn ich hier drübergehe, können
Sie sehen, dass es
diesen Standardfall Keiner dieser
Fälle passt also zu Mittwoch, aber das klingt
komisch, weil ich
gerade
Mittwoch habe , Mittwoch. Wenn ich also mit der Maus über die
Variable Mittwoch fahre, oh, ich sehe, schau, das Y wird genau
dort groß geschrieben. Es ist in Großbuchstaben geschrieben Das ist wahrscheinlich der Grund, warum
ich dieses
Y jetzt in Kleinbuchstaben geändert habe. Ich bewege den Mauszeiger hier über diese Variable. Es sieht so aus, als ob es
richtig passt. Das sollte also funktionieren. Jetzt könnte ich die Anwendung
neu starten. Sie sehen dieses Symbol hier
neben der Stopp-Schaltfläche. Es heißt Neustart. Was ich auch tun könnte, ist
das Programm zu beenden oder zu
streichen und es dann erneut auszuführen. Diese Neustarttaste
hier, was das macht, sie startet den R-Code neu, lässt
aber den Debugger im
Hintergrund laufen Wenn Sie auf Neustart klicken, insbesondere wenn Sie eine
große Software haben, ist
es etwas schneller, wieder
loszulegen Das ist der Unterschied zwischen
dem Neustart und dem
Stop-Play-Button. Eine Sache, die wir zum Beispiel auch
tun können,
ist, die Ausführung
des Codes manuell zu verschieben. Was zur Hölle bedeutet das? Im Moment führen wir
diese Codezeile aus. Es wird gerade ausgeführt. Wir gehen einfach drüber hinweg und jetzt sind wir dabei, diese Zeile hier
auszuführen. Im Wesentlichen ist die Ausführung dieser
Switch-Anweisung hier abgeschlossen. Was wir tun können, ist Maus über diesen
gelben Pfeil genau hier Halten Sie die linke Taste gedrückt, und wir können
die Codeausführung tatsächlich direkt
zurück zum Anfang
der Switch-Anweisung verschieben die Codeausführung tatsächlich direkt , als ob sie überhaupt nicht ausgeführt
wurde Das ist ziemlich cool, nicht wahr? Stellen Sie sich vor, Sie ziehen die Maus
hierher, als würden Sie einen Schrittbefehl verwenden, z. B. Schritt über oder hinein Sie können damit aber einen Schritt zurücktreten, aber nicht nur eine Zeile,
sondern mehrere Zeilen Es ist also eine Abkürzung für
diese Schrittbefehle. Aber es ermöglicht Ihnen, es zum
Beispiel in großen Teilen zu tun. Jetzt sind wir dabei, die Switch-Anweisung erneut
auszuführen, aber wir haben den Code
hier tatsächlich
geändert und unsere Software noch nicht einmal
gestoppt Es ist in Echtzeit erledigt. Es ist ziemlich cool, nicht wahr? Wenn ich die Zahl zehn übertrete, können
Sie sehen, dass diese Linie jetzt auf der rechten Linie
liegt. Mittwochs sind nur Mittwoch, also
sieht es so aus, als ob wir das Problem lösen. Es war nur, es war nur der
Großbuchstabe Y am Mittwoch. Jetzt kann ich
nur noch F 5 drücken, was die Abkürzung für diese
grüne Play-Taste ist. Jetzt denke ich, dass das
Problem gelöst ist. Ich möchte nicht
mehr debuggen. Ich kann meine
Breakpoints wegnehmen, wenn ich will, und dann kann ich einfach
diese grüne Play-Taste drücken und schon kann die
Software wie gewohnt weiterlaufen Jetzt heißt es
dort Mittwoch, was perfekt ist. Das ist genau das, was ich will. Wenn ich es noch einmal wiederhole, erhalten
wir genau das gleiche Ergebnis. Es sieht also so aus, als hätten wir
das Problem mit unserer Software behoben. Es war nur ein Unterschied
von einem Zeichen. Es könnte eine geringfügige Änderung sein. Aber selbst Dinge wie ein Unterschied um ein Zeichen können,
sagen wir, Space X-Raketen auf den Boden fallen lassen und
niemals den Orbit erreichen Deshalb ist es sehr wichtig , dass alles bis ins kleinste Detail
überprüft wird Um das zu erreichen
, ist ein Debugger ein sehr nützliches Tool, um solche Dinge zu
bewerkstelligen Ich werde
ein weiteres Beispiel und
einige andere
Debugging-Tools vorstellen , die Sie vielleicht nützlich finden Sie werden ausgeführt, um zu klicken,
und sie werden zum Cursor ausgeführt. Schauen wir uns dieses Beispiel hier
an. Wenn Sie
die vorherigen Tutorials befolgt haben, erinnern
Sie sich wahrscheinlich an dieses Beispiel. Im Wesentlichen
wird in diesem Beispiel nach einer Zahl gefragt. Sie geben die Zahl 25 ein, und dann wird eine Pyramide gezeichnet
, die 25 Zeilen hoch ist. Weil ich zum Beispiel 25 eingegeben habe, hat
sie eine Höhe von 25 Zeilen. Aber Sie können sehen, dass
es ein Problem mit dem Hintergrund dieser Pyramide gibt. Die rechte Seite hier
dauert zu lange. Es sollte hier wie
die linke Seite aussehen. Nach jeder Zeile können Sie sehen, wie
die Pyramide breiter wird, aber der Hintergrund
schrumpft einfach so Aber dieses Verhalten
wird auf
der rechten Seite nicht nachgeahmt Damit gibt es ein kleines
Problem. Schauen wir uns an,
was hier vor sich geht. Hier ist das Beispiel.
Hier fragen wir den Benutzer, wie hoch die
Pyramide sein soll. Wir übergeben es an eine Methode. Wir delegieren die gesamte Logik des Zeichnens der Pyramide
in dieser einen Methode Hier haben wir unsere vier Hauptschleifen , die nacheinander jede Linie
der Pyramide herausziehen Dann haben wir 34 Schleifen, eine für die
Bindestriche auf der linken Seite,
eine für das Zeichnen der Pyramide und eine für die
Bindestriche auf der rechten Wir wissen, dass wir ein Problem mit
den Bindestrichen auf der rechten Seite haben. Dies ist wahrscheinlich ein
guter Bereich, um
unseren Breakpoint festzulegen und einen
Blick darauf zu werfen, was hier vor sich geht Wenn wir die Software ausführen, fragen
wir den Benutzer nach einer Nummer. Fangen wir
mit einer niedrigen Zahl an. Niedrige Zahlen sind einfacher zu debuggen, da es
nicht viele davon Ich tippe die Zahl fünf ein. Unser Breakpoint
wurde hier erreicht. Derzeit ist H nicht deklariert. Drücken wir Zehn, um rüberzugehen. Und jetzt haben wir den
Header für unsere vier Schleifen initialisiert. Im Moment sind wir dabei, die erste Iteration
der Schleife durchzuführen H ist eins, weil das hier
sein Anfangswert ist. Dann wird H
weiterlaufen, bis es kleiner oder gleich dem ist,
was wie fünf aussieht. Und jede Iteration erhöhen
wir um eins. In der ersten Zeile wird
H
fünfmal fortgesetzt, wird
H
fünfmal fortgesetzt weil das genau
die Größe hier ist Wenn ich darüber hinweggehe,
geben wir einen Bindestrich aus, dann zwei Bindestriche, Dann ist es erledigt. Die
allererste Zeile auf einer Pyramide, die fünf Einheiten hoch ist, gibt fünf Bindestriche
auf der Stimmt das? Stimmt das? Nein, denn in der ersten Zeile sollten vier ausgegeben werden. Es generiert hier zu
viele Bindestriche. Warum ist das so? Es werden offensichtlich zu viele Bindestriche
generiert, aber die Bindestriche auf der linken Seite erzeugen
die richtige Menge Wie Sie hier sehen können, sollte
der Bindestrich aufhören, wenn er die Größe minus Y hat. Das ist Formel
, die wir Wir haben es hier offensichtlich
für diese Bindestrichschleife gemacht, aber wir haben es versäumt, dieselbe Funktionalität
für die Bindestriche auf
der rechten Seite zu replizieren ,
indem wir einen Breakpoint Sie können sehen, dass wir den Wert
von H untersuchen
können , während die
Software läuft. Lass uns das jetzt einfach machen. Sie können sehen, wir können
die Werte von H untersuchen. Wir können
die Größenwerte untersuchen, wir können die Werte von y untersuchen. Wir können sogar
Werte hier oben untersuchen,
Werte, die mit Hilfe von Schrittbefehlen wie
step over oder into in die Methode kommen , wir können die
Ausführung der Software steuern. Das ist ziemlich cool, nicht wahr? Nehmen wir an, wir haben hier die Lösung gefunden, wir haben das Problem herausgefunden. Nun, ich habe bereits einige Dinge
über
Run to Cursor und Run to
Click erwähnt . Was sind sie? Nun, laufen Sie zum Cursor und laufen Sie
, um auf die Tastenkombinationen zu klicken. Erinnerst du dich, als ich darüber gesprochen habe diesen gelben Pfeil hierher zu
ziehen Gleich hier oben, damit wir die Hinrichtung
kontrollieren können? Manuell ausführen, um zu klicken und
Cursorkürzel auszuführen , um den Codefluss zu
steuern. Wie Code-Stepping. Wenn ich
meinen Cursor hier setze, zum Beispiel rechten Maustaste klicke und dann „Zum Cursor ausführen“
wähle, klicke darauf und dann geht
die Ausführung dorthin,
wo sich mein Mauszeiger befand Es ist eine Abkürzung
und sehr nützlich. Ein anderer wird ausgeführt, um zu klicken. Sie können sehen, wenn ich jedes
Mal, wenn ich auf eine neue Zeile klicke, dieser mysteriöse kleine
grüne Play-Button erscheint. Aber du kannst es hier sehen,
genau hier. Ich klicke auf diese Zeile, sie
erscheint genau hier, sie ist wie ein
grünes Gespenst. Das heißt also Run-to-Click. Wenn ich hier auf diesen kleinen
grünen Play-Button klicke, springt
die Codeausführung zu dieser Zeile. Es ist also so ziemlich
dasselbe, als würde man mit der rechten Maustaste auf diese Zeile klicken
und „Zum Cursor ausführen“ wählen. Es ist also nur eine nette
kleine praktische Abkürzung. Sie können also sehen, dass „Run
to Click“ und „Run to Cursor“ beide praktische
kleine Abkürzungen sind. Wenn sich dieser Codeabschnitt mehrmals
wiederholt, kann ich zum Beispiel darauf klicken
, und die Codeausführung wird fortgesetzt bis diese Zeile
erreicht ist Das sind nur nette kleine Abkürzungen für
Code-Stepping. Dieser wird ausgeführt, um zu klicken,
und der Rechtsklick, Sie können zum Code-Cursor ausführen, aber
dafür gibt es auch eine Abkürzung,
nämlich Control F Ten Je öfter Sie Visual Studio verwenden, desto mehr werden Sie sich mit diesen Tastenkombinationen
vertraut machen. Aber jeder Entwickler, den ich kenne , kennt
Step-In- und
Step-Out, was F 10.11 ist. Und diese was F 10.11 ist. Und diese
beiden sind wirklich nützlich, um den Code Schritt für Schritt durchzugehen Jetzt werden wir
die Anwendung ausführen und es
sieht so aus, als ob unser Problem mit den
Bindestrichen Es war nur ein Problem mit
den letzten vier Schleifen hier. Und das ist die Obergrenze. Wenn Sie also
Code im Allgemeinen debuggen, müssen
Sie sich
einige Fragen stellen Wenn ein Fehler aufgetreten ist, welche Anweisung
oder welcher Ausdruck hat
das Programm zum Zeitpunkt
des Fehlers ausgeführt Bei welcher Codezeile ist
Ihr Programm fehlgeschlagen? Ist das Programm gescheitert? Und Sie hatten diese hervorgehobene Zeile, die besagte, dass dort ein Fehler aufgetreten ist.
Welche Zeile war das? Und als Ihr Programm fehlschlug, was waren die Werte
der Variablen, wie die Parameter, die
lokalen Felder, irgendwelche Objekte? Was waren diese Werte
, als der Fehler auftrat? welcher Reihenfolge wurden die Anweisungen zum Zeitpunkt
des Fehlers ausgeführt? Warst du in einer Methode? Zum Beispiel von einer Methode? Also, wo warst du? Was
wurde vorher ausgeführt? Und ich glaube, ich habe diesen
ziemlich gut behandelt. Was war das Ergebnis der
Codezeile, in der sie fehlgeschlagen ist? Oder vielleicht das Ergebnis der
Codezeile vor dem Fehler? Sie müssen also
all diese Dinge berücksichtigen. Sie können nicht einfach
irgendwo Breakpoints platzieren und hoffen
, einen Fehler zu finden Du musst
dir diese Fragen irgendwie stellen. den Fehler
grob darauf ausrichten, wo er sein könnte, welcher Klasse er sich befinden könnte, in welcher Methode er sich befinden könnte. Sobald Sie
es dann auf eine bestimmte Methode isoliert haben, können Sie damit beginnen
,
Breakpoints zu zeichnen und es ein wenig
zu isolieren Zusammenfassend lässt sich sagen, dass das Debuggen
genau das ist. Es ist der Prozess, nach Fehlern zu
suchen, aber wenn Sie einen Fehler haben, ist
es der Prozess, den Fehler
irgendwie zu isolieren Das ist ein Debugger. Das ist also ein Visual
Studio-Debugger. Und Sie können
dies verwenden, wenn Sie
Ihren Release-Modus auf Debug setzen Ihren Release-Modus auf Debug Und wenn Sie debuggen, können
Sie Dinge
wie Breakpoints platzieren Und hier wird die
Codeausführung gestoppt. Wenn die Codeausführung angehalten wird, wird
dies als Break-Modus bezeichnet. Sie wechseln in den Unterbrechungsmodus, und in
diesem Moment
wurde ein Breakpoint erreicht, um
den Ausführungsablauf zu steuern. Verwenden Sie Step-In, um auszusteigen, zu mieten, den Mieter
zu klicken, den Cursor oder sogar die Maus
entlang dieser Unterbrechungspunktleiste zu ziehen Dann wird das als
Code-Stepping bezeichnet. Dies ist die gesamte Terminologie,
die mit dem Debuggen
in Visual Studio
zu tun Sie werden vielleicht überrascht sein, aber wir haben nur die Oberfläche
des Debuggings gekratzt Ich hoffe, dieses Tutorial hat dir geholfen.
Danke fürs Zuschauen.
55. 11-2. Sofortfenster: In diesem Tutorial werden wir über das unmittelbare Fenster
sprechen. Nun, das ist ein Debugging-Hilfsprogramm und es ist äußerst nützlich Falls Sie
mein letztes Tutorial über
Debugging, Breakpoints und
Code-Stepping noch nicht gesehen haben,
dann empfehle ich Ihnen dringend, sich das anzusehen, bevor
Sie sich dieses Tutorial ansehen,
das unmittelbare
Fenster, was ist das Wenn wir hierher kommen, können
Sie hier diesen kleinen Tab namens Immediate
Window sehen Vielleicht haben Sie ihn schon einmal gesehen, vielleicht haben Sie sich gefragt,
worum es geht. Wenn Sie diesen Tab hier nicht sehen, wenn wir nach oben kommen, können wir, wenn wir nach oben kommen,
hier zu diesem
Debug-Menü gehen Hier befinden sich nun alle
Debug-Dienstprogramme und -funktionen Wenn Sie sich das gefragt haben, gehen Sie zu Windows und dann
zu Immediate Und wenn Sie das tun, kommen
wir wieder
hierher und dieser kleine Tab
sollte genau hier erscheinen. Jetzt kann das
Direktfenster zur
Entwurfs- oder Laufzeit verwendet werden . Was bedeutet das
also? Nun, in der Entwurfszeit entwickeln
wir sozusagen. Wir haben noch nicht einmal die
grüne Play-Taste gedrückt. Wir haben nichts zusammengestellt. Wir lassen nichts laufen. Aber was wir tun können, ist, dass
wir
in der Entwurfszeit tatsächlich
mit unserer Software arbeiten können , sodass die Software
nicht einmal läuft. Schauen wir uns
jetzt dieses Beispiel
an , damit ich Ihnen zeigen kann,
was ich damit meine. Wenn Sie unseren
früheren Tutorials gefolgt
sind, haben wir einen
Beispielrechner erstellt, bei dem wir den Benutzer nach einer ersten Zahl,
einer zweiten Zahl und
dann nach einem Operator
fragen . Und dann benötigt
es in einer Methode
hier zum Beispiel diese Zahlen
und einen Operator, zum Beispiel 54, und
dann vielleicht Plus. Und wenn der
Operator dann ein Plus ist, addiert
er sie zusammen und zeigt dann einfach das Ergebnis an,
das wäre neun. In diesem Fall können wir tatsächlich vom
unmittelbaren Fenster aus testen diese Methode tatsächlich vom
unmittelbaren Fenster aus testen. Es ist verrückt, oder?
Die Software wird nicht einmal ausgeführt, sie läuft
nicht einmal. Wie machen wir das? Lassen Sie
uns diese Methode hier verwenden. Rechnen Sie zum Beispiel.
Also werde ich das kopieren. Wir werden hier zu diesem
unmittelbaren Fenster kommen. Alles im
unmittelbaren Fenster beginnt mit einem Fragezeichen
, das so ziemlich aussagt, okay, ich möchte einen Befehl ausführen. Also möchte ich diese Methode ausführen. Also werde ich diese
Methode nennen. Ich nenne es mit fünf, und es braucht ein Zeichen und merkt sich Zeichen
in einfachen Anführungszeichen. Und wir werden ein Plus machen wenn wir im
unmittelbaren Fenster arbeiten. Das Semikolon ist optional. Wir können es sagen, wir müssen es nicht,
es ist nicht wirklich wichtig Jetzt pass auf, was passiert
, wenn ich Er treffe. Es führt tatsächlich unsere Software aus, kompiliert und führt sie und gibt uns dann das
Ergebnis für diese Methode Sie können sehen, dass es
das tatsächlich zur Entwurfszeit getan hat. Meine Software lief nicht einmal sie gab mir
den Wert Neun. Es ist eine ziemlich gute Methode, Dinge wie Methoden zu
testen, Ausdrücke
während des Entwurfs
auszuwerten, aber auch zur Laufzeit. Es kann dies auch tun, während
die Software läuft. Das ist ziemlich clever, nicht wahr? Wenn ich einen Breakpoint setze, vielleicht hier zum Beispiel, löschen
wir das Direktfenster
, wir können schreiben,
darauf klicken und dann auf Löschen klicken. All das macht das Fenster für uns einfach leer. Also jetzt
habe ich hier oben einen Grenzwert bei doppeltem Ergebnis
ist gleich rechnen Bevor ich die Methode überhaupt aufrufe, stoppe
ich das Programm, sodass nichts anderes
weitergeht Ich starte die Anwendung,
indem ich auf die grüne Play-Schaltfläche klicke oder fünf
drücke. Es
spielt keine Rolle. Jetzt fragen wir nach der ersten
Zahl fünf und dann nach vier, und dann möchte ich
diese zusammenzählen. Jetzt wird das Programm
nicht mehr ausgeführt. Wenn ich hier runter komme, die untere Ecke, habe ich dieses unmittelbare
Fenster hier. Also kann ich hier viele Dinge tun. Ich kann diese Methode erneut ausführen. ist zum Beispiel, Ein nützliches Feature ist zum Beispiel, dass
wir,
während der Code läuft, diese Intellisense, die Autocomplete,
haben Es stellt uns tatsächlich alle Variablen im
Gültigkeitsbereich zur Verfügung, Nummer zwei, wir können ihm
benutzerdefinierte Informationen übergeben, wenn wir wollen. Wenn ich 54 und mehr sage, genau wie zuvor, dann die Eingabetaste drücke, können wir
tatsächlich das Ergebnis erhalten. Aber Sie können hier sehen, dass hier wirklich nichts
passiert ist. Wir können immer noch
mit dieser Berechnung fortfahren. Das ist ziemlich cool, nicht wahr? Was ich auch tun kann, ist bestehende Variablen zu
verwenden. Im Moment habe ich Nummer
eins, Nummer eins. Wenn ich hierher gehe und diesen Wert
hervorhebe, können
Sie sehen, dass der Benutzer
die Zahl fünf und die Nummer zwei
vier gegeben hat. Und der Operator hat genau dort ein Plus
verwendet. Was wir tatsächlich tun können,
ist diese Variablen zu verwenden. Wir können das Ergebnis tatsächlich sehen bevor die Methode überhaupt ausgeführt
wird. Nun, vielleicht
möchte ich sie multiplizieren. Sie können hier also sehen, dass fünf
multipliziert vier ist 20. Sie können also sehen, dass das
unmittelbare Fenster
tatsächlich
verschiedene Dinge abfangen kann tatsächlich
verschiedene Dinge abfangen Ausdrücke auswerten, Methode
ausführen, viele solche Dinge Und das alles, während sich der Code
tatsächlich im Break-Modus befindet. Diese Methode wurde zum Beispiel noch nicht einmal
ausgeführt. Damit gibt es jetzt ein feines
Detail. In diesem unmittelbaren
Fenster hier unten habe
ich die
Berechnungsmethode jetzt zweimal aufgerufen. Aber stellen Sie sich vor,
Calculate würde etwas anderes tun, vielleicht würde es etwas
im Hintergrund zählen. Jedes Mal, wenn ich
Calculate ausführe, wird
eine laufende Summe darüber gespeichert, wie
oft ich es aufgerufen habe diese Methode jetzt
im unmittelbaren Fenster ausführen ,
würde sich dies auf die Ergebnisse auswirken Es ist, als würde diese Methode
jetzt tatsächlich ausgeführt, was
zu verschiedenen Problemen führen könnte. Je nachdem, was
Ihr Code tut, die
Ergebnisse hier oben auswirken,
wenn Sie hier im
unmittelbaren Fenster herumspielen kann sich das auf die
Ergebnisse hier oben auswirken,
wenn Sie hier im
unmittelbaren Fenster herumspielen. Es hängt einfach wirklich davon ab
, was Ihr Code tut. Für so etwas wie
Calculate, naja, es
speichert nicht wirklich irgendwelche Informationen. Es zählt nichts. Es zeigt nicht, wie oft
es aufgerufen wurde. Es ist also ziemlich sicher,
im unmittelbaren Fenster zu laufen. Es gibt jedoch Fälle,
in denen es unsicher wäre, beispielsweise aus
diesen anderen Gründen Das ist einfach etwas
Bemerkenswertes. Lassen Sie mich das demonstrieren. Jetzt nur um zu veranschaulichen,
wovon ich spreche. Nehmen wir an, diese
Berechnungsmethode führt
eine fortlaufende Bilanz darüber, wie
oft sie aufgerufen wurde Wir verwenden diese fortlaufende Zählung jedoch
für wichtige Zwecke. Vielleicht hängt etwas
anderes davon ab. In diesem Feld wird
nur aufgezeichnet, wie oft die
Berechnungsmethode aufgerufen wird Wenn die
Berechnungsmethode aufgerufen wird, werde
ich
dieses lokale Feld einfach jedes Mal
um eins erhöhen dieses lokale Feld einfach jedes Mal
um eins Wenn ich die Anwendung jetzt starte, setze ich hier einfach einen
Breakpoint, damit wir die Ausführung
der Software unterbrechen können Ich werde
ein paar Beispielzahlen eingeben, etwa fünf plus vier. Und dann werde ich
zum unmittelbaren Fenster hier rüberkommen . Dieser schwebt hier über diesem
privaten Feld. Manchmal taub, Sie können sehen, dass der
Wert derzeit Null ist. Aber wenn ich diese Methode
innerhalb des unmittelbaren Fensters ausführe, wird sie vielleicht dreimal ausgeführt Übrigens, wenn ich den
Aufwärtspfeil auf der Tastatur drücke, kann
ich meine vorherigen
Dinge durchsehen, die ich hier eingegeben habe Das ist also ziemlich cool, nicht wahr? Also habe ich die
Berechnungsmethode dreimal ausgeführt, aber nur im
unmittelbaren Fenster. Wenn ich hierher komme und den Mauszeiger über meine private Variable hier bewege, können
Sie sehen, dass sie den Wert
von drei Dingen in Ihrem Code hat von allem beeinflusst
werden, was Sie im unmittelbaren
Fenster hier unten tun Es ist also wirklich wichtig und es ist etwas, worauf Sie aufmerksam gemacht werden
sollten Auch hier wird natürlich
alles zurückgesetzt wenn Sie Ihre Anwendung ausführen Aber was das Debuggen angeht, lohnt
es sich, dies zu beachten Ich habe gerade
darüber gesprochen
, dass , wenn Sie das
unmittelbare Fenster verwenden, um
beispielsweise Methoden aufzurufen, Dinge in Ihrem Code ändern
können Nun, das könnte
gewolltes Verhalten sein, vielleicht möchtest du das tun
und das ist völlig in Ordnung. Aber es gibt Situationen
wie in unserem
vorherigen Beispiel , in denen wir zum Beispiel
eine Variable inkrementieren Aber wir brauchen das
hier und wir
wollen nicht , dass etwas in unserem unmittelbaren
Fenster daran etwas ändert Aber wir wollen die Methode trotzdem vom unmittelbaren Fenster aus
ausführen. Nun, wir
können tatsächlich etwas tun, um
dieses Problem in dem
unmittelbaren Fenster zu lösen dieses Problem in dem
unmittelbaren Fenster dem ich die Methode aufrufe, in
dem ich die Methode aufrufe,
was auch immer Sie hier eingeben, ob es nun darum geht, eine Methode aufzurufen , einen Ausdruck
auszuwerten den
Wert einer Variablen
herauszufinden, Sie können ihm
einfach einen kleinen Befehl namens S E anhängen, der
für keine Nebenwirkungen steht Sie können sehen, wenn ich tippe
, dass Visual Studio
uns gerade einige nette
Hinweise gibt uns gerade einige nette
Hinweise Wenn ich hierher komme, können Sie unsere Variable hier
sehen Die Anzahl der Wiederholungen ist Null. Ich komme zurück
zum Direktfenster und drücke die Eingabetaste. Sie können also sehen, dass Calculate die Zahlen
tatsächlich berechnet hat. Es wurden diese
Zahlen zusammengezählt, aber ich habe angegeben, dass
es keine Nebenwirkungen gibt. Wenn ich
hierher zurückkomme und
ein paar Mal die Daten durchsuche, behält
es immer noch den Wert
Null bei,
wenn Sie SE angeben behält
es immer noch den Wert
Null bei,
wenn Sie SE angeben. Das bedeutet, dass keine Nebenwirkungen
auftreten wenn Sie
diese Methode direkt aus dem Fenster
aufrufen diese Methode direkt aus dem Fenster
aufrufen Das ist ziemlich cool, nicht wahr? Das ist eine der Funktionen, die
du damit machen kannst. Also haben wir
Methoden mit Änderungen aufgerufen, wir haben Methoden
ohne Änderungen aufgerufen. Nun, was können wir
im unmittelbaren Fenster noch tun? Nun, wir können
Werte von Variablen anzeigen. Also zum Beispiel Nummer eins. Was ist das? Oh,
Nummer eins ist fünf. Das ist ziemlich cool, nicht wahr? Also stelle ihm immer
ein Fragezeichen voran. Und natürlich sind dies
nur Variablen im Gültigkeitsbereich. Wenn diese
Variablen zum Beispiel keinen Wert haben oder sie noch nicht erreicht
wurden oder sie nicht initialisiert
wurden, dann können Sie die Werte dieser Variablen offensichtlich nicht
lesen Es ist also nur das, was im Geltungsbereich
genannt wird, worauf wir tatsächlich Zugriff haben Was wir auch tun können, ist Ausdrücke
auszuwerten, zum Beispiel fünf plus
sieben. Es gibt uns das Ergebnis
und das können wir
mit Variablen machen, also Nummer eins geteilt
durch Nummer zwei. Es ist ziemlich cool, besonders
wenn Sie beim Debuggen einige
Beispielnummern eingegeben haben, aber Sie können
die Ausführung
des Codes anhalten und zur Laufzeit
damit herumspielen,
anstatt
die Anwendung neu zu starten, ein paar Zahlen
auszuprobieren, sie erneut zu
starten, mehr Zahlen
auszuprobieren Sie können sehen, wie das
unmittelbare Fenster dieses Problem beschleunigt Sie können einfach eingeben,
was Sie wollen, und vielleicht versuchen Sie, einen Fehler oder ein Problem zu
finden Es bietet Ihnen eine wirklich schnelle, einfache und dynamische Möglichkeit diese
Probleme und Fehler
zu lokalisieren. diesem Grund ist das unmittelbare Fenster in diesem Sinne ziemlich cool. Aber wir können nicht nur
Methoden aufrufen und uns Werte ansehen, wir können auch
Werte zuweisen. Wenn wir uns den Wert
von Nummer eins ansehen, den der Benutzer eingegeben hat, ist fünf
und er gibt Nummer zwei ein
, also sechs. Und der Operator war ein Plus, also werden wir 11 bekommen. Was wir tun können, ist tatsächlich die Werte von Variablen zu
ändern. Anstatt fünf
zu sechs zu addieren und 11 zu erhalten, sagen
sie, dass Nummer
eins gleich 11 Jetzt ist Nummer eins gleich 11. Lassen Sie uns zum Beispiel Nummer zwei
gleich 12 machen. Und wir lassen den
Operator als Plus übrig. Jetzt haben wir zu
diesen beiden Variablen gewechselt. Lass uns jetzt hierher kommen. Wenn wir den Mauszeiger über
diese Variablen bewegen, können
Sie sehen, dass Nummer eins jetzt 11 und Nummer zwei jetzt 12 ist Wir haben die Werte
dieser Variablen im
Pausenmodus geändert , während die Software Lichtgeschwindigkeit
läuft, wie wir bereits erwähnt haben,
wir haben die
Dinge tatsächlich
zur Laufzeit geändert Es ist verrückt, nicht
wahr? Es ist unglaublich. Wenn ich jetzt fünf drücke und mit dem
Ausführen der Software
fortfahre, können
Sie sehen, dass das Ergebnis 23 ist. Der Benutzer hat 5.6 eingegeben, aber
wir sind da rein gegangen, paar Sachen geändert, ein paar Sachen geändert,
diesen auf 11 und
diesen auf 12 geändert. Sie können also sehen, dass das
Ergebnis die Änderung widerspiegelt , die wir
im unmittelbaren Fenster vorgenommen haben. Das ist also ziemlich cool, nicht wahr? Stellen Sie sich vor, das unmittelbare
Fenster ist wie ein kleiner Notizblock
, in dem Sie
herumspielen und
Dinge ändern und Dinge aufrufen können herumspielen und
Dinge ändern und Dinge aufrufen Das ist die Stärke des
Direktfensters in Visual Studio, wenn Sie mit C Shop
arbeiten
56. 11-3. Einheimische und Autos Windows: mit unserem
Thema Debugging fortzufahren, werde
ich über
das lokale Fenster und
auch über das Autofenster sprechen .
Was sind sie Nun, lokale Fenster und automatische
Fenster sind nur während einer
Debugging-Sitzung
verfügbar Wir müssen in den
Debug-Modus wechseln und uns
diese Fenster ansehen . Dann
zeige ich Ihnen, was sie für Sie zu bieten
haben Was ich jetzt tun werde, ich
werde einen Breakpoint hinzufügen. Hier ist meine einfache
Taschenrechner-Anwendung, mit der ich
Zahlen addiere, subtrahiere oder multipliziere Also verschiedene Dinge hier. Ich werde hier einfach ohne
besonderen Grund einen Breakpoint
setzen hier einfach ohne
besonderen Grund Dann werde ich
die Anwendung im
Debug-Modus ausführen , weil wir etwas debuggen
wollen, die Software läuft, sie
fragt mich nach zwei Zahlen Ich werde nur ein paar
Beispieldaten hineinlegen. Jetzt wurde der Code angehalten, ausgeführt und unser
Breakpoint wurde erreicht Jetzt
ist die Zeit der Software eingefroren
und wir können damit machen, was
wir wollen Wenn wir hier in
die untere linke Ecke kommen, können Sie
in meinem Fall sehen,
dass wir hier einige Tabs haben, verschiedene Tabs. Einer heißt Locals und einer
heißt Autos. Genau hier. Wenn Sie nichts davon sehen, gehen
Sie hier zum
Debug-Menü und gehen Sie zu Windows Und dann gibt es hier ein
paar Optionen namens Autos und Locals Jetzt werden Ihnen
diese Menüoptionen möglicherweise nicht angezeigt, es sei denn, Sie befinden sich in einer
Debugging-Sitzung Stellen Sie also sicher, dass Sie gerade debuggen und diese angezeigt
werden sollten Sie können auch diese
Tastenkombinationen verwenden, sobald Sie diese
Fenster hier unten sichtbar haben Diese Fenster bieten
einen Echtzeitblick auf die Variablen, als wir zuvor das
unmittelbare Fenster gesehen haben, in dem wir uns
Werte von Variablen
mit dem Fragezeichen ansehen konnten . Bevor wir uns vorstellen, dass es sich eine grafische Benutzeroberfläche für das unmittelbare Fenster handelt, was das
Lesen von Variablen
und Objekten und dergleichen angeht . Wie dem auch sei, Sie können sehen, dass ich
die Ausführung des Codes
in dieser Berechnungsmethode angehalten die Ausführung des Codes
in dieser Berechnungsmethode Hier haben wir bereits
Werte für Nummer eins, Nummer zwei und auch den Unser Ergebnis ist derzeit Null, weil wir keinen Wert festgelegt
haben. Wenn wir also in dieses
lokale Fenster hier schauen, können
wir all diese Werte für
diese Variablen in
einem einfachen Fenster sehen . So können wir deutlich
sehen, was der Benutzer uns gegeben
hat und was
das Ergebnis sein könnte. Nicht nur das, wenn wir hier
auf den Wert doppelklicken, können
wir diese
Informationen tatsächlich in Echtzeit ändern, genau wie zuvor
im Direktfenster können
wir diese Werte ändern. Ich gehe zum Ergebnis, ich
kann
das Ergebnis sogar ändern , bevor es
überhaupt initialisiert wurde Und nicht nur das ändert
den Operator, es gibt Ihnen nicht nur eine schreibgeschützte Ansicht,
Sie können
diese Variablen tatsächlich ändern und die Änderungen werden
während Ihrer Debugging-Sitzung widergespiegelt während Ihrer Debugging-Sitzung Das ist also ziemlich cool, nicht wahr? Also haben wir uns
hier
das lokale Fenster angesehen , in dem wir
unsere Variablen hier sehen und auch einige der Werte
ändern können . Jetzt sind diese
im aktuellen Gültigkeitsbereich verfügbar. Das bedeutet also, dass ich hier einen Grenzwert
gesetzt habe. Wir befinden uns innerhalb dieser Methode, das ist der aktuelle Geltungsbereich. Wir können hier auf diese
Variablen zugreifen, aber
außerhalb dieser Methode können wir nichts lesen. Es sind nur Dinge
im lokalen Bereich. Was ist für uns hier lokal? Das spiegelt sich in
der lokalen Registerkarte genau hier wider. Lassen Sie uns jetzt über das
Autofenster sprechen und auch wie sich das Autofenster
vom lokalen Fenster unterscheidet. Sie sind sich
in ihrem Verhalten ziemlich ähnlich. Sie können
Variablenwerte und ähnliches ändern. Sie können den Wert von
Variablen und Objekten anzeigen, aber warum unterscheiden sie sich? Das Autofenster hier zeigt Informationen
zur aktuellen Zeile an. Wenn ich sage, die aktuelle Zeile, der aktuelle Breakpoint, sehen
Sie, dass die Software hier angehalten
ist, was durch diesen gelb
hervorgehobenen Teil
angezeigt wird Wir können Variablen und
Objekte in dieser aktuellen Zeile sehen. Genau hier haben wir das Ergebnis. Nicht nur das, wir können auch
Informationen aus der
vorherigen Zeile einsehen . Jetzt können wir mit zehn Zahlen sehen, ob ich
das übertrete. Die Codeausführung
geht also zur nächsten Zeile über.
Sie können sehen, dass die Informationen in unserem Autofenster
geändert wurden. Der
Hauptunterschied zwischen Autos und Locals besteht darin
, dass
dir Autos die aktuelle Zeile und
die vorherige Zeile anzeigt und
Locals dir alles gibt, was
im aktuellen Gültigkeitsbereich ist . Sie können sehen, dass das
Locals-Fenster hier keine Nicht-Zeiten
enthält, weil
wir es hier oben definiert haben. Sie können also sehen, dass es sich um ein
statisches privates Feld unserer Programmklasse handelt, sodass es nicht
im lokalen Fenster angezeigt wird. Die Einheimischen sind für dich nur die
lokalen Dinge. Die lokalen Dinge
im Geltungsbereich und die Autos sind die aktuelle
Linie und die davor. Das ist der Hauptunterschied. Aber eine Sache, die ich noch nicht
besprochen habe, ist, dass sowohl lokale Fenster automatische Fenster Ausdrücke
auswerten können. Wenn ich zum Beispiel hierher gehe,
wo Ergebnis steht, kann
ich das tun, was wir in
dem unmittelbaren Fenster
getan haben , in dem wir
bestimmte Dinge bewertet haben. Ich könnte sagen, das Ergebnis
ist fünf plus vier, sodass Sie sehen können, dass das
Ergebnis neun ist. Ich kann auch
bestehende Variablen verwenden. Nummer eins zum Beispiel plus 567 und das wird ausgewertet, sodass Sie auch Ausdrücke sowohl
im lokalen als auch im automatischen Fenster
auswerten können sowohl
im lokalen als auch im automatischen Fenster Ich habe hier eine
Beispielanwendung eingerichtet , die
kompliziertere Objekte verwendet Ich habe eine
Videospielklasse, die in einigen Dingen
an den Konstruktor
übergeben wird in einigen Dingen
an den Konstruktor
übergeben Ich habe eine Liste von Benutzern, und ich füge dieser Liste drei
Benutzerobjekte hinzu und erstelle auch eine
Liste von ganzen Zahlen Also ziemlich komplizierte
Dinge hier drin. Ich habe ganz
am Ende einen Breakpoint gesetzt. Also werden wir
eine Debugging-Sitzung starten und dann
wird unser Breakpoint erreicht, und dann schauen wir uns
das lokale Fenster an, um zu sehen, wie das
aussehen könnte Ich werde das nur ein wenig
erweitern, damit wir ein bisschen besser sehen
können Du kannst hier sehen, das ist so
ziemlich alles hier. Jetzt habe ich diese
Pfeile. Schau mal, diese Spiele sind
kompliziertere Objekte. Ich kann einfach auf diesen Pfeil klicken. Ich kann tatsächlich
alle Immobilien
und verschiedene Dinge hier drinnen sehen . Jetzt
hat dieser Kleine ein Vorhängeschloss,
was bedeutet, dass es hier ein
privates Feld Aber da ist ein
kleiner Schraubenschlüssel dran,
was bedeutet, dass es ein Grundstück ist Ich kann die
Werte hier ändern,
sodass Sie sehen können, dass ich einen
Textvisualisierer verwenden kann, um mir das anzusehen, sodass ich mir die
Werte des Titels ansehen kann Wenn ich auf den Wert doppelklicke, kann
ich hier verschiedene
Dinge ändern Ich könnte sagen, dass einer
für einen Macintosh ist, genau wie früher, als wir
einfache Variablen hatten ,
einfache Werttypen Ich könnte die Werte ändern. Aber selbst bei komplizierten
Objekten wie diesem kann
ich auch die Werte ändern und auch
deren Hierarchie
ansehen. Für diese hier, die Benutzerliste,
kann ich sie erweitern. Und dann kann ich die
Mitglieder dort erweitern und verschiedene Namen und Altersstufen
und solche Dinge
ansehen. Es ist also sehr nützlich
und sehr mächtig. Während einer Debugging-Sitzung können
Sie den Status
all Ihrer Objekte,
unabhängig davon, ob es sich um komplizierte
oder einfache Werttypen handelt, oder direkt hier in einem grafischen
Fenster Es ist wirklich unglaublich. Und wenn wir uns die Registerkarte „Autos“ ansehen, sagte
ich, dass die automatische Registerkarte Informationen über
den aktuellen Breakpoint und
auch über die zuvor
ausgeführte Zeile
anzeigt den aktuellen Breakpoint und auch über die zuvor
ausgeführte Zeile In diesem Fall haben wir dieser roten Linie einen
Breakpoint hinzugefügt. Die letzte Anweisung, die
ausgeführt wurde, war diese Zeile genau hier. Daher wird dieses Objekt in unserem Autofenster
zur Verfügung gestellt . Wenn Sie eine wirklich
umfangreiche Software haben, vielleicht mit Hunderten
oder Tausenden von Objekten und Variablen
im aktuellen Gültigkeitsbereich, dann können Sie auch danach
suchen. Es ist also wirklich sehr
nützlich, wie das funktioniert. Und Sie können
eine Suchtiefe angeben, was einfach bedeutet, wie viele
Pfeile angezeigt werden können , an denen Ihre
Suchergebnisse erscheinen können. Sie können also sehen, dass es dort auch viele Tiefenoptionen gibt. Aber das ist wirklich das Prinzip hinter den Lokalen
und Autofenstern. Es ermöglicht Ihnen, Variablen anzuzeigen und
auch zu ändern. Aber im Gegensatz zum
Direktfenster hier bietet
es Ihnen eine nette grafische
Benutzeroberfläche, bietet
es Ihnen eine nette grafische mit der Sie arbeiten können. Außerdem erfahren Sie, wie diese Objekte aussehen, ob es sich um private Felder oder öffentliche Immobilien
handelt. In dieser Hinsicht ist es also wirklich sehr
nützlich.
57. 11-4. Windows und Quick Watch ansehen: Ich werde jetzt
über das Anschauen sprechen, und das bezieht sich wiederum auf das
Debuggen in Visual Studio Was ist eigentlich Zuschauen? Ich werde
über Quick Watch
und Watch Windows sprechen .
Also was sind sie? Wenn Sie sich mein anderes Tutorial
zu Locals und Autos unter Windows ansehen , funktioniert
es irgendwie sehr
ähnlich. Der einzige Unterschied zu
einem Beobachtungsfenster besteht darin, dass wir auswählen
können, was wir dort hinzufügen möchten. Aber nicht nur das, wir können Ausdrücke
auswerten. Also, was bedeutet das alles? Lass es uns überprüfen. Moment habe ich eine Beispielanwendung, unsere kleine
Taschenrechner-Anwendung. Wenn Sie
unseren anderen Tutorials gefolgt sind, habe
ich hier gerade einen zufälligen
Breakpoint hinzugefügt. Ich bin im Debug-Modus, ich trete in eine Debug-Sitzung ein Der Debugger ist an unsere Software
angehängt. Er fragt nach zwei Zahlen und einem Operator, fünf plus sechs Jetzt ist unser Breakpoint
erreicht, die Software ist eingefroren. Wir können die
Variablen jetzt untersuchen. Wir kommen hierher und haben
unser vertrautes lokales Fenster, in dem wir uns den Wert
der aktuellen Variablen
im aktuellen Gültigkeitsbereich ansehen
können . Nummer eins ist fünf,
Nummer zwei ist sechs, der Operator ist Plus und das Ergebnis ist 11. Dies sind Werte aller
Variablen im aktuellen Gültigkeitsbereich. Sehen Sie sich jetzt das Fenster an. Wenn wir zum Debuggen hierher kommen
und dann zum Fenster gehen
und dann
sehen Sie, dass dort Uhr
123.4 ist , bedeutet das, dass
wir bis zu vier Mal
Windows ansehen können , vier Sitzungen Lassen Sie uns darüber sprechen, was eine
Watch-Session eigentlich ist. Ich werde auf Watch One klicken. Und wenn wir hier runterkommen, können
Sie sehen, dass es einen
Watch One-Tab gibt , der
zusammen mit Einheimischen und
Autos erstellt
wurde , und jetzt
haben wir einen Watch One-Tab. Und du kannst hier sehen,
dass es heißt, Objekt zum Ansehen hinzufügen. Was bedeutet das? Nun,
wir können uns alles ansehen. Wir wollen eigentlich Variablen und Objekte
mögen. Wenn ich zum Beispiel hier zum Code komme
, haben
wir diese Variablen hier. Nummer eins ist Nummer zwei ist sechs. Wenn ich mit der rechten Maustaste auf Nummer eins klicke, kann
ich in diesem Menü
auf Uhr hinzufügen klicken. Ich werde genau das
Gleiche für Nummer zwei tun. Rechtsklick, Uhr hinzufügen. Wenn wir zum
Wachfenster hier unten kommen, können
wir sehen, dass es so
ziemlich wie das Fenster unserer Einheimischen funktioniert. Wir haben die Variablen, die
wir hinzugefügt haben, wir haben die Werte, und
wir können die
Werte auch ändern, wenn wir wollen. Sie fragen sich vielleicht, warum ich
nicht einfach
das lokale Fenster verwende? Es macht genau das Gleiche. Der
Hauptunterschied zwischen Watch-Fenster und
dem
Locals-Fenster ist die Uhr.
Sie können hinzufügen, was Sie wollen und Sie können auch Ausdrücke
hinzufügen. Ich könnte zum Beispiel
Nummer eins plus Nummer
zwei sagen und dann die Eingabetaste drücken. Ich habe hier einen benutzerdefinierten
Ausdruck hinzugefügt. Jetzt, während der gesamten Dauer meiner
Debugging-Sitzung, weiß
ich, dass der Wert von
Nummer eins plus Nummer zwei ist, oder ich habe
dort Nummer eins plus Nummer zwei eingegeben Wenn ich tippen lernen kann, ist es 11. Sie können sehen, dass ich hier
Ausdrücke eintragen kann. Ich könnte sagen, Nummer eins
multipliziert mit dem Ergebnis. Ich kann hier verschiedene
benutzerdefinierte Dinge einbauen. Dies ist so ziemlich einer
der Hauptunterschiede zwischen dem Wachfenster
und dem Fenster für Einheimische. Was waren das für Fenster mit der
Uhr 1234? Wenn wir wieder hierher kommen, um zu
debuggen, dann Windows,
dann schauen Sie zu und klicken Sie auf Watch,
um wieder hier runter zu kommen Jetzt haben wir einen weiteren Watch-Tab, dann können wir hier weitere
Variablen hinzufügen Jetzt
sind diese zusätzlichen Fenster so gut wie nur nützlich, wenn Sie eine
wirklich große Anwendung haben. Sie möchten
bestimmte Variablen von
anderen Variablen isolieren ,
damit sie besser
organisiert sind und Sie
nicht verwirrt werden. Wenn Sie vielleicht an
einer Taschenrechneranwendung arbeiten, möchten
Sie vielleicht all
Ihre beobachteten Variablen
in dieses Überwachungsfenster einfügen . Vielleicht hat die
Taschenrechner-Anwendung eine andere Funktion, die
etwas völlig anderes handhabt. Und dann fügst du hier deine
Watch-Variablen ein. Sie organisieren Ihre
Variablen und Ausdrücke. Sie können bis zu vier
Überwachungsfenster einrichten, wenn Sie möchten. Das ist einer der Vorteile und Stärken des Wachfensters. Sie können nicht nur
Variablen wie die
lokalen Fenster anzeigen und ändern , sondern hier auch
Ausdrücke hinzufügen. Das ist ziemlich cool. Sie sind nicht nur auf grundlegende Variablen
beschränkt. Sie können sogar Methoden aufrufen. Ich habe zum Beispiel eine
Methode namens Calculate. Und dann kann ich berechnen, sagen wir zum Beispiel vier plus acht. Und dann kann ich das
da reinschreiben und das wird auch
ausgewertet. Ausdrücke sind nicht nur
an einfache Variablen gebunden, sondern wir können hier auch ganze
Methodenaufrufen einfügen. Es ist wirklich mächtig
und auch sehr nützlich besonders beim Debuggen
ziemlich großer Anwendungen Und eine Sache, die ich
zu Beginn
dieses Tutorials erwähnt habe , war Quick
Watch. Was ist Quick Watch? Stellen Sie sich vor, Sie möchten sich nur
eine einfache Variable
sehr schnell ansehen . Angenommen, Sie möchten nur schnell den Wert
einer Variablen überprüfen . Das ist so ziemlich der einzige
Zweck von Quick Watch. Wenn ich zum Beispiel klicke auf Nummer
eins
und dann auf Quick Watch
oder Shift F neun schreibe und dann auf Quick Watch , erscheint
dieses Fenster. Und wenn dieses Fenster erscheint, können
Sie das Debuggen nicht fortsetzen Du.
Ich bin so ziemlich einfach hier drin geblieben. Hier sehe ich mir schnell
die Variable Nummer eins an, ich kann ihren Wert ändern, ich kann
alles neu bewerten, was ich will. Und ich kann auch jeden anderen Ausdruck ändern oder
eingeben. Ich könnte also sagen rechnen. Und hier ist auch
Autocomplete drin. Wenn ich also fünf
plus vier sagen und die Eingabetaste drücken möchte, kann
ich schnelle
Ausdrücke im Handumdrehen machen, aber du bekommst so einen
nervigen Dialog Und um ehrlich zu sein, bevorzuge
ich es, einfach
das Wachfenster zu benutzen , weil es alles
macht, was die
Schnelluhr tut. Aber ich hebe es nur
hervor, weil ich weiß, dass manche Leute es
vorziehen, es zu benutzen Ich persönlich bin mir nicht sicher warum. Aber es ist da, wenn du es brauchst. Das ist also im Wesentlichen
die Botschaft ich zu vermitteln versuche. Aber das Wachfenster macht
alles, was Quick Watch kann. Das ist also das Leistungsspektrum von
Watchfenstern in C Sharp.
58. 12-1. Der geschützte Access-Modifier: Ich möchte über den
letzten Zugriffsmodifikator sprechen , den wir
noch nicht besprochen und der geschützt ist Wir haben über
öffentlich, privat und
intern gesprochen , aber jetzt werden
wir über geschützt sprechen Nun, geschützt ist ein
Schlüsselwort, das im Allgemeinen verwendet wird, wenn Sie
Klassen in C Sharp erben Wenn Sie also
das Tutorial, das ich zur Vererbung gemacht
habe, nicht gesehen haben und wenn wir schon
dabei sind, wenn Sie
das Tutorial, das ich zum
Einrichten mehrerer
Projekte in Visual Studio gemacht habe, nicht gesehen haben, dann empfehle ich
Ihnen dringend, sich diese zuerst anzusehen Hier haben wir ein sehr
einfaches Beispiel. Ich habe hier eine Hauptklasse. Hier werden nur vier
Videospielobjekte eingerichtet. Wenn wir uns den
Videospielkurs hier ansehen, ist
nicht viel los. Sie hat ein privates Feld
und einen Konstruktor und
erbt hier von einer Klasse, die auf dem
Hauptspiel basiert Und von hier aus wird der
Spielekonstruktor aufgerufen. Sehr einfach, nichts, was wir nicht
schon einmal gesehen haben. Wenn wir uns die Basisklasse ansehen, hat
sie drei private Felder. Es hat einen Konstruktor, eine öffentliche Beispielmethode und hier ein paar Beispiele für
öffentliche Eigenschaften. Hier passieren hier viele öffentliche
Dinge. Nun, das Schlüsselwort protected gilt für Methoden wie diese und auch für Eigenschaften. Wenn etwas als geschützt
markiert ist, es nur
der aktuellen Klasse zur Verfügung , zum Beispiel
Game und allem, was davon
abstammt , all ihren untergeordneten Denk drüber nach. Wenn Sie wie
die Mutter einer Familie sind, dann möchten Sie zum Beispiel nur
geschützte Dinge mit
Ihren Kindern oder Ihren
Enkelkindern teilen Beispiel nur
geschützte Dinge mit
Ihren Kindern oder Ihren
Enkelkindern Stellen Sie sich das so vor,
es ist momentan geschützt. Das ist eine öffentliche Methode. Hier. Alles, was es tut, bekommt den Namen
und verbindet einige Fäden und den Herausgeber, im
Moment ist es öffentlich. Wir können also von überall
darauf zugreifen. Wir können von
unserem Hauptprogramm aus darauf zugreifen. Wir können vom
Videospiel aus darauf zugreifen, kein Problem. Was ich tun werde, ich
werde es schützen,
damit Sie sehen können, dass es
das geschützte Schlüsselwort gibt. Jetzt habe ich das gemacht. Wenn ich
diese Klasse hier instanziiere, Spiel aus der Hauptklasse Jetzt ist die Hauptklasse
kein Kind dieser Klasse,
dann wird sie es auch nicht sein Lass mich das machen, lass
mich dir das beweisen. Jetzt können Sie hier sehen, wann ich
versuche, auf die Methode zuzugreifen, sie ist überhaupt nicht in
dieser Liste enthalten. Und schau dir an, was passiert, wenn
ich trotzdem versuche, darauf zuzugreifen automatische
Vervollständigung von Visual
Studios ignoriere Wenn ich mit der Maus darüber fahre, wird angezeigt,
dass aufgrund der Schutzstufe nicht darauf zugegriffen Und das liegt daran, dass
es geschützt ist. Es ist also nur in
der aktuellen Klasse oder in den
untergeordneten Klassen dieser Klasse verfügbar . Zum Beispiel Videospiel, Videospiel ist eine Kinderklasse weil wir von dort
erben Wenn wir zum Beispiel einfach Base sagen, dann greifen wir auf die
Basisklasse zu, die Game ist Jetzt können wir diese
Methode sehen, sie ist in der Liste, und wenn wir versuchen, darauf zuzugreifen, gibt es überhaupt keine Fehler. Das ist die Stärke des
geschützten Schlüsselworts in C Sharp. Aber es gibt ein paar
Kombinationen , die
tatsächlich mit protected kombiniert werden können, und zwar sowohl geschützt intern auch geschützt privat, geschützt privat und
geschützt intern. Dies sind ein paar
Kombinationen, die wir verwenden können wenn wir uns mit dem
Protected Access Modifier befassen Wir können also grundsätzlich Zugriffsmodifikatoren
verdoppeln,
aber nur, wenn wir protected verwenden Sie können hier sehen, dass
wir es allein in
drei Kombinationen verwenden können , was wir
bereits besprochen haben Es ist in
derselben Klasse erhältlich. Methoden und Eigenschaften
sind in
derselben Klasse
oder in einem ihrer untergeordneten Klassen verfügbar . Das haben wir
als Nächstes besprochen, Protected Private. Wenn etwas
als geschützt oder privat,
als Methode oder Eigenschaft markiert ist , dann kann
in derselben Assembly darauf zugegriffen werden, aber auch von
derselben abgeleiteten Klasse aus. Wenn sich unsere Spieleklasse hier im selben Projekt, in
derselben Assembly wie unser Kind
befindet , was ein Videospiel wäre. Wenn sie
im selben Projekt, in
derselben Assembly existieren , dann
können wir diese Methoden verwenden. Wenn sich diese Spieldatei
hier jedoch in einem anderen Projekt befand, können wir nicht auf die
Methoden und Eigenschaften
dieser untergeordneten Klasse zugreifen , die privat geschützt
ist. Lassen Sie mich Ihnen
ein Beispiel dafür zeigen. Jetzt markiere ich Publisher. Das ist hier eine Ladenimmobilie. Herausgeber, ich werde es als privat geschützt
vermarkten. Wenn diese Klasse nun außerhalb
der aufrufenden Assembly existiert, wo auch immer wir
sie verwenden wollen, wird sie nicht funktionieren. Schauen wir uns ein
Beispiel an, wie das funktioniert. Wir können Herausgeber sagen. Wir können darauf zugreifen, kein Problem. Wenn ich einfach sage, dass string
something gleich publisher ist, ist das kein Problem,
weil wir darauf zugreifen können Lassen Sie mich diese Klasse jetzt hierher verschieben. Öffentliche Klasse, Hauptunterricht, außerhalb
der aktuellen Versammlung. Wenn Sie mein Tutorial zu mehreren
Projekten gesehen
haben, wissen Sie wahrscheinlich,
wie das geht. Wenn wir hier auf
die rechte Seite kommen, bekommen
wir unsere Spielklasse. Die übergeordnete Klasse ziehe ich
einfach per
Drag-and-Drop in das zweite
Projekt, das ich eingerichtet habe. Das Prinzip ist, dass ich es jetzt
einfach nicht mehr in
diesem Projekt haben will ,
ich werde es löschen. Jetzt ist das Spiel in diesem ganz
anderen Projekt hier drüben. Jetzt ist das Spiel hier in einer ganz
anderen Baugruppe. Wir können hier zu unserem
Videospielkurs zurückkehren, sich in der anderen Assembly befindet. Gehen Sie jetzt hierher, Sie können
sehen, dass ein Fehler aufgetreten ist. Es kann also immer noch das Spiel finden weil wir auf
die anderen Projekte verweisen, sodass es weiß, wo es ist. Sie können sehen, dass wir von dort
erben. Jetzt ist jedoch eine rote
Linie aufgetaucht. Und wenn Sie mit der Maus darüber fahren, wird
angezeigt, dass der Herausgeber aufgrund
seiner Schutzstufe
nicht zugänglich ist aufgrund
seiner Schutzstufe
nicht zugänglich Das liegt daran, dass wir
es privat und geschützt haben. Wenn etwas
privat geschützt ist, muss
es sich in
derselben Assembly befinden, also im selben Projekt. Und es muss ein Nachkomme
dieser Klasse sein , die privat
geschützt ist. Jetzt verstehen wir
protected private, dieselbe Assembly und ein untergeordnetes Objekt.
Es ist sehr einfach zu erklären, was Protected Internal ist. Dass es ein
beliebiger Nachkomme der Klasse sein kann , aber es kann sich auch in
jeder anderen Assembly befinden. Es spielt keine Rolle, wo zum Beispiel die
Basisklasse befindet. Es könnte in einem ganz
anderen Projekt sein. Aber solange es intern
geschützt ist, sollten
wir darauf zugreifen können. Im Moment haben wir diesen Fehler aufgrund der Schutzstufe, weil sich Videospiel und Spiel in unterschiedlichen Baugruppen
befinden. Ich gehe zurück zum Spiel mache diese Eigenschaft jetzt hier zu „
geschützt“, „intern“ oder „
intern geschützt“. Also habe ich das dort eingerichtet,
ich gehe zurück zum Videospiel, und jetzt können Sie sehen, dass der
Fehler behoben ist. Das ist also der Unterschied
zwischen privat geschützt und
intern geschützt. Es bedeutet nur, dass sich die
Basisklasse
entweder in derselben Assembly
oder nicht in derselben Assembly befinden muss. Das sind also die drei
Zugriffsmodifikatortypen wenn es um protected geht, also um die Basisklasse
und ihre untergeordneten Und dann können wir es mit
private oder internal
verdoppeln ,
je nachdem , ob sich die Basisklasse in
derselben Assembly oder
einer anderen Assembly befindet derselben Assembly oder
einer anderen Assembly Das ist also der geschützte
Zugriffsmodifikator im Shop.
59. 12-2. Das statische Schlüsselwort: Jetzt werde ich
über das statische Schlüsselwort sprechen. Möglicherweise haben Sie
dies gesehen, wenn Sie unseren anderen Tutorials gefolgt sind . Dieses kleine Schlüsselwort hier heißt statisch, was
bedeutet das? Was macht es? Und
warum sollten wir es benutzen? Schauen wir uns
dieses Beispiel hier an. Ich definiere
hier nur vier
Videospielobjekte und rufe den Konstruktor
mit drei Parametern Wenn ich in die
Videospielklasse schaue, hat
sie nur drei
private Felder Hier ist der Konstruktor, der die privaten Felder
festlegt. Ich habe
hier nur eine Beispielmethode , die den Titel zurückgibt Und hier nur eine
Beispieleigenschaft, die den Herausgeber einfach sehr einfach macht. Wenn ich zum Beispiel einen Kurs wie
diesen habe, wie würde ich dann vielleicht die Anzahl
der Videospiele, die
ich in meiner Sammlung habe, auflisten die Anzahl
der Videospiele, die
ich in meiner Sammlung habe Dies ist nur ein
Beispiel dafür, was ich jedes Mal
tun könnte , wenn ich
die Videospielklasse instanziiere Ich könnte den Überblick über einen Zähler behalten. Dieser Zähler kann aufzeichnen, wie
viele Videospiele ich habe In meiner Sammlung
initialisiere ich einen Zähler auf Null. Jedes Mal, wenn ich
ein Videospiel erstelle, kann
ich den
Zähler um Ich könnte zum Beispiel
so etwas machen. Das würde vollkommen gut funktionieren. Aber es sieht nicht
sehr elegant aus, oder? Nicht nur das, es folgt auch
nicht wirklich den Prinzipien der
Abstraktion Wir möchten
diesen Zähler vielleicht in der
Videospielklasse
verstecken, zum Beispiel Wie würden wir das erreichen? Wie könnten wir das tun
, wenn wir in
dieser Videospielklasse
einen Zähler einrichten in
dieser Videospielklasse
einen Zähler würden,
zum Beispiel hier. Dann inkrementiere
ich im Konstruktor
für diese Klasse den Zähler um eins Das Problem ist jedoch, dass dieser Zähler
zu jeder Instanz gehört Wenn ich also hierher gehe und vom ersten Spiel aus
auf den Zähler zugreifen kann, aber er wird nur den Wert eins haben
, weil der Zähler zu
jeder einzelnen Instanz gehört. Wie kann ich also
einen globalen Zähler haben, etwas innerhalb dieses
Videospiels, das
die Anzahl der Instanzen
dieser Klasse aufzeichnet, die wir erstellen. Und hier kommt das
statische Schlüsselwort ins Spiel. Wenn wir das statische Schlüsselwort verwenden, können
wir es für Konstruktoren verwenden, wir können es für Felder verwenden, wir können es für Methoden verwenden und wir können es
sogar für die gesamte Klasse verwenden zum Beispiel Wenn ich zum Beispiel dieses
Zählerfeld als statisch definiere, dann wird dieses Feld von
allen Instanzen
gemeinsam genutzt , die mit dieser Klasse
erstellt wurden Es ist ein Feld auf Klassenebene. Alles, was in
der Klasse statisch ist, gehört auf Klassenebene und nicht auf
Instanzebene wie hier. Zum Beispiel. Schauen wir uns ein
Beispiel dafür an. Jedes Mal, wenn ich hier ein
neues Videospiel erstelle, möchte
ich in meinem Konstruktor einen Zähler haben
, der um eins erhöht wird Dadurch wird die Anzahl der
Videospiele in
unserer Sammlung gespeichert Was ich zum Beispiel tun könnte, ich könnte hier einfach eine
Beispielzeile machen, die auf
die Konsole schreibt, wie viele Videospiele wir in unserer Sammlung haben Jedes Mal, wenn ich
ein neues Objekt der
Videospielklasse konstruiere , erhöhe
ich den Zähler
, der statisch ist und sich auf
Klassenebene jedes Mal um eins Dann gebe ich im Konsolenfenster eine Meldung aus,
die nur ausdrückt, wie viele
Spiele ich in
meiner Sammlung habe , wenn
ich dieses Programm starte Jedes Mal. Das ist hier so aufgebaut, weil wir eine neue Instanz
erstellen Der Zähler wird jedes
Mal um eins erhöht Schauen wir uns das an.
Jetzt können Sie hier sehen, dass er jedes Mal um eins erhöht dieser Zähler
von all diesen Instanzen gemeinsam genutzt wird Hier ist es ziemlich clever, wie
das statische Schlüsselwort funktioniert. Was wir zum Beispiel auch
tun können,
ist, eine statische Methode zu verwenden. Zum Beispiel kann ich
eine statische Methode erstellen , die
das Ergebnis meines Zählers abruft. Schauen wir uns
das an. Stattdessen werde ich diese Zeile hier entfernen. Im Moment werde ich eine statische Methode
erstellen. Was diese Methode macht, sie gibt
nur den Zähler zurück. Und es ist eine Methode auf Klassenebene, das heißt, wir greifen von
der Klasse aus darauf zu und nicht von einer Instanz aus. Schauen wir uns das jetzt
an. Wenn ich hier ins
Hauptprogramm gehe, wenn ich
zum Beispiel zu Spiel eins gehe, ist Spiel
eins jetzt eine Instanz. Diese Methode wird nicht in dieser Liste
erscheinen. Sie können sehen, dass es hier keine Methode zum
Abrufen von Zählern gibt. Das liegt daran, dass es sich um
ein Klassenniveau handelt. In diesem Fall müsste ich den Namen der Klasse
eingeben. Sobald ich dann einen Punkt hinter
den Namen der Klasse gesetzt habe, sind das hier alle Mitglieder der
Klassenebene. Sie können diese Methode
hier sehen, die als Get Counter bezeichnet wird. Es ist eine Klassenebene,
keine Instanzebene. Und jetzt können wir die Anzahl der Videospiele in unserer
Sammlung auf diese Weise ermitteln. Wenn wir
das auf der Konsole ausgeben wollen, können
wir
diese Methode einfach hierher kopieren, sie hier
platzieren und dann das Semikolon
löschen. Jetzt werde ich
die Anwendung ausführen. Sie können sehen, dass wir
ein ähnliches Ergebnis haben. Es geht nur darum,
die Gesamtzahl
der Videospiele in meiner Sammlung zu ermitteln. Und ich weiß zu schätzen, dass ich die
Sammlung falsch buchstabiert habe , aber
niemand ist perfekt Das ist ein Beispiel
für eine statische Methode und auch ein statisches
Feld in C Sharp Vielleicht macht dieses statische Schlüsselwort
, das wir bisher
in
all unseren Tutorials gesehen haben, langsam Sinn. Jetzt
heißt unsere Hauptklasse hier Programm. Standardmäßig gibt es eine Methode
namens main, die statisch ist. Diese Hauptmethode ist eine Methode auf
Klassenebene. Standardmäßig ist es die
erste Methode, die ausgeführt
wird, wenn
das Programm ausgeführt wird. Wenn ich hier
zum Beispiel eine neue Methode erstelle , habe ich gerade
eine Methode wie diese erstellt. Ich versuche, diese
Methode von main aus aufzurufen. Dies ist eine statische Methode. Dies ist keine statische Methode. Beobachten Sie, was passiert. Sie können also sehen, dass es hier eine rote Linie gibt. Wenn ich mit der Maus darüber fahre, wird angezeigt,
dass die
Objektreferenz für den Test
des nichtstatischen Feld- oder
Eigenschaftenprogramms erforderlich ist Test
des nichtstatischen Feld- oder
Eigenschaftenprogramms Das liegt daran, dass wir
eine nicht statische Methode
von einer statischen Methode aus aufrufen eine nicht statische Methode
von einer statischen Methode , was nicht erlaubt ist Wenn etwas nicht statisch ist handelt es sich um eine Methode
auf Instanzebene. Weil wir uns in
einer statischen Methode befinden. Hier gibt es keine
Instanz, mit der wir arbeiten
können, wir haben keine Instanz erstellt, wir befinden uns nicht innerhalb einer
Methode einer Instanz. Es hat nichts mit
Instanzen zu tun, die hier vor sich gehen. Wir befinden uns in einer statischen Methode, aber wir versuchen,
eine Methode auf Instanzebene aufzurufen. Es wird nicht funktionieren. In solchen Fällen
müssten Sie eine Instanz erstellen. Dies ist nur ein Beispiel. Wie dem auch sei, ich würde
Ihnen nicht empfehlen,
eine Instanz der
Programmklasse zu erstellen , aber es hilft nur meiner
Erklärung hier. Sobald ich die Instanz
vor diese Methode
auf Instanzebene gestellt habe , können
Sie sehen, dass der Fehler behoben
wurde, da alles, was nicht statisch ist, zu einer Instanz gehören
sollte, es ist eine Instanzebene. Stattdessen könnten wir diese
Methode auch einfach als statisch verspotten. Auf diese Weise ist es völlig in Ordnung,
einen statischen
Methodentest von einer anderen statischen
Methode aus aufzurufen . Eine andere Sache, die wir mit
dem Schlüsselwort static tun können , ist,
eine ganze Klasse als statisch zu markieren. Was wir tun, wir nehmen
das statische Schlüsselwort und platzieren es neben der
Klassendefinition ganz oben hier. Wenn Sie das tun,
muss
auch alles in der Klasse hier statisch sein. Denn wenn Sie
dies auf Klassenebene definieren, bedeutet das, dass alles
darin statisch sein muss. Aus diesem Grund tauchen all diese
Fehler hier auf. Das
Wichtigste beim Markieren der Statik
einer Klasse
ist jedoch , dass wir keine Instanzen
statischer Klassen
erstellen können . Sie sind abstrakt und implizit
versiegelt. Wenn Sie sich an eine
abstrakte Klasse erinnern, können
Sie keine
Instanz davon erstellen Und wenn Sie sich an
eine versiegelte Klasse erinnern, können
Sie nicht von ihr erben Das ist also implizit, deshalb haben wir
hier
all diese Fehler , wenn wir
eine neue Instanz erstellen, sodass wir das nicht mehr tun können Schauen wir uns an, wie diese Klasse in eine
rein statische Klasse umwandeln sich an und schnallen
Sie sich an. Lass uns gehen. All diese privaten
Felder müssen statisch sein. Jetzt muss unser Konstruktor
in einer statischen Klasse statisch sein Statische Konstruktoren
können jedoch keine Zugriffsmodifikatoren haben. Wir können dort kein Publikum haben. Außerdem kann es keine Parameter haben. Lassen Sie uns auch diese beiden entfernen. Dieses Schlüsselwort ist irrelevant
, da es nur mit Instanzen zu tun hat
, die auch gehen müssen. Nun müssen alle unsere Methoden und
Eigenschaften auch statisch sein, und das sollte auch reichen. Dies ist ein Beispiel für eine
statische Klasse hier. Jetzt fragst du dich vielleicht, naja, wenn ich
diese Klasse nicht instanziieren kann, wie heißt dieser
Konstruktor
dann überhaupt, zum Beispiel, was ist
hier los Nun, wenn Sie
die Anwendung ausführen und
auf diese Klasse zugreifen, wird
dieser Konstruktor standardmäßig die Anwendung ausführen und
auf diese Klasse zugreifen, wird
dieser einmal
von der Laufzeitumgebung ausgeführt von der Laufzeitumgebung Dies wird einmal
automatisch ausgeführt. Alles hier im Konstruktor,
der statische Konstruktor sollte alle Variablen oder
alles, was Sie tun möchten,
initialisieren Das ist der Zweck eines statischen Konstruktors
in
einer statischen in Wenn wir hier
zu unserer Hauptdatei kommen, können
Sie sehen, dass wir keine
Instanzen der statischen Klasse erstellen können Instanzen der statischen Klasse Wir können nur auf Klassenebene auf
Dinge zugreifen. Jetzt habe ich alles
als statisch markiert,
die Eigenschaften , die Methoden, so bezeichnen
wir die Klasse quasi. Wir setzen den Klassennamen wie
zuvor und dann einen Punkt. Dann können wir hier auf
verschiedene Dinge zugreifen. Und jetzt, da es keine
Instanzen für diese Klasse gibt, werden
all diese Mitglieder
einmal existieren , weil das
der Sinn von Static ist. Wir können einen Herausgeber festlegen
und darauf zugreifen. Außerdem können wir die Anzahl unserer
Videospiele ermitteln wie wir es
zuvor getan haben. Das ist kein Problem. Nur um zu beweisen, dass der
Konstruktor einmal ausgeführt wird, schau dir diese Methode
hier an, wo ich
den Zähler für die Anzahl
der Videospiele erhalte , die ich habe Ich werde
diese Methode einfach duplizieren , also wird
sie zweimal aufgerufen Ich werde hier zwei
Breakpoints setzen. Der Code stoppt, wenn
diese Zeile erreicht wird, und geht
dann in den Konstruktor und setzt dort
einen Breakpoint Ich werde jetzt
die Anwendung ausführen, damit Sie sehen können, was passiert Jetzt wurde der Konstruktor
nicht ausgeführt, aber der Bruch befindet
sich in dieser Zeile hier. Das Videospiel bekommt keinen Zähler. Wenn ich darüber hinweggehe, siehst
du, dass der Konstruktor
hier aufgerufen wird Wenn ich darüber hinweggehe, bekommen
wir den Zähler und wir
gehen zur nächsten Zeile Wenn ich drüber gehe, siehst
du, dass nichts passiert. Der Konstruktor wird hier in dieser ersten Zeile nur
einmal aufgerufen und bei
nachfolgenden Aufrufen von Methoden, die auf Klassenebene
existieren, ignoriert die auf Klassenebene
existieren, Ich hoffe, das hat Sinn gemacht. Es ist ziemlich viel zu verarbeiten, aber das ist der Sinn
der statischen Schlüsselwörter, um so ziemlich alles
, was
Sie wollen, auf Klassenebene Das Konzept der Instanzen wird in diesem Fall in dieser Hinsicht so gut wie
ignoriert. Ich habe Ihnen ein Beispiel dafür gegeben, wie statische Konstruktoren auch funktionieren Der Konstruktor wird
automatisch aufgerufen,
wenn Sie eine
Methode oder ein Element berühren, und dann wird er bei
allen nachfolgenden Aufrufen ignoriert Danach hoffe ich, dass dir
das hilft. Das ist die Stärke des
statischen Keywords im Shop.
60. 13-1. Das readonly-Keyword: In diesem Tutorial werden
wir uns
das
Schlüsselwort readonly in C Sharp ansehen Was macht nun das Schlüsselwort
Read Only? Nun, das
Schlüsselwort read only ist ein sogenannter unveränderlicher Datentyp.
Was bedeutet das? Das bedeutet, dass Sie, sobald Sie einen Wert
in einer Variablen oder
einem Feld festgelegt
haben , diesen
Wert nicht mehr ändern können, sobald er einmal festgelegt wurde. Was bedeutet das alles und welche anderen Bedingungen sind
an diesem Prozess beteiligt? Schauen wir uns ein kleines Beispiel
an. Hier habe ich eine Klasse namens Dog Dog, die einen Konstruktor hat , der ein
Argument namens Breed verwendet, was die Rasse des Hundes ist Wie zum Beispiel ein Terrier oder ein
Chihuahua. Ich habe zwei private Felder
hier, Rasse, und ein weiteres, das
nur eine eindeutige ID
für jeden Hund darstellt für Und dann habe ich ein öffentliches
Eigentum, das die Hunderasse mit dem Wissen,
das
wir bisher gesammelt haben, erfasst und auch festlegt . Wenn wir wollen, dass Benutzer
sagen können, den
Wert der Rasse ermitteln, aber nicht den Wert festlegen,
wollen wir, dass er nur dann gelesen wird. Wenn wir zum Beispiel eine Eigenschaft
wie diese haben, die dieses
private Feld hier verfügbar macht, dann würden wir diese
SET-Klausel einfach hier
entfernen Wenn wir versuchen,
Informationen in die Rasse zu integrieren, werden
sie nicht in Buchstaben Wenn ich mich also für eine Hunderasse
entscheide und dann versuche, ihr einen Wert zu geben, ist es nicht wirklich wichtig, was wir hier angeben. Wir haben einen Fehler. Wenn wir das herausfinden, heißt es,
dass es nicht
zugewiesen werden kann, es ist nur lesbar Das ist ein Beispiel dafür
, wie man beispielsweise eine Eigenschaft in C Sharp schreibgeschützt Aber warte. Zu Beginn
des Tutorials hast du über Felder
und Variablen und solche
Dinge gesprochen . Wie mache ich das mit
dem Schlüsselwort read only? Nun, lassen Sie uns einen Blick darauf werfen. Gehen wir zurück in
den Hundeunterricht. Jetzt verwende ich das Schlüsselwort Read Only. Ich werde
diese Änderungen rückgängig machen und diese Set-Klausel
wieder hier
einfügen. Also setzen wir jetzt den Wert, aber jetzt werde ich
dieses Feld hier als gelesen markieren. Erst wenn ich das getan habe, können
Sie sehen, dass hier ein Fehler
aufgetreten ist. Es erlaubt mir nicht mehr, die Set-Klausel zu
verwenden. Wenn ich mit der Maus darüber fahre, heißt
es, dass ein schreibgeschütztes Feld
nicht zugewiesen werden kann, dann gibt es hier eine kleine
Bedingung, außer dass
wir es in einem Konstruktor wie
hier innerhalb eines Konstruktors zuweisen können und außer es ist nur
ein hier innerhalb eines Konstruktors zuweisen können und außer es ist nur Setter des Typs, in dem
das Feld definiert ist, oder Was bedeutet das alles? Es heißt im Grunde, wenn Sie das Schlüsselwort read only
verwenden, können
Sie es einmal definieren. Zum Beispiel könnten wir
es hier definieren und hier initialisieren. Sagen wir einfach, jeder neue Hund
ist zum Beispiel ein Chihuahua. Das ist überhaupt kein Problem. Wir legen es tatsächlich fest, aber wir tun es,
wenn wir es deklarieren. Wir deklarieren die Variable hier, aber wir initialisieren
sie auch, was erlaubt ist Die andere Sache, die wir auch tun
können, ist, sie
in einen Konstruktor
wie Inside Dog zu setzen in einen Konstruktor
wie Inside Und wir können das
mehrmals machen. Solange es sich in einem
Konstruktor befindet, ist es okay. Wir können es 1.000
Mal machen, wenn wir wollen, aber wir können das nicht intern festlegen, zum Beispiel diese Eigenschaft hier. Wir können zum Beispiel nicht sagen, eine
brandneue Methode erstellen und
sie hier einstellen . Das wird nicht funktionieren. Du verstehst den Sinn hier. Selbst wenn wir
von außerhalb unserer Klasse darauf zugreifen, mache
ich es einfach in Kleinbuchstaben. Um nun auf das Feld zuzugreifen, können
Sie sehen, dass es nicht der Annahme
eines Konstruktors
zugewiesen werden kann Annahme
eines Konstruktors
zugewiesen Das ist also die Stärke des
Schlüsselworts Read Only. Und es gibt eine Reihe
von Gründen, warum Sie diese verwenden sollten, wenn Sie mit
unveränderlichen Datentypen
wie dem Schlüsselwort read only arbeiten wie dem Schlüsselwort read only Sie möchten diese für Dinge verwenden , die Sie vielleicht einmal einrichten
möchten, aber dann möchten Sie den Wert nie
ändern Das liegt daran, dass ich zum Beispiel, wenn ich eine eindeutige
Hunde-ID generiere, das nur einmal mache, aber dann möchte ich nicht, dass sich
diese ID ändert, weil jedem Hund eine eindeutige
ID zugeordnet ist. Wenn ich anfange, die Ausweise
von Hunden zu ändern, dann kennen
Sie zum Beispiel, wenn wir eine
Software haben, die Hunde verfolgt, wenn wir eine
Software haben, die Hunde verfolgt, die Hunde, die
das Halsband tragen. Und wenn der Hund sich verirrt, können sie das
Halsband oder den Mikrochip scannen Und dann verwendet es die ID
, um vielleicht auf
eine Datenbank zu verweisen und herauszufinden , wer der Besitzer
des Hundes ist Vielleicht sollten Sie das nicht nur
lesen, dann haben wir vielleicht eine Eigenschaft oder jemand diese Anwendung
aufruft, könnte versehentlich die ID ändern, was katastrophale Folgen haben könnte Aus diesem Grund werden im Allgemeinen unveränderliche
Datentypen verwendet. Wir möchten verhindern
, dass andere Entwickler oder sogar Benutzer der Software diese Werte ändern Aber für so etwas wie eine ID, bei der wir
für jeden Hund in unserem System eine eindeutige ID generieren, ist
es sehr wichtig, dass wir
Felder wie diese schreibgeschützt machen . Es hängt also wirklich
ganz von Ihrem System ab
, was Sie tun möchten. Aber es ist wirklich eine gute
Praxis zu sagen, wenn Sie Variablen oder Felder haben , die
die Benutzer nicht ändern sollen, dann machen
Sie diese zum Beispiel immer schreibgeschützt. Das ist also eine Möglichkeit,
dieses Problem zu lösen. Eine weitere Bedingung, die
mit dem Schlüsselwort read only zu tun hat, beispielsweise, dass es
nur für Felder verwendet werden kann. Denken Sie jetzt daran, dass Felder
das sind, was in Klassen
direkt unter der
Klassendeklaration definiert wird. Wenn ich
hier in mein A-Hauptprogramm gehe und es in einer Methode verwende. Wenn ich das
innerhalb einer Methode definiere und dabei natürlich private entferne, dann können Sie sehen, dass es ein Problem
gibt. Wenn ich mit der Maus darüber fahre, wird angezeigt, dass der Modifikator „
Nur lesen “ für diesen Artikel nicht gültig ist Das heißt im Grunde, okay, Sie können das Schlüsselwort
read only nicht innerhalb einer Methode verwenden, aber wir können es
auf Klassenebene verwenden Zum Beispiel können wir es
hier verwenden und es ist überhaupt kein Problem. Das wird gut funktionieren. Aber wir können
diese internen Methoden nicht verwenden. Es gibt ein anderes Schlüsselwort, das wir vielleicht dafür verwenden
könnten, und das ist das konstante Schlüsselwort , über das wir ebenfalls
sprechen werden. Das Letzte, worüber ich mit Read
Only
sprechen möchte , ist, wann wir den Wert festlegen
können. Wir können den Wert
zur Kompilierzeit setzen, was bedeutet, dass wir ihm in
unserem Entwicklungsmodus einen Wert
geben können , wenn
die Software kompiliert wird, wenn die Prüfung abgeschlossen ist Ich kann Rot einen Wert geben, hier kann
ich Chihuahua sagen und Das ist zur Kompilierzeit. Auch hier setzen
wir im Konstruktor diesen Wert Wir können den Wert jedoch auch zur
Laufzeit
ändern , wenn die
Software ausgeführt wird Wir können jedoch auch während der Laufzeit, wenn unsere Software tatsächlich
läuft,
ein
schreibgeschütztes Feld initialisieren während der Laufzeit, wenn unsere Software tatsächlich
läuft,
ein
schreibgeschütztes Feld Laufzeit, wenn unsere Software tatsächlich
läuft,
ein
schreibgeschütztes Wenn wir dieses
Hundeobjekt genau hier konstruieren, wird
der Konstruktor aufgerufen und dann wird diese Codezeile Und das passiert während der Laufzeit, wenn unsere
Software läuft Wenn ich die Software starte, können
Sie sehen, dass sie diesen
Wert im Konstruktor festlegt Es gibt keine Fehler
und es ist kein Problem. Wir können zur
Kompilierzeit und zur Laufzeit an zwei verschiedenen Stellen ein
schreibgeschütztes Feld einrichten . Aber das ist das
Nur-Lese-Schlüsselwort in C Sharp und warum Sie es verwenden sollten
und auch, wie Sie es verwenden können.
61. 13-2. Das const Keyword: Ich werde über
das konstante Schlüsselwort in C Sharp sprechen konstante Schlüsselwort in C Sharp Es sieht ungefähr
so aus. Was ist das? Nun, das Schlüsselwort constant ist ein weiterer unveränderlicher Datentyp Wenn Sie sich mein Tutorial
zum Schlüsselwort Read Only angesehen haben, wird es viel einfacher sein,
das Constant-Schlüsselwort zu verstehen wird es viel einfacher sein,
das Constant-Schlüsselwort zu In diesem Tutorial werde
ich das Constant-Schlüsselwort
erklären, aber auch
die Unterschiede
zwischen Constant
und Read Only aufzeigen , da viele Leute
verwirrt sind, welche
sie wann verwenden sollten. Schauen wir uns
das konstante Schlüsselwort an. Jetzt werde ich das vorherige Beispiel
verwenden. Dies wird dazu beitragen,
den Unterschied viel besser zu veranschaulichen. Also hier habe ich meinen Hundekurs für alle, die
das letzte Tutorial nicht gesehen haben. Ich habe hier zwei Felder, einen Konstruktor, der diese
einrichtet, und eine Eigenschaft hier, die nur den Wert
der Rasse ermittelt Es ist also eine einfache Hundeklasse. Ich werde
dieses private Feld hier, das derzeit schreibgeschützt ist
, derzeit schreibgeschützt ist
, ändern
und es in eine Konstante umwandeln. Dann werde ich
das Verhalten und die
Unterschiede in diesem Fall demonstrieren . Denken Sie also daran, dass
wir mit einem
schreibgeschützten Feld hier den Wert tatsächlich von
einem Konstruktor
festlegen und ihn auch initialisieren
können Lassen Sie mich das jetzt
in eine Konstante umwandeln. Jetzt können Sie sehen, dass ein
Fehler aufgetreten ist. Wenn ich hier mit der Maus über den
Fehler fahre, heißt das, dass ein Guid-Typ nicht als Konstante deklariert
werden kann Bestimmte Datentypen
können nicht konstant sein. Das ist ein kleines Problem. Okay, machen wir
unsere ID zu einer Ganzzahl. Stattdessen werden wir ein System haben , das für jeden einzelnen Hund eine eindeutige
Ganzzahl generiert. Okay, kein Problem. Wir werden einen anderen Datentyp
verwenden. Jetzt gibt es ein anderes Problem. Wenn ich mit der Maus
darüber fahre, können Sie sehen dass für
ein konstantes Feld
ein Wert angegeben werden muss Im Grunde bedeutet das, wenn Sie eine Konstante
deklarieren,
wie wir es hier tun, müssen
Sie sie initialisieren, Sie müssen ihr hier einen Wert geben,
alles in einer Zeile Sonst ist es nicht möglich. Wenn wir
etwas als Konstante deklarieren, müssen
wir ihm einen Wert geben. Sagen wir zum Beispiel einfach 456. Jetzt gibt es hier unten ein anderes
Problem. Wenn ich darüber verärgert bin, können
Sie sehen, naja, die
Fehlermeldung ist nicht sehr klar Aber wenn Sie einmal
eine Konstante deklariert und
einen Wert darin initialisiert
haben, können Sie
dieses Feld oder diese Variable nicht mehr von einem anderen Ort
aus ändern dieses Feld oder diese Variable nicht mehr von einem anderen Ort
aus Nicht in einem Konstruktor. Sie können
es nicht von einer Eigenschaft aus ändern. Sie können
diesen Wert nicht von
außerhalb der Klasse
aus ändern . Sobald eine Konstante
gesetzt und initialisiert wurde, was Sie beide in einer Zeile tun
müssen, können
Sie diesen Wert nicht mehr ändern Stellen Sie sich das Schlüsselwort constant also eher
als ein stärkeres
schreibgeschütztes Schlüsselwort mit viel mehr Einschränkungen bei der Änderung Ihrer Daten Das ist ein wirklich großer Unterschied darum
geht, eine eindeutige ID für einen Hund zu
generieren Read-Only ist ein gutes
Schlüsselwort dafür, weil wir
es vom Konstruktor aus initialisieren können Eine eindeutige ID
für einen Hund mit einem
konstanten Schlüsselwort zu generieren,
wäre jedoch für einen Hund mit einem
konstanten Schlüsselwort zu generieren, ein sehr
schlechter Weg, um mit
dieser Situation umzugehen , da const keine gute
Möglichkeit
wäre Sie fragen sich vielleicht,
wofür kann ich const verwenden? Was ist ein gutes Beispiel für die
Verwendung dieses konstanten Schlüsselworts? Es scheint ziemlich einschränkend zu sein und es scheint, als könnte ich damit nicht
wirklich viel anfangen. Nehmen
wir zum Beispiel an, wir arbeiten mit I. Wenn ich Kuchen sage,
meine ich nicht Apfelkuchen. Ich meine Torte R im Quadrat 3,1 419. Ich denke, auf Pie wird
in der statischen Mathematikklasse zugegriffen. Wir haben uns die statische
Mathe-Klasse
schon einmal angesehen , als wir zuvor mit
Zahlen gearbeitet haben. Und es gibt viele Dinge, die
Sie hier tun können. Aber du kannst hier sehen, dass es einen
gibt, der Pie heißt. Wenn ich mit der Maus drüber fahre, siehst
du, dass Pie eine
Konstante ist, 3.1 4159 Ich war nah dran, ich war nah dran. Kuchen ist eine Konstante. Und das liegt daran, dass sich
Kuchen nicht ändert. Torte ist immer 3,14 159265. Es ist einfach dieser Wert. Es gibt keinen Grund
, warum ich mir jemals vorstellen wo wir den Wert von Pi
ändern wollen würden, denn Pi ist, was er ist. Pi ist Pi. Es ist das Verhältnis des Radius
zum Umfang. Nun, ich bin kein Mathematiker,
aber ich hoffe, ich habe klargestellt
, dass Sie
Pi niemals ändern
müssen, weil es ein festgelegter Wert ist Das ist ein sehr gutes Beispiel für
die Verwendung einer Konstante. In diesem Fall ist Pi konstant. Sie ändern Pi nicht.
Es ist was es ist. Und wenn Sie es versuchen, können Sie
sehen, dass es hier ein Problem gibt. Pi ist also ein sehr gutes Beispiel dafür wo Sie eine Konstante
verwenden würden, weil dieser Wert, wenn er einmal gesetzt
ist, nie geändert wird und
es gibt viele davon. Schau, da sind Pi
und ein Handtuch. Ich habe noch nie von Handtuch gehört, aber oh, es hat mit Ausstrahlung zu
tun Okay. Hier, eine ferne Erinnerung
an eine sehr frühe Mathestunde. Sie können also sehen, dass das der
Sinn der Verwendung von Konstanten ist. Hier würden Sie den Wert niemals ändern
wollen. Und wenn es einmal gesetzt ist, ist
es jetzt konstant Sie legen das zur
Kompilierzeit fest, nicht zur Laufzeit. Wenn Ihre Anwendung konstant
läuft, benötigen
Variablen oder Felder Werte. Sie können den Wert entfernen, die Anwendung
ausführen und ihn
zuweisen, während die
Software ausgeführt wird. Dies geschieht nur
zur Kompilierzeit. Eine weitere Sache mit Constant Im Gegensatz zu
Read Only Read Only verwenden Sie es private
Klassenfelder , wie wir bereits
erklärt haben. Mit Constant
können wir diese jedoch als private
Felder der Klasse verwenden, aber wir können
sie auch innerhalb von Methoden verwenden. Zum Beispiel kann ich hier einfach
eine Variable deklarieren, ich nenne sie ID, ich gebe ihr den Wert,
dann kann ich
sie hier für den Rest
meiner Methode verwenden . Ich könnte es auch an eine andere
Methode übergeben, das ist kein Problem. Konstante Variablen,
Sie können sie setzen,
deklarieren und initialisieren und
dann Methoden weitergeben, ist überhaupt kein Problem Wenn dies jedoch,
wie wir zuvor gezeigt haben, nur gelesen wurde, ist
dies nicht möglich, da der
Schreibschutz auf private Felder
beschränkt ist Eine weitere Sache, die ich über das Schlüsselwort
constant
erwähnen werde über das Schlüsselwort
constant
erwähnen ,
ist, dass es standardmäßig implizit
statisch Im Grunde bedeutet das, dass
es standardmäßig statisch ist. Wenn Sie sich mein
vorheriges Tutorial ansehen, in dem wir über das
statische Schlüsselwort gesprochen haben, werden
Sie sich daran erinnern, dass
Static eine Klassenebene ist Hier erstellen wir
eine neue Instanz von dog. Dann können wir mit der Instanz,
die wir erstellt haben, auf Instanzebene,
Felder, Methoden und Eigenschaften zugreifen . Aber wenn wir auf Klassenebene auf
Dinge zugreifen, verwenden
wir den Namen der Klasse greifen
dann auf alles auf
Klassenebene zu. Dinge auf
Klassenebene sind statisch, genau wie die Konstante hier. Was ich tun werde,
ich werde
diese konstante ID veröffentlichen. Das heißt, wir können
von außerhalb der Klasse darauf zugreifen. Ich gehe wieder
raus und setze einen Punkt. Jetzt können Sie sehen, dass der Ausweis hier ist. Das liegt daran, dass Felder
, die als
konstant markiert sind , implizit
statisch und statisch Wenn ich die Instanz DG
auf Instanzebene verwende, sehen
Sie, dass die ID nicht hier ist Sie ist überhaupt nicht hier. Aber auf Klassenebene lebt es hier. Das liegt daran, dass
alles, was
als Konstante definiert ist, implizit statisch Es ist auf Klassenebene verfügbar. Sie können sehen, dass es
überhaupt nicht statisch ist, es ist nur konstant. Das liegt daran, dass es einen
Wert hat und nicht festgelegt werden würde. Wir können ihn nicht ändern. Warum sollten wir wollen, dass
jede Instanz
einen kleinen Bereich im Speicher
hat, in dem diese ID definiert ist? Es macht nicht wirklich Sinn. Wenn Sie 1.000
Hunde in Ihrem System haben, muss ein Teil Ihres Speichers verfügbar sein, um
diese konstante ID für jeden
Hund in Ihrer Software hinzuzufügen . Nun, das macht keinen Sinn,
denn wenn es einmal eingerichtet ist, ist
es eingerichtet, das war's. Es ist also wirklich sinnvoll, dies der Klasse zur Verfügung
zu stellen. Wenn wir also 1.000
Hund-Instanzen in unserem System haben, haben
wir keine 1.000 Kopien
einer Variablen, die
nicht geändert werden kann. Das ist also der Grund
dafür und es macht Sinn, wenn
man es so betrachtet. Das hat wirklich ein kleines Problem mit konstanten Feldern
zu tun, weil sie auf Klassenebene sind Ich hoffe, dass ich in diesem Tutorial
hervorgehoben habe , was das Schlüsselwort
constant bewirkt, was es bedeutet und, was noch
wichtiger ist, den Unterschied zwischen Konstanten und schreibgeschütztem Lesen in C Sharp
62. 14-1. Stack und Heap-Memory: Wenn Sie
Anwendungen mit
C Sharp und Visual Studio entwickeln , erstellen Sie Dinge
wie Variablen wie Ganzzahlen, Boolenes, vielleicht
Instanzen von Klassen,
Objekten, Arrays Es ist wichtig zu
verstehen, was mit diesen
im Arbeitsspeicher des Computers passiert Was wäre, wenn ich dir das sagen würde? Je nachdem, welchen
Datentyp Sie für
Ihre Variablen ausgewählt haben , wird bestimmt, wo und wie diese im Speicher
gespeichert werden. Was meine ich damit? Wenn Sie eine
Integer-Variable oder eine Bolen-Variable
oder zum Beispiel eine Double-Variable verwenden , dann werden diese von
verschiedenen Datentypen aus
sehr unterschiedlich
gespeichert und abgerufen von
verschiedenen Datentypen aus
sehr unterschiedlich Und wenn ich
verschiedene Datentypen sage, meine
ich Dinge wie Zeichenketten, Arrays und benutzerdefinierte Objekte Aber warum ist das wichtig? Nun, es gibt ein paar
Gründe, warum Sie vielleicht mehr über
Stack- und Heap-Speicher erfahren
möchten Erstens kann Ihre
Anwendung aus Leistungsgründen viel schneller ausgeführt und
ausgeführt werden, wenn Sie diese Konzepte
verstehen Aber nicht nur das, sondern was wäre, wenn ich Ihnen sagen würde, dass Sie,
wenn Sie beispielsweise ein Objekt
an eine Methode übergeben, möglicherweise
Daten verlieren oder vorhandene Daten überschreiben könnten Daten verlieren oder vorhandene Daten überschreiben Was würdest du darüber denken? Dies sind zwei
der vielen Gründe Stack
- und Heap-Speicher vertraut
zu machen, und genau das ist der Zweck
dieses Tutorials. Aus Erfahrung,
und glauben Sie mir, Ihr durchschnittlicher Entwickler
nicht viel
darüber wissen , was mit diesen Variablen im
Speicher passiert jedoch nur
ein bisschen Wissen
darüber haben , können Sie
sich von den anderen abheben. Lassen Sie uns also für einen Moment über
Stack-Speicher sprechen. Die Architektur des
Stack-Speichers ist wie ein Stapel Pizzen
oder so ähnlich Sie fügen dem Stapel immer wieder
Pizzen übereinander hinzu
und entfernen
sie dann
nacheinander und entfernen
sie dann Also zuerst die oberste, gefolgt von der nächsten
, auf die Sie nicht zugreifen können, zum Beispiel Pizzen
in Es muss dem Stapel hinzugefügt werden. Also zum Pizzastapel hinzugefügt
oder von oben entfernt. So funktioniert
Stack-Speicher also. Es ist sequentiell, Sie fügen also Dinge nach oben hinzu und entfernen
sie von oben, wir behalten kurzlebige
Elemente auf dem Stapel Was ist nun ein kurzlebiger Gegenstand? Nun, diese werden allgemein
als Werttypen bezeichnet. Dinge wie Ganzzahlen, Boo
lehnt Zeichen, Gleitkommazahlen, Doppelzahlen, Dinge, die ziemlich schnell
sind,
einfache Dinge, die als nicht komplex
angesehen werden Einfache Datentypen wie diese, keine Dinge wie komplexe Objekte Und wenn wir Dinge im
Stack-Speicher speichern , werden sie schnell
abgerufen. Es ist ein sehr schneller Speicherbereich,
allein schon aufgrund der Art und Weise, wie er
sequentiell aufgebaut ist Nun, der Heap-Bereich des
Speichers ist ganz anders. Stellen Sie sich diesen Stapel Pizzen vor, aber statt eines gut
organisierten Stapels werfen Sie sie alle auf den Boden, sodass
überall Pizzen im Stapelspeicher liegen, es keine Reihenfolge der
Elemente im Speicher an sich gibt Aufgrund der
natürlichen Anordnung der Elemente im Heap ist
der
Speicherabruf jedoch langsamer da der Zugriff auf die Daten
komplizierter ist komplizierter Daher wird er als
langsamer angesehen als Stack-Speicher. Im Allgemeinen behalten Sie
langlebige Elemente auf dem Heap, also komplexe Objekte, aber auch Dinge, die für eine lange Zeit zur Verfügung
gestellt werden , für eine lange Dauer der
Ausführung Ihrer Anwendung, wohingegen Dinge auf dem Stack als kurzlebig angesehen werden Also vielleicht eine schnelle Berechnung
wie vier plus vier, zum Beispiel, welche Arten von Datentypen und Elementen werden im
Heap-Bereich des Speichers
gespeichert Es sind Dinge wie
Objekte, Klassen. Wenn wir eine Klasse instanziieren, können
Strings, Strings riesige Elemente,
Arrays, alles sein ,
was global und in
Ihrer gesamten
Anwendung global verfügbar ist in
Ihrer gesamten
Anwendung global verfügbar Zum Beispiel, obwohl eine einfache Ganzzahl als Werttyp
betrachtet wird Wenn Sie dies jedoch global wie statisch oder
so gemacht haben
und es für
jede Klasse im System verfügbar gemacht wird, dann ändern sich hier
die Regeln. Dies würde im
Heap-Bereich des Speichers gespeichert werden ,
da es für länger anhaltende,
also langlebige Elemente im Heap verfügbar
gemacht werden muss also langlebige Elemente im Heap Dinge wie Zeichenketten, Klassen, wie sie alle als
Referenztypen betrachtet werden ,
das ist das Schlüsselwort Möglicherweise hören Sie in
Zukunft viel, wenn Sie
einen neuen Referenztyp erstellen , der im
Heap-Bereich des Speichers
gespeichert wird der im
Heap-Bereich des Speichers
gespeichert Was auch passiert,
ist, dass auf dem Stapel ein
sogenannter Zeiger
erzeugt wird Was also passiert,
ist, dass der Zeiger auf dem Stapel auf einen Bereich
des Heap-Speichers zeigt , in dem sich
Ihre Objektdaten befinden. Wenn Sie beispielsweise einen Referenztyp
wie ein Array erstellen , wird dem Stapel
ein Zeiger
hinzugefügt und der eigentliche Inhalt der
Operation wird dem Heap hinzugefügt Die Information auf
dem Stapel sagt so ziemlich genau, okay, du kannst sie genau hier
an dieser
Speicherposition auf dem Heap finden an dieser
Speicherposition auf dem Heap Das ist
das einzige, was
dem Stapel hinzugefügt wird , wenn Sie einen Referenztyp
erstellen, etwas Kompliziertes,
wie zum Beispiel ein Array Daher
kommt der
Name Referenztyp , weil wir uns vom Stack auf den Heap
beziehen, auf dem sich der
Datenscanner Und aus diesem Grund werden Dinge wie
ganze Zahlen, Boulen, Shahs und
einfache Typen Werttypen genannt, weil der Wert
direkt im Stack-Bereich des Speichers gespeichert
wird Jetzt weiß ich, dass das eine Menge zu
verstehen und zu lernen ist ,
aber mach dir keine Gedanken
darüber, alles zu verstehen , was ich in diesem Tutorial
skizziert habe Die wichtigste Erkenntnis besteht darin, zu
wissen und zu verstehen, dass bestimmte Datentypen im
Stack-Bereich des Speichers
gespeichert werden im
Stack-Bereich des Speichers
gespeichert Und der Stack-Bereich des Speichers hat seine eigenen Eigenschaften
und Vorteile, und andere Datentypen
werden
wiederum auf dem Heap gespeichert , mit ihren eigenen Eigenschaften
und Ähnlichem In den nächsten Tutorials werde
ich einige Beispiele verwenden, werde
ich einige Beispiele verwenden damit Sie das
besser verstehen können Sie sich also keine Gedanken darüber, ob Sie jetzt
alles verstehen, aber jetzt
werde ich über
etwas sprechen, das
als Stack-Overflow bezeichnet wird Vielleicht haben Sie schon einmal
vom Website-Stack-Overflow gehört, oder vielleicht haben Sie schon einmal
von dem Begriff gehört Es spielt keine Rolle, ob
Sie davon gehört haben oder nicht, aber wir werden
absichtlich einen
Stack-Überlauf in C Sharp
verursachen Und ich denke, es wird
ein ziemlich lustiges Beispiel sein, es zu simulieren, weil ich Ihnen zeigen kann, dass Stack-Speicher eine
Größenbeschränkung hat Und das ist der Grund, warum große,
komplizierte Objekte auf dem Heap gespeichert
werden Versuchen wir also, den Stapelbereich
des Speichers zu überlaufen. Jetzt mit einem kurzen Beispiel. Ich bin hier in Visual Studio. Jetzt habe ich eine sehr
einfache Anwendung aus der Hauptmethode. Hier rufen wir
eine Overflow-Methode auf. Und die Overflow-Methode
schreibt einfach Hallo in
das Konsolenfenster Also ist hier nicht viel los. Eine einfache Möglichkeit,
einen Stack-Overflow zu verursachen, besteht nun darin,
eine Methode selbst aufzurufen Möglicherweise stellen Sie sich
die folgende Frage: Wie verursacht dies
einen Stack-Überlauf Ich definiere keine ganzen Zahlen, Boolesche Werte oder ähnliches Was läuft eigentlich
über den Stapel? Nun, wenn Sie eine Methode aufrufen, wird
die Methodenreferenz
auch zum Stack hinzugefügt Dies ist ein weiteres Beispiel
für Stack-Speicher. Wir können also auch einen solchen
Stack-Overflow erreichen. In ähnlicher Weise können wir
ein paar Millionen Variablen erstellen, die Ganzzahlen, vielleicht würde
das auch funktionieren Vielleicht gibt es viele
Möglichkeiten, dies zu erreichen, aber dies ist ein kurzes Beispiel eine sehr einfache Möglichkeit, dies zu tun Also werde ich
die Anwendung
jetzt ausführen und wir werden sehen
, was passiert. Ich führe die Anwendung aus, sie stürzt so ziemlich ab. In Visual Studio heißt es
Stack-Overflow-Ausnahme. Wenn ich mir das
Konsolenfenster hier ansehe, können
Sie sehen, dass der
Stack-Überlauf
24.109 Mal wiederholt wird, bevor der Stapel vollständig voll
ist und Wenn wir uns dieses Diagramm hier ansehen, können
Sie sehen, wie der Stack
- und der Heap-Speicher wachsen,
aber der Stack-Speicher aber der Der Sinn des
Stack-Speichers besteht darin,
tatsächliche Werte für
Datentypen wie Ganzzahlen zu speichern tatsächliche Werte für
Datentypen wie Ganzzahlen Es
speichert zum Beispiel
15 auf dem Stack, 15 auf dem Stack, wenn wir einen großen
Referenztyp wie ein Array haben , dann wird dieser
auf dem Heap gespeichert, weil diese sehr, sehr groß werden können Aufgrund des Speicherbereichs
des Stapels ist er jedoch begrenzt. Es ist endlich. Sie können hier nur
so viele Informationen angeben. Und wie Sie hier sehen können, können
wir 24.109 Mal einen Verweis auf
unseren Methodenaufruf speichern So begrenzt ist es also und diesem Grund wird
nicht alles auf dem Stack gespeichert Ja, der Stapel ist schnell, aber sein Speicherplatz ist begrenzt. Der Heap ist langsamer, aber er ist viel größer Sie sehen also die Vor-
und Nachteile der beiden, und aus diesem Grund gibt es
beide
und es ist auch wichtig
, beide zu verstehen Also möchte ich
über eine weitere Sache sprechen, und das ist der Call Stack. Was ist der Call Stack? Wenn ich hier zurück in Visual
Studio gehe und nach unten scrolle, können
Sie sehen, dass es
hier
ein kleines Fenster namens Stack gibt. Wenn Sie dieses Fenster nicht sehen, gehen Sie nach oben,
gehen Sie zu Bug, dann Windows und rufen Sie dann Stack auf. Und das sollte hier unten
erscheinen. Was die Aufrufliste macht, sie gibt Ihnen zum Beispiel eine visuelle
Darstellung Ihrer
Methodenaufrufen. Sie können hier also sehen, dass wir mit der Hauptmethode
begonnen haben. Hier haben wir Overflow aufgerufen
und das
24.106 Mal wiederholt, bis wir schließlich in einem Stack-Overflow
enden Es gibt Ihnen eine schöne
visuelle Darstellung . Und Sie können sehen, dass die Architektur
hier dem Pizza-Beispiel, über das ich vorhin gesprochen
habe, ziemlich
ähnlich ist , wobei der erste Anruf die untere Pizza ist. Und diese werden langsam dem Stapel
hinzugefügt. Aber der Grund, warum ich gerade über
den Call-Stack spreche , ist,
dass Anfänger-Entwickler, kann ich zwischen dem
Stack-Speicher und dem Call-Stack ein
bisschen verwechseln ? Die Aufrufliste bietet Ihnen eine
schöne visuelle
Darstellung Ihrer Methodenaufrufen. Aber es ist kein Stack-Speicher. Das ist nicht das, was Sie im Stack-Speicher
sehen. Die Aufrufliste
zeigt Ihnen nicht Ihre Variablen und Zuweisungen und
ähnliches. Es gibt
dir nur die
Methodenaufrufen , solange sie
lose miteinander verwandt sind Die Aufrufliste ist
kein Stack-Speicher Ich kann das jetzt mit
einem besseren Beispiel
für den Call-Stack veranschaulichen einem besseren Beispiel
für den Call-Stack Schauen Sie sich
dieses Beispiel hier an. Es ist ziemlich einfach. Die
Hauptmethode hier nennt Methode eins. Methode eins ruft Methode 22 auf, ruft 33 auf vier. Schließlich, in vier, sagen wir einfach Hallo zum Konsolenfenster. Es ist sehr einfach, aber dieses
Beispiel zeigt Ihnen, wie der Aufruf-Stack funktioniert und wie diese Methodenreferenzen dem Stack-Speicher
hinzugefügt werden. Im Grunde die
Stack-Architektur, die Pizza-Architektur. Schauen wir uns ein Beispiel an. Im Moment habe ich hier in
der allerersten Zeile
einen Breakpoint hinzugefügt . Wir werden also in
den Pausenmodus wechseln sobald dieser aktiviert ist. Also werde ich die Anwendung jetzt kompilieren und
ausführen,
jetzt sind wir hier im Pausenmodus. Wenn ich nur dieses Fenster mit der
Aufrufliste öffne, können
Sie sehen, dass ein Element zur Aufrufliste
hinzugefügt
wurde , nämlich Main. Jetzt fange ich an,
indem ich 11 auf der Tastatur drücke. Jetzt können Sie sehen, dass ich mich
in Methode eins befinde. Jetzt wurde das hier
zur Aufrufliste hinzugefügt. Das ist unsere erste
Pizza in unserem Stapel. Das ist unsere zweite Pizza. Jetzt
drücke ich wieder F 11. Jetzt haben wir unsere
dritte Pizza oben drauf. Ich werde mich noch einmal damit
befassen. Wir haben unsere vierte Pizza. Sie können sehen, wie das funktioniert. Die Aufrufliste gibt Ihnen also
eine schöne visuelle Darstellung
davon , wo Sie sich während
einer Debugging-Sitzung in
Ihrer Anwendung befinden während
einer Debugging-Sitzung in
Ihrer Anwendung Es ist auch halb interaktiv. Sie können darauf doppelklicken und
sehen, wo Sie sich befinden wo aus diese Methode aufgerufen
wurde. Das ist sehr hilfreich, wenn
Sie mehrere Dateien,
Lösungen,
Projekte usw. haben und von
wo aus diese Methode aufgerufen
wurde. Das ist sehr hilfreich,
wenn
Sie mehrere Dateien,
Lösungen,
Projekte usw. haben. Es kann Sie
direkt dorthin führen, von wo aus
diese aufgerufen wurde. Dies ist jedoch eine ähnliche
Darstellung wie
die Funktionsweise von Stack-Speicher. Wir haben hier unseren ersten Wert, dann werden sie gestapelt und dann werden sie in dieser Reihenfolge
wieder entfernt. Sie können nicht nach dem
Zufallsprinzip aufgerufen werden. Es ist also wie first
in, first out, was die Terminologie dort ist. Der Stack-Speicher und der Aufruf-Stack verwenden die Stack-Architektur. Und obwohl sie verwandt sind, sind
sie nicht genau
dasselbe. Ich hoffe, das ergibt Sinn. Wenn ich dann zu Methode vier übergehe, können
Sie sehen, dass dies die letzte ist, die der Aufrufliste
hinzugefügt wurde. Und dann gehe ich drüber,
und jetzt können Sie sehen, dass sie langsam
vom Stapel verschwinden Methode drei wird die nächste
sein, die aufhört, weil wir
gerade dabei sind, da rauszukommen Dann zwei, dann eins. Jetzt sind wir wieder bei
der Hauptmethode. Sie können sehen, dass es das letzte
verbleibende Element in der Aufrufliste ist. Das ist also der
Kernstapel,
und das ist auch die
Stack-Architektur. Und Sie werden die
Stack-Architektur
in vielen verschiedenen
Programmiersprachen sehen , aber sie ist auch nicht
auf die Programmierung beschränkt. Eine letzte Sache, über die ich
sprechen werde, ist ein Schlüsselwort, das Sie vielleicht in Zukunft hören werden
: Müllabfuhr. Was ist also Müllabfuhr? Nun, als ich über die
Erstellung
von Referenztypen sprach , zum Beispiel
Dinge, die im Heap-Bereich des Speichers gespeichert sind, wie Klassen,
Klasseninstanzen, Zeichenketten, Arrays und solche
Dinge Ich habe auch gesagt, dass ein
Zeiger auf
dem Stapel erstellt wird und dieser auf
die Informationen auf dem Heap verweist Es ist wie ein Zeiger.
Was passieren kann, ist der Zeiger aus
dem Stapelbereich des Speichers entfernt wird, die eigentlichen Daten
jedoch auf dem Heap
zurückbleiben Jetzt hat unsere Anwendung keine Ahnung mehr, wo sich diese
Informationen befinden. Vielleicht
benötigt sie die Daten nicht einmal mehr. Aber es könnte immer noch im
Heap-Bereich des Speichers existieren. Da der
Zeiger jedoch nicht mehr darauf im
Stapelbereich des Speichers zeigt, diese Daten auf dem
Heap nutzlos Es kann nicht verwendet werden,
es kann nicht gefunden werden. Es kann einfach
deinen Speicher auffüllen , bis
kein Speicher mehr übrig ist. Das ist ein ziemlich großes Problem. Dies wird normalerweise als Speicherleck bezeichnet
. Es gibt also so etwas
wie
die Müllabfuhr , die quasi den
ganzen Haufen durchsucht Speicherbereich, ermittelt,
ob auf dem Stapel ein Zeiger
darauf zeigt, und wenn nicht, wird er entfernt, er gibt Speicher frei Und genau das macht die
Müllabfuhr. Und in einer Sprache wie C Shop müssen
Sie sich keine Gedanken
über die Müllabfuhr machen. Aber ich dachte, es
wäre eine interessante
Kleinigkeit , dir das zu erzählen Aber wenn du mit
anderen Sprachen arbeitest, vielleicht wie C plus plus, dann musst du dir Gedanken
über die Müllabfuhr machen Vielleicht ist es
etwas, das man in Betracht ziehen sollte, aber es ist schön zu wissen. Und wenn Ihre Anwendung
geschlossen oder beendet wird, wird der
Speicher in der Regel freigegeben
63. 14-2. Methodenparameter: Weitergeben nach Wert: Bevor Sie sich dieses Tutorial ansehen, empfehle
ich Ihnen dringend, sich das vorherige Tutorial zu
Stack- und Heap-Speicher Andernfalls macht dies möglicherweise keinen
Sinn , es sei denn, Sie sind
mit Stack- und Heap-Speicher vertraut Schauen wir uns nun dieses Beispiel
an. Hier sehen wir uns eine Methode
an jetzt einige
Parameter an eine Methode übergibt. Dann werden wir einige Werte
ändern. Betrachten Sie einfach dieses Beispiel
hier. Es ist ziemlich einfach. In der Hauptmethode
der Anwendung definiere
ich hier zwei Variablen
vom Typ Wert. Jetzt werden diese
im Stack,
dem Stack-Bereich des Speichers, gespeichert , es
sind Werttypen. Dann gebe ich die Werte für diese Variablen in
das Konsolenfenster aus. Ich rufe dann eine
Methode namens Reset auf. Und ich übergebe
diese beiden Variablen vom
Wertetyp genau hier an diese Methode, ich setze diese
Variablen zurück, die auf Null
übergeben werden , und gebe sie dann im Konsolenfenster Sobald die Methode fertig ist, die Ausführungssteuerung wieder hier
oben übergeben Und dann gebe ich
die Werte dieser
Variablen erneut Und dann lasse ich das
Konsolenfenster offen. Frage, was
denkst du wäre das Ergebnis? Nun, schauen wir uns an,
was die Ausgabe tatsächlich ist. Ich werde
das Programm jetzt ausführen. Der Wert von Nummer eins ist der
Wert von Nummer zwei ist vier. Und dann ist der Wert innerhalb der Methode Null, weil
wir sie zurücksetzen Und dann, nachdem die Methode
6.4 ausgeführt wurde, haben Sie das erwartet? Vielleicht, aber schauen Sie sich jetzt dieses andere Beispiel
an. Schauen wir uns
dieses Beispiel hier an. Es ist
dem vorherigen Beispiel sehr ähnlich, aber anstatt einen einfachen
Wertetyp wie eine Ganzzahl zu verwenden, verwenden
wir einen Referenztyp. Und Referenztypen
werden, wie
wir bereits erwähnt haben, im
Heap-Bereich des Speichers gespeichert, und ein Zeiger auf diese Daten
wird auf dem Stapel gespeichert Was wir tun,
wir instanziieren ein Videospielobjekt Wenn ich zum Videospielkurs gehe, kannst
du sehen, dass es ziemlich einfach ist Es gibt hier ein privates
Feld namens title und ein öffentliches
Property namens title, das den Abruf und die
Einstellung dieses Feldes hier steuert. Sehr einfach. Wir geben hier
den Titel für das
Videospiel
ein, World of Warcraft, und dann geben wir
ihn im Fenster Wir erhalten den Titel,
bevor eine Methode aufgerufen wird. Jetzt ändern wir hier
den Titel. Bei dieser Methode nimmt es ein Videospielobjekt auf und dann geben wir
etwas in das Fenster aus Wir geben es in das
Fenster innerhalb der Methode aus. Aber bevor wir den Titel
des Spiels innerhalb dieser Methode ändern , ändern
wir den Spieltitel etwas anderes
zu ändern Nachdem die Ausführung der Methode abgeschlossen
ist, geben wir den
Spieltitel erneut Was glaubst du nun,
wird dieses Mal passieren? Okay,
schauen wir uns das Ergebnis an. Wenn ich die Anwendung starte, können
Sie hier den Spieltitel sehen bevor die Methode
World of Warcraft lautet Der Spieltitel innerhalb der
Methode ist World of Warcraft. Denken Sie bei der Methode daran, dies vor der
Änderung der Fall ist, aber nachdem die Ausführung der Methode
abgeschlossen ist, kehren
wir nach Maine zurück
und geben das Ergebnis aus Hier können Sie jedoch
sehen, dass
der Wert, in den wir ihn innerhalb der
Methode geändert haben
, beibehalten der Wert, in den wir ihn innerhalb der
Methode geändert haben wird. Warum ist das so? Warum werden diese Änderungen aufgrund von Änderungen
innerhalb von Methoden für
Referenztypen, aber nicht für Werttypen
beibehalten innerhalb von Methoden für
Referenztypen, aber nicht für Werttypen Was ist hier los? Nun, gestatten Sie mir das zu erklären. Ich komme
jetzt
zum vorherigen Beispiel zurück , wo wir hier zwei
einfache Werttypen hatten, zwei ganze Zahlen, und wir haben
sie hier in eine Methode übergeben Wenn nun in C Sharp Objekte
übergeben werden, egal ob es sich um Werttypen oder Referenztypen als
Parameter an Methoden handelt,
werden diese
standardmäßig als Wert übergeben Sie werden als Wert übergeben, sofern nicht ausdrücklich anders angegeben, sollten
sie als Referenz
übergeben werden. Wir werden später über die
Weitergabe per Referenz sprechen. Aber denken Sie an die Standardeinstellung, die hier als Wert übergeben wird. Was bedeutet es, als Wert übergeben zu werden? Nun, standardmäßig wird, wenn Sie
eine Methode aufrufen und diese
beiden Parameter hier übergeben, eine Kopie, eine Kopie
dieser Daten erstellt. Hier haben wir einen Wert von sechs in Nummer eins und einen Wert
von vier in Nummer zwei. Wir nennen diese Methode hier. Innerhalb dieser Methode
erhält sie eine Kopie
dieser Variablen. Es zeigt nicht auf denselben
Bereich wie die Erinnerung an diese. Diese werden buchstäblich kopiert. Dann funktioniert die Methode
tatsächlich mit einer doppelten Kopie
dieser Variablen. Das bedeutet es, wenn
ein Wert übergeben wird. Jede Arbeit, die wir
hier
innerhalb dieser Methode ausführen, wird mit einer Kopie
dieser Variablen ausgeführt. Und wenn die
Ausführung der Methode abgeschlossen ist und die Kontrolle hier zurückgegeben wird, verlieren
wir alles darin
, weil es sich um
eine doppelte Kopie handelt , die nur innerhalb der Methode
existiert. Sobald die Methode fertig ist, wissen
wir nichts
davon, es sei denn wir geben ausdrücklich
etwas zurück. Das ist ein Beispiel für die
Übergabe eines
Wertetyps an eine Methode und dieser
wird als Wert übergeben, es hat keine Auswirkungen auf irgendetwas
außerhalb der Methode. Kommen wir zurück zu unserem anderen
Beispiel, in dem wir den Namen
des Videospielobjekts geändert haben. Wenn ich Daten als Wert übergebe, warum bleibt diese Änderung
dann außerhalb der Methode
bestehen Sicherlich macht das keinen Sinn. Nun, das liegt daran, dass
wir
einen Referenztyp als Wert übergeben . Wie ich schon sagte, wenn Sie Parameter standardmäßig an
Methoden
übergeben ,
erfolgt dies nach Wert. Wir übergeben jedoch
einen Referenztyp. Denken Sie daran, dass wir zuvor
über Referenztypen gesprochen haben, bei denen es sich um komplizierte Objekte handelt. Sie können Arrays, Listen und all diese Dinge sein Und das wird
im Heap-Bereich
des Speichers gespeichert , aber wie gesagt, es gibt einen Zeiger, der im Stapelbereich
des Speichers
gespeichert ist und auf
diese Daten im Heap zeigt Wenn diese Methode aufgerufen wird, wird
sie ja in die Methode kopiert,
aber der Heap-Speicher
wird Nur der Zeiger auf
dem Stapel wird kopiert. Das scheint wirklich
kontraintuitiv zu sein, denn ja, wir übergeben dieses
Referenzobjekt als Wert. Da es sich jedoch um
ein Referenzobjekt handelt, kopieren
wir lediglich den
Zeiger innerhalb dieser Methode. Hier arbeiten wir mit einer Kopie des Zeigers, die im Stack-Speicher
gespeichert ist. Es zeigt jedoch immer noch auf denselben
Speicherbereich auf dem Heap Bei dieser Hauptmethode zeigen
wir auf den Speicherbereich
auf dem Heap, aber auch innerhalb dieser Obwohl wir mit
einer Kopie des Zeigers
auf dem Stapel arbeiten , zeigt
er immer noch auf diesen
Speicherbereich auf dem Heap diesem Grund
ändert sich der Titel immer noch , denn obwohl wir mit einer
Kopie des Zeigers arbeiten, zeigt
er immer noch auf
denselben Speicherbereich Aus diesem Grund
ändert sich der Titel innerhalb der Methode immer noch. Und wir können hier sehen, dass
die Änderungen nach dem Aufruf
der Methode auch
nach der Ausführung der Methode bestehen blieben Ich weiß, dass das ziemlich viel zu verarbeiten
ist, aber wenn du dir
das vorherige Tutorial
und auch dieses noch ein
paar Mal ansiehst , und
du wirst es verstehen,
ich verspreche es, als ich sagte, dass eine Kopie des Zeigers
in diese Methode hier übergeben wird, zum Beispiel, wenn ich jetzt
mit dieser Kopie des Zeigers arbeite. Also dieses Spiel hier, ich kann ein neues
Objekt, eine neue Instanz initialisieren Das bedeutet, dass es
einen neuen Speicherbereich zuweist. Hier arbeite ich mit der Kopie des
Zeigers,
aber ich sage, okay, erstelle
jetzt ein neues Objekt auf
dieser Kopie des Also, was das machen wird, das wird mit einer
völlig neuen Kopie der Daten funktionieren und diese auf den Haufen legen Was wir hier machen, sobald
die Methode aufgerufen wurde, wir hier den Titel des
Spiels Lassen Sie uns das sogar hier platzieren. Jetzt haben wir eine neue
Instanz des Spiels. Wir setzen den Titel
dieser neuen Instanz auf „Geändert und geben ihn dann aus Und wir geben hier immer noch
den Titel nach der Methode aus Was glaubst du,
wird jetzt passieren? Nun, lass uns einen Blick darauf werfen.
Lass uns das Programm ausführen. Sie können jetzt sehen, dass
etwas anderes passiert ist. Wir haben hier unseren
Originaltitel am Anfang. Dann wurde
er innerhalb der Methode geändert. Nach der
Methode hat sie jedoch immer noch ihren ursprünglichen
Titel von früher
beibehalten. Warum
ist das hier los? Wie ich bereits erwähnt habe,
ist dies ein Referenztyp. Standardmäßig wird es innerhalb der Methode als Wert übergeben
. Wir haben eine Kopie dieses
Referenztypenzeigers, sich im Stack-Speicher befindet. Wir geben ihm jetzt einen
neuen Speicherort und legen fest, dass dieser neue
Speicherort geändert werden soll. Außerhalb der Methode hat
dies jedoch keine Kenntnis von
diesem neuen Speicherort. Das passiert nur innerhalb
der Methode. Nur innerhalb dieser Methode
ist das Wissen über diesen neuen
Speicherbereich auf dem Heap vorhanden und
wir weisen darauf hin Diese Änderung wird jedoch
nicht außerhalb
der Methode beibehalten , sondern es wird
mit einer vorhandenen
Kopie des Zeigers gearbeitet , was sich wiederum
auf den Heap auswirkt Genau wie von hier aus weisen
wir tatsächlich
einen neuen Speicherbereich auf dem Heap zu und zeigen unsere
Kopie des Zeigers darauf, und das ist der Grund, warum das passiert Schauen wir uns hier noch
ein Beispiel an. Auch dies wird
so ziemlich
die gleiche Ausgabe haben wie unser
vorheriger Referenztyp
, der eine Instanz
eines Videospielobjekts war. Aber hier haben wir einen anderen
Referenztyp, eine Liste. Auch hier könnte es ein
beliebiger Referenztyp sein, es könnte ein Array sein, es könnte ein Wörterbuch sein, es könnten viele
verschiedene Dinge sein. Dies wird wiederum
im Heap-Speicher gespeichert. Eine Liste mit vier ganzen Zahlen, wir geben die
Anzahl der Liste und dann übergeben wir
die Liste an diese Methode Jetzt wird es standardmäßig als Wert
übergeben, aber das ist ein Referenztyp. Eine Kopie des Zeigers wird in die Methode
kopiert. Jetzt kann die Methode mit
einer Kopie des Zeigers arbeiten, die praktischerweise
auf denselben Bereich im Heap-Speicher
zeigt wie
dieser. Außerhalb der Methode Dann fügen wir der Liste zwei
Zahlen hinzu und dann die Listenanzahl aus Sobald die Methode beendet ist, geben
wir die
Listenanzahl Was glauben Sie, werden
die Ergebnisse sein? Nun, lassen Sie uns einen Blick darauf werfen. Sie können die Zahlen von 466 sehen. Das liegt daran, dass die Methode
zwei Zahlen addiert. Und sobald wir hier draußen sind, zeigt
es auf
denselben Bereich des Heap-Speichers, es wird diese Anzahl beibehalten Jetzt zur Methode,
wenn ich die Liste hier nur leicht modifiziere Jetzt innerhalb der Methode wird
diese Liste erneut als Wert
übergeben. Aber es ist eine Kopie des Zeigers. Mit der Kopie
des Zeigers und jetzt zeigt er ihn auf einen
brandneuen Bereich im Heap-Speicher und fügt dann zwei Zahlen
zu dieser brandneuen Liste Was wird Ihrer Meinung nach
die Ausgabe sein? Lassen Sie uns jetzt das Programm ausführen. Sie können sehen,
dass wir vier bis vier haben. Sie können sehen, dass unsere erste Liste vier
enthält. Das ist richtig. Innerhalb der Methode
erstellen wir eine brandneue Liste. Sie enthält nur zwei Zahlen. Von dort kommen die beiden. Jetzt ist die Methode fertig, wir haben immer noch
Zugriff auf diesen ursprünglichen Bereich. Im Heap-Speicher werden die
vier ausgegeben. Sie können also sehen, dass es mit
allen verschiedenen Arten
von Referenztypen funktioniert allen verschiedenen Arten
von Referenztypen Und das ist das Standardverhalten
von Methoden in C Sharp. Also werde ich jetzt den
Kreis schließen. Zu Beginn des
vorherigen Tutorials sagte ich, warum muss ich etwas über
Stack- und Heap-Speicher wissen? Warum ist es wichtig? Nun, Sie können sehen, dass unerwartete
Dinge passieren können, wenn Sie
keine Kenntnisse über Stack
- und Heap-Speicher sowie Variablen vom Typ Wert und Referenztyp unerwartete
Dinge passieren können Unerwartete Dinge sind aus offensichtlichen Gründen ein
ziemlich großes Problem in der
Software Deshalb ist es wichtig, und hier ist ein Beispiel dafür in
der Praxis.
64. 14-3. Methodenparameter: Weitergeben nach Referenz (das Schlüsselwort ref): Die Referenz, Schlüsselwort, das
Methodenparameter als Referenz weitergibt. Wenn Sie meine beiden
vorherigen Tutorials zu diesem
Thema nicht gesehen haben , in denen wir über Stack
- und Heap-Speicher,
aber auch über die Übergabe von Werten
gesprochen haben , dann empfehle ich Ihnen dringend sich diese anzusehen, bevor Sie mit
diesem Tutorial
fortfahren , da sie mit
den
in diesem Tutorial beschriebenen Konzepten Im vorherigen Tutorial haben
wir darüber gesprochen, wie
unterschiedlich Objekttypen wenn sie als
Parameter an Methoden übergeben werden Standardmäßig werden sie als Wert
übergeben, was bedeutet, dass eine Kopie
des tatsächlichen Werts oder eine Kopie des Zeigers
erstellt wird und die Methode mit der Kopie
arbeitet. Jetzt werde ich über die
Weitergabe per Referenz sprechen. Nun, die Weitergabe per Referenz ist
kein Standardverhalten und
beinhaltet auch die Diskussion über
ein brandneues Schlüsselwort namens Ref-Schlüsselwort. Also, wie funktioniert das? Nur zur kleinen Auffrischung richten
wir hier zwei ganze Zahlen ein und geben ihre Werte
aus. In dieser Methode übergeben
wir sie
dann als Parameter, setzen die Werte auf Null zurück und geben die Variablen erneut setzen die Werte auf Null zurück und geben die Variablen erneut aus. Wenn die Methode fertig ist, wir den Wert der ursprünglichen Variablen
aus Und Sie können sehen, dass wir diese als Wert
übergeben. Die Methode funktioniert nur
mit einer Kopie davon. Daher werden die Daten nach Abschluss der Methode
nicht mehr
geändert. Was ich jetzt tun werde,
ist das ein wenig zu ändern. Ich werde
diese Wertetypen übergeben. Denken Sie daran, dass es sich bei dem Wertetyp um ganzzahlige, boolesche, einfache Typen handelt, die auf dem
Stapel gespeichert sind Jetzt werde ich sie als Referenz
weitergeben. Um etwas als Referenz zu übergeben, stellen Sie den
Variablen hier einfach Schlüsselwort ref in
den
Methodenparametern voran. Hier machen wir dasselbe, wir fügen nur das Schlüsselwort ref hinzu. Was glaubst du nun, wird
das Ergebnis sein? Nun, lassen Sie uns einen Blick darauf werfen. Sie können also sehen, dass es
das Verhalten des
Referenztyps aus dem vorherigen Tutorial zeigt Erinnerst du dich, als wir den Wert
eines Referenztyps
geändert haben und er
sich daran erinnert hat, nachdem die
Methode aufgerufen wurde? Nun, das
nennt man die Übergabe eines Wertetyps per Referenz. Und das können wir tun,
indem wir hier das Schlüsselwort F hinzufügen. Was ist der Vorteil davon? Nun, wenn Sie einen
Wertetyp innerhalb einer Methode übergeben, wird keine Kopie
des Werts mehr erstellt, sodass keine Kopie erstellt wird. Es sagt so ziemlich,
okay, hey Methode. Ich werde dir
diese beiden Variablen hier übergeben, sind Werttypen,
aber ich möchte, dass du dir die Referenz
auf sie im Speicher
übergibst. Ich möchte, dass du damit arbeitest. Und was auch immer Sie ihnen antun, die Änderungen werden sich widerspiegeln. Das ist also die Übergabe
eines Verweises auf den Bereich im Stack-Speicher
für diese Werttypen, und jetzt werden sie als Referenz
übergeben. Wir können mit diesen
direkt innerhalb der Methode arbeiten, und alle Änderungen, die wir daran
vornehmen,
werden beibehalten, sobald die Ausführung der Methode abgeschlossen
ist Sie können hier also sehen, dass
ich sie gerade geändert habe Jetzt
wurde die Änderung beibehalten Sie können also sehen, dass wir jetzt
das Standardverhalten im
letzten Tutorial verstehen das Standardverhalten im , das als Wert übergeben
wird Es ist einfacher,
die andere Terminologie zu verstehen , die als Referenz übergeben
wird, und zwar die Verwendung
des Ref-Schlüsselworts. Okay, wir haben uns die Übergabe von
Werttypen wie
Ganzzahlen nach Wert angesehen von
Werttypen wie
Ganzzahlen nach Wert Wir haben uns mit der Übergabe von
Referenztypen wie
komplizierten Objekten nach Wert befasst von
Referenztypen wie
komplizierten Objekten nach Wert Wir haben uns jetzt mit der Übergabe von
Werttypen als Referenz befasst. Und um
die Quadrilogie zu vervollständigen, werden
wir uns nun mit der Weitergabe von
Referenztypen als Referenz befassen. Hier ist das Beispiel.
Hier haben wir unsere Liste von ganzen Zahlen, die wir uns zuvor
angesehen haben Wir haben nur vier
Zahlen drin. Und dann fügen
wir innerhalb dieser Methode der Liste zwei
Zahlen hinzu. Und draußen geben wir unterwegs
einfach die Anzahl
der Liste Wir haben uns das schon einmal angesehen und Sie können hier
die Ausgabe sehen, denn standardmäßig
übergeben wir eine Kopie des Zeigers, aber sie zeigt auf denselben
Bereich im Heap-Speicher Sie können also sehen, dass die Änderungen
beibehalten werden, sobald die Ausführung dieser Methode
abgeschlossen ist Aber denken Sie daran, als wir
darüber gesprochen haben, dass wir tatsächlich einen neuen Ort im
Heap-Speicher
einrichten und eine Kopie
unseres Zeigers nehmen und
ihm einen ganz neuen Ort geben können Heap-Speicher
einrichten und eine Kopie
unseres Zeigers nehmen , und das ändert das Ergebnis Sie können hier sehen, dass die Änderung in diesem Fall nicht beibehalten
wird Jetzt werde ich
das mit dem Schlüsselwort ref qualifizieren. Ich füge das hier hinzu, wenn
wir die Methode aufrufen. Und das füge ich hier in
den Parametern hinzu. Was glaubst du,
wird jetzt passieren? Nun, lassen Sie uns einen Blick darauf werfen. Ich werde
die Anwendung ausführen. Sie können jetzt sehen, dass die
Änderung tatsächlich
beibehalten wurde , sobald die Ausführung der Methode
abgeschlossen ist Warum ist das hier
los? Nun, du hast es vielleicht
schon erraten. Wenn wir etwas als
Referenz mit dem Schlüsselwort
reference übergeben , genau wie wir es bereits
besprochen haben, erstellen wir
keine Kopie mehr, wir erstellen nicht einmal mehr eine
Kopie des Zeigers. Wir
übergeben quasi den Zeiger im Stack-Speicher auf diese
Daten im Heap-Speicher Wir übergeben den Zeiger
selbst an die Methode. Die Methode
arbeitet jetzt direkt mit
dem ursprünglichen Zeiger
auf diese Information. Jetzt richten wir hier ein
brandneues Objekt ein, eine neue Liste. Aber wir arbeiten nicht mit
einer Kopie des Zeigers, es ist der ursprüngliche Zeiger. Wir erstellen quasi nur eine brandneue Liste über
der ursprünglichen Liste und fügen ihr dann zwei Zahlen
hinzu. Wenn wir die Anwendung jetzt ausführen, so
wie wir es zuvor gesehen haben, können
Sie hier sehen,
dass sie persistent ist Das ist hier der Unterschied. Wenn wir das Schlüsselwort ref verwenden, kopieren
wir nichts mehr. Wir kopieren nicht
die Werttypen, aber wir kopieren auch nicht die Zeiger, wenn wir Referenztypen
verwenden. Warum ist das nützlich? Nun, dann können unsere Methoden mit unseren Originaldaten
arbeiten,
unabhängig davon, ob es sich um
Werttypen oder Referenztypen handelt, und die Änderungen können
beibehalten werden , sobald die Ausführung der Methode
abgeschlossen ist Das ist die Stärke des
Ref-Schlüsselworts im Shop. diese drei
Tutorial-Reihen zu den Themen Stack,
Heap-Speicher sowie Referenz
- und Werttypen in C Shop abgeschlossen Heap-Speicher sowie Referenz
- und Werttypen in C Shop
65. 15. Das struct-Schlüsselwort: In diesem Tutorial werde
ich über Strukturen in
C
sprechen . Sharp-Strukturen verwenden
das Schlüsselwort struct, aber was sind sie und
wie funktionieren sie? Nun, Strukturen sind Klassen
sehr ähnlich, und in diesem Tutorial
wird davon ausgegangen, dass Sie
ein wenig darüber wissen , wie Klassen funktionieren, wie Vererbung funktioniert,
vielleicht Schnittstellen und auch vom
Wert- und Referenztyp Variablen vom
Wert- und Referenztyp und auch das Schlüsselwort
read only. Zu
all diesen habe ich bereits Tutorials gemacht. Wenn Sie sich bisher
alles angesehen haben, werden
Sie
dieses Tutorial vollständig
verstanden haben und sofort loslegen. Was ist eine Struktur?
Schauen wir uns dieses Beispiel an. Genau hier habe ich
eine quadratische Klasse, schauen wir uns das jetzt an. Hier gibt es zwei private Felder, die Breite und die
Höhe des Quadrats. Es hat einen Konstruktor, der diese Felder
einrichtet. Hier gibt es eine
Beispielmethode, die nur die Fläche
anhand
dieser berechnet Und
hier auch zwei öffentliche Immobilien , die die
Breite und die Höhe offenlegen Es ist also ziemlich einfach.
Also, was ich hier mache, ich instanziiere ein neues Objekt und gebe einige
Beispieldateien in das Wenn ich die Anwendung jetzt starte, ein Quadrat mit der Höhe vier und hat
ein Quadrat mit der Höhe vier und der
Breite fünf eine Fläche Es macht also
nicht wirklich viel. Lassen Sie mich jetzt eine
Struktur vorstellen und was sie ist. Also das hier geht zur
Square-Klasse über. Und ich werde einfach
dieses Klassenschlüsselwort ändern und solche
Struktur hinzufügen. Wenn Sie sich also mein
Tutorial über Schnittstellen und
Aufzählungen ansehen , in dem wir
eine brandneue Klasse erstellen und einfach das
Klassenschlüsselwort ändern In dieser Hinsicht ist es ziemlich ähnlich. Und jetzt haben wir eine Struktur. Dieses Quadrat ist jetzt eine Struktur. Es ist kein Kurs mehr. Aber Sie können sehen, dass es hier
keine Fehler gibt. Es gibt keine roten, verschnörkelten Linien. Wie kommt es, dass ich gerade die ganze Klasse geändert
habe und es gibt keine Fehler Läuft die Anwendung überhaupt? Nun, es sieht so aus, als ob es läuft. Und wir haben genau
die gleiche Antwort, was ist hier los? Hier verwirren Strukturen und Klassen
neue Entwickler oder
Entwickler , die
kein
wirkliches Verständnis von
Werttypen und Referenztypen haben wirkliches Verständnis von
Werttypen und Referenztypen Strukturen und Klassen können sich in ihrem Verhalten sehr ähnlich
erscheinen Sie können hier sehen, dass ich eine Struktur
erstellt habe, sie hat private Felder, sie hat einen Konstruktor, sie
hat Methoden, Eigenschaften Was ist hier der Unterschied zwischen einer Struktur und einer Klasse Kann ich
jetzt einfach Strukturen anstelle von Klassen verwenden oder soll ich
Strukturen komplett ignorieren und nur Klassen verwenden? Nun, die Antwort ist,
dass Sie beide verwenden können. Einer der Hauptunterschiede
zwischen Strukturen und Klassen besteht darin, dass Strukturen Werttypen
sind. Nun, wie funktioniert das? Nun, wir haben bereits darüber gesprochen , dass Klassen
Referenztypen sind. Wenn ich das hier wieder reinstelle, ist
Square jetzt eine Klasse. Ich habe
diese Methode hier einfach auskommentiert. Nun diese Methode hier, ich
übergebe das Quadrat, das jetzt eine Klasse ist,
in diese Methode Und ich ändere hier
einige Eigenschaften. Ich habe schon einmal darüber gesprochen. Wenn Sie einen
Referenztyp wie diesen hier übergeben, ist
das ein Referenztyp, er befindet sich im Heap-Bereich
des Speichers an eine Methode, dann wird er als Referenz übergeben Das bedeutet, dass die Methode
auf den Speicher auf dem Heap zugreifen kann. Es funktioniert mit dem
ursprünglichen Objekt , wenn die Methode abgeschlossen ist Hier haben wir immer noch
Zugriff auf die Änderungen innerhalb
dieser Methode
vorgenommen wurden , wenn ich
diese Anwendung ausführe.
Jetzt werden wir
sehen, dass sich diese Änderungen in der Ausgabe hier
widerspiegeln. Schauen wir uns
das an. Sie können hier
2.020.400 für die Gegend sehen 2.020.400 für Es ist eine
Referenztypvariable genau hier. Es lebt auf dem Haufen.
Lassen Sie uns das jetzt wieder in eine Struktur umwandeln
und sehen, was passiert Nun, das ist eine Struktur, die
ich bereits erwähnt habe. Die Strukturen sind Werttypen
und keine Referenztypen. Diese Änderungen werden sich nicht in der Ausgabe
widerspiegeln. liegt daran, dass die
Methode mit
einer Kopie des Wertetyps arbeitet . Alles, was sich hier geändert
hat, spiegelt sich nur in der Kopie wider. Die Änderungen werden nicht fortbestehen. Wir werden 5.4 sehen,
wie wir es zuvor getan haben. Wie Sie dort sehen können
, besteht einer
der Hauptunterschiede
zwischen Klassen und Strukturen darin
, dass Klassen Referenztypen und
Strukturen Werttypen sind. Das ist ein
Hauptmerkmal von Strukturen. Schauen wir uns
einige andere Unterschiede zwischen Strukturen und Klassen an, da sie sich ziemlich ähnlich sind und anscheinend genauso funktionieren. Lassen Sie uns über
die Unterschiede sprechen. Ich denke, das wird Ihnen helfen, besser zu
verstehen, was
Strukturen bewirken können, und auch
Nachteile sie haben. Bei Strukturen können wir keine Vererbungsklassen
verwenden, wir können
zum Beispiel von einer Basisklasse
erben Aber wenn wir
das mit Strukturen versuchen und den Mauszeiger darüber bewegen, ist ihre Form in der
Schnittstellenliste keine Schnittstelle Was bedeutet das?
Ziemlich kryptisch, nicht wahr? liegt daran, dass man mit
Strukturen tatsächlich Schnittstellen
implementieren
kann Sie können mit
Schnittstellen arbeiten, das ist kein Problem. Dieser Fehler hier, er erwartet eine Schnittstelle,
weil das so
ziemlich das einzige ist , was man in dieser Hinsicht mit einer Struktur
machen kann. Aber wenn ich versuche, von einer Klasse
eine Basisklasse zu
erben , lässt sie
mich das nicht tun, weil
es nicht möglich ist Das gesamte Konzept der Vererbung
gibt es bei Strukturen nicht Das ist ein Vorteil, den eine Klasse gegenüber einer Struktur haben
würde. Wir können nicht
von einer Basisklasse erben, aber die Struktur
selbst
kann auch keine abstrakte Klasse
oder Basisklasse Und das bedeutet, dass wir zum Beispiel keine
virtuellen Methoden haben können zum Beispiel keine
virtuellen Methoden Sie können hier sehen, als
ich das versucht habe, es ist nicht einmal gültig, es liegt daran, dass es
sich in einer Struktur befindet. Wir können also das
Schlüsselwort virtual nicht verwenden,
was bedeutet, dass wir es nicht überschreiben können, was bedeutet, dass wir
kein polymorphes Und denken Sie daran, das ist das
Konzept der Methodenüberschreibung. Zum Beispiel
können wir nicht virtuell verwenden, wir können nicht abstrakt verwenden Wir können also
so gut wie nichts in
Bezug auf Vererbung
oder ähnliches verwenden . Bei Strukturen gibt es viel einfachere
Typen als Klassen, also stell es dir so vor. Eine Struktur ist
einfacher als eine Klasse. Lassen Sie uns hier vielleicht über einen
Vorteil einer Struktur sprechen, oder vielleicht, warum wir
sie überhaupt verwenden würden. Warum sich überhaupt die Mühe machen? Warum nutzen wir nicht
einfach Unterricht für alles? Nun, Strukturen haben
keinen großen Speicherbedarf wie ein Objekt
vom Referenztyp. Zum Beispiel habe ich
hier
ein Videospielobjekt , eine Videospielklasse. Darin befinden sich
private Felder auf andere
Referenztypen wie eine Spielklasse,
eine Liste von Ganzzahlen,
einige Zeichenketten und eine Aufzählung
verweisen eine Liste von Ganzzahlen, einige Zeichenketten und eine Aufzählung Das ist ein ziemlich großer Fußabdruck und der lebt auf dem Haufen Aus diesem Grund
legen wir es nicht auf den Stapel. Aber wenn Sie zum Beispiel
eine Struktur für eine
sehr einfache Klasse verwenden , zum Beispiel diese quadratische
Klasse hier, hat
sie nur einfache
Werttypen wie nur einige Doubles Selbst wenn es Boolesche Werte und
ganze Zahlen gäbe, würde es viel schneller funktionieren
als Zuweisungen und
Zuweisungen Wenn Sie also im
Stack-Bereich des Speichers
mit einfachen Werttypen
und sogar Strukturen arbeiten , dann wird es Und Zuweisungen sind wiederum viel schneller und auch
billiger Das ist also ein Vorteil
der Verwendung einer Struktur. Sie denken vielleicht, okay,
was ist, wenn ich einen
Referenztyp innerhalb eines Wertetyps habe? Zum Beispiel ist eine Liste von Ganzzahlen eine Variable
vom Referenztyp. Und dann mache ich weiter und füge
das in meine Struktur ein, die ein Werttyp ist Ja, das ist möglich. Sie
können sehen, dass es keine Fehler gibt. Die Anwendung wird ausgeführt, aber das wird als
schlechte Praxis angesehen. Das solltest du nicht tun. Damit wird
der Sinn, überhaupt eine Struktur zu verwenden,
zunichte gemacht, was mich
zu meinem nächsten Punkt zurückbringt Verwenden Sie eine Struktur nur, wenn Sie
einen Container für
einfache Werttypen haben einen Container für
einfache Werttypen Zum Beispiel dieses Quadrat hier. Es hat eine Breite
, die doppelt so groß ist. Es hat eine Höhe
, die dem Doppelten entspricht. Wenn es eine Farbe hat, könntest du
diese
vielleicht durch eine Ganzzahl darstellen. Und diese Ganzzahl könnte auf etwas verweisen, das mit einer Farbe
zu tun hat. Zum Beispiel
könnte Weiß Null sein, Schwarz könnte eins sein,
Rot könnte zwei sein. Diese arbeiten mit
einfachen Werttypen. Hier
wäre eine Struktur in
diesem Fall perfekt, da sie
selbst ein Wertetyp ist. Aber ich verwende auch
Wertetypen darin. Ich habe nie vor, Vererbung zu
verwenden, ich habe nie vor, Polymorphismus zu
verwenden Ich habe nie vor, dass andere Strukturen oder Dinge daraus erben. Daher
wäre eine Struktur dafür eine gute Wahl. Es ist einfach, es ist schnell, es verwendet Wertetypen. Ich möchte nie weiter
darauf eingehen, was mit Erbschaft zu tun hat. Wenn all diese Kästchen
angekreuzt sind, verwenden Sie eine Struktur. Aber sobald wir anfangen, Dinge zu
denken wie, okay,
ich denke, dieses Quadrat
sollte von einer Basisklasse die Form erben Und vielleicht
könnte die Farbe eine Aufzählung sein, vielleicht hätte sie eine Liste von Pixeln und dergleichen Und wir fangen an, hier Felder
vom Typ Vererbung
und Heavy und Referenz
einzuführen , hier Felder
vom Typ Vererbung
und Heavy und Referenz ,
dann nein, wir
wollen keine Struktur, wir wollen eine Klasse verwenden Kurz gesagt:
Verwenden Sie eine Struktur, wenn Sie ein billiges Objekt
haben, aber verwenden Sie eine Klasse, wenn
Sie
sie erweitern und umfangreiche
Referenzobjekte verwenden möchten sie erweitern und umfangreiche
Referenzobjekte verwenden Das ist im Grunde
der Unterschied und warum Sie das eine verwenden sollten
und nicht das andere Einer der Hauptvorteile von
at gegenüber
einem Wertetyp und
allem, was damit zu tun hat , ist, dass Sie die gesamte
Struktur als schreibgeschützt
markieren können . Wenn Sie sich jetzt meine
Tutorials zu Read Only ansehen, werden
Sie verstehen, was es tut. Es ist ein unveränderlicher Datentyp. Sobald Sie einen Wert festgelegt haben, können
Sie ihn nicht mehr ändern. Und dafür gibt es viele
Gründe. Wenn ich versuche, diese
gesamte Klasse als schreibgeschützt zu markieren , kann man sagen, dass
sie für diesen Artikel nicht gültig ist Aber wenn ich zum Beispiel eine
schreibgeschützte Struktur wie diese erstelle, dann ist das überhaupt kein Problem Offensichtlich gibt es ein paar
Probleme, die damit zu tun haben. Sie können also sehen, dass
Instanzfelder schreibgeschützter Struktur schreibgeschützt sein
müssen. Diese müssen ebenfalls nur
gelesen werden. Die andere Sache ist natürlich, dass wir den Set-Modifikator nicht verwenden können,
wenn Dinge nur lesbar sind Wir müssen entweder hier
in der Felddeklaration initialisieren , also initialisieren wir hier oder
im Konstruktor hier Wenn du dir mein
Tuchoil nur lesend ansiehst, wirst
du dich daran erinnern
und das verstehen,
aber ich dachte, ich erwähne es einfach noch einmal Mit Strukturen können Sie
die gesamte Struktur
als schreibgeschützt markieren die gesamte Struktur
als schreibgeschützt Was Sie in
einer Klasse mit diesem Schlüsselwort nicht wirklich tun können. Und Sie werden vielleicht sehen, wenn Sie mit Ihren
Programmierprojekten
weitermachen , Sie werden feststellen, dass dies
auch bei der Arbeit
mit Strukturen
durchaus üblich ist . Das ist eine mächtige
Sache, die Sie
auch tun können , wenn Sie
mit Strukturen arbeiten. Aber ich denke, die wichtigste
Erkenntnis daraus ist, keine Angst davor zu haben,
Strukturen zu verwenden und zu experimentieren, sondern sie nur für
einfache Behälter zu verwenden Also Dinge wie Quadrate, bei denen
Sie einfache Werttypen haben. Sobald Sie anfangen,
über stark belastete
Referenztypen zu sprechen , verwenden
Sie in diesem Fall eine Klasse. Aber Strukturen eignen sich sehr
gut für die Arbeit mit Quick Muck Up-Anwendungen
oder einfachen Dingen wie diesen Ich hoffe, dieses Tutorial hat dir geholfen.
66. 16-1. Der Objekt-Datentyp - Boxen und Unboxing: In diesem Tutorial werden
wir
über den Objektdatentyp sprechen über den Objektdatentyp Und es sieht
ungefähr so aus. Möglicherweise sind Sie
beim Schreiben in
die Konsole auf den Objektdatentyp gestoßen . Wenn wir beispielsweise in die Konsole
schreiben, gibt es viele verschiedene Methodenüberladungen, die
wir hier verwenden können Aber Sie können sehen, dass einer
der Parameter hier zum Beispiel Objekt ist Was ist das? Wie funktioniert es? Nun, schauen wir uns an,
was der Objektdatentyp ist. Wenn Sie sich meine Tutorials zur
Vererbung sowie zu Wert
- und Referenztypen angesehen haben, wird es für Sie ganz einfach sein,
den Objektdatentyp zu verstehen . Nun, der Objekttyp ist die ultimative Basisklasse
für alle Datentypen, alle benutzerdefinierten Typen,
unabhängig davon, ob wir
Objektinstanzen,
Referenztypen wie Arrays
und ähnliches
und auch einfache
Werttypen wie Ganzzahlen,
Bolenes, Zeichen
und ähnliches erstellen Referenztypen wie Arrays
und ähnliches und auch einfache
Werttypen wie Ganzzahlen, Bolenes, Zeichen
und ähnliches Es ist die ultimative Basisklasse
für all diese Typen. Es ist ein
Referenztyp, was bedeutet,
dass er im
Heap-Bereich des Speichers gespeichert ist Außerdem ist es wie eine
ältere Technologie. Jetzt
kam etwas namens Generika auf den Markt. Und im Allgemeinen sind Generika
die bessere Methode, obwohl Sie heutzutage immer noch auf
den Objektdatentyp stoßen den Objektdatentyp Und die Verwendung des
Objektdatentyps kann zu einigen Problemen und Problemen führen, über die
wir ebenfalls sprechen werden Das ist der Prozess des
Boxens und Unboxens. Schauen wir uns jetzt ein Beispiel
an, als ich gerade gesagt habe, dass
der Objektdatentyp der ultimative Basistyp
ist,
was bedeutet das? Denken Sie daran, als ich zuvor über Schnittstellen
gesprochen habe und wir können die Schnittstelle
in Methoden übergeben Wenn wir
dann
die Schnittstelle implementieren, können wir
unsere Objekte weitergeben. Wenn wir mehrere Klassen haben, die dieselbe Schnittstelle
erweitern, können
wir diese
Objekte einfach beliebig weitergeben. Das ist der
Funktionsweise der
objektbasierten Klasse ziemlich ähnlich . Machen Sie sich keine Sorgen, wenn Sie
diese Tutorials zu abstrakten
Klassen und Schnittstellen nicht gesehen haben. Ich werde
es jetzt erklären. Hier
rufen wir einfach eine Methode und übergeben eine Zeichenfolge. Da steht nur Hallo Welt. Der Parameter ist eine Zeichenfolge. Was großartig ist
, weil wir
eine Zeichenfolge übergeben und sie dann an das Fenster
ausgeben Eine sehr einfache Anwendung. Stellen Sie sich das jetzt vor. Ich werde diese Zeichenfolge
einfach so
in das Object-Schlüsselwort ändern . Lassen Sie uns jetzt die Anwendung ausführen. Auch hier können Sie sehen, dass wir
genau das gleiche Ergebnis haben. Warum passiert das? Nun, es
liegt einfach daran, dass eine Zeichenfolge wie diese hier befriedigend ist, das ist eine Beziehung Und es ist ein Objekt, genau
wie eine Instanz einer Klasse. Zum Beispiel eine Videospielklasse, eine Hundeklasse, eine Tierklasse. Es gibt auch Klassen, aber sie sind auch Objekte. Dieses Objektschlüsselwort kann hier so ziemlich jeden
Datentyp im System
repräsentieren. Buchstaben, Zeichenketten
und sogar ganze Zahlen. Zum Beispiel 3456. Die Ausgabe wird dieselbe sein und es gibt keine Probleme
beim Kompilieren des Projekts Hier haben wir hier eine Ganzzahl, 3456, wir haben schon einmal darüber gesprochen Einfache Ganzzahlen,
Zeichenketten, Zeichen,
Boolene, das sind Sie befinden sich auf dem Stapel, im Stack-Bereich des Speichers. Objekte sind jedoch Referenztypen,
sie werden auf dem Heap gespeichert Was hier passiert, hier findet eine implizite Konvertierung
statt Diese Ganzzahl, die
wir übergeben
, wird in einen Objekttyp umgewandelt Dieser Vorgang wird Boxen genannt. Wenn wir
diesen Objektwert dann
wieder in eine Ganzzahl umwandeln , dann spricht man von Unboxing Wenn du mir nicht glaubst, werde
ich es dir beweisen. Wenn Sie hier mit einem
Objekttyp wie Value arbeiten, bietet
es einige Methoden
, die wir verwenden können Eine davon
heißt get type. Was das bewirken wird, es wird hier
den zugrunde liegenden Typ
dieses Objektwerts abrufen . Im Moment übergeben wir hier
eine Ganzzahl. Wenn ich das Programm ausführe, können
Sie sehen, dass es
den zugrunde liegenden Typ
des Objekts ausgibt ,
nämlich eine Ganzzahl von int 32, einer 32-Bit-Ganzzahl Ähnlich verhält es sich, wenn ich eine Zeichenfolge
übergebe und Hallo
sage, dann erhalten wir
zum Beispiel eine Zeichenfolge Sie können hier sehen, dass dies
der zugrunde liegende Typ
des Objekts ist , und wir können ihn mit
der Methode get type hier abrufen. Lass uns jetzt über Boxen
und Unboxing sprechen. Lass uns zuerst über
Boxen sprechen. Was ist Boxen? Wir haben
hier eine Ganzzahl namens numb und wir initialisieren
sie auf 1234 Jetzt fügen wir
diese Ganzzahl in ein Feld ein, daher der Name Boxen Wir sagen im Grunde, okay, ich möchte ein
brandneues Objekt erstellen. Denken Sie daran, dass dies die ultimative
Basisklasse für alle Typen ist. Ich möchte dem
den Wert Num geben. Jetzt sollte OBJ gleich 1234 sein. Jetzt möchte ich den Wert dieser
Zahl hier auf 100 ändern. Glaubst du, dieser Wert
wird sich damit ändern? Was ich mache, ich gebe hier zwei der Werte Wenn wir die Anwendung ausführen, ist
der Wert von num 100, was wahr ist, weil
wir ihn geändert haben Aber Sie können sehen, dass sich dies
hier nicht auf unseren
Objektwert auswirkt. Was ist hier los? Ich dachte, Objekt wäre
ein Referenztyp. Wenn etwas
ein Referenztyp ist, haben
wir einen Verweis auf
diesen Speicherbereich. Nun, das ist die
Strafe des Boxens. Was hier passiert, wenn
man etwas in eine Box
packt, dann steckt man quasi diese ganze Zahl in
eine Objektbox. Da es
sich bei Objekt jedoch um einen Referenztyp handelt, werden
alle Objekte im
Heap-Bereich des Speichers gespeichert Einfache Werttypen wie Ganzzahlen
werden auf dem Stapel gespeichert. Was hier passiert,
wenn wir
ein neues Objekt erstellen und es auf „taub“
setzen, hier kopieren
wir quasi
das gesamte Objekt, weisen etwas zusätzlichen Speicher
auf dem Speicherbereich zu und fügen diesen Und dann erstellen wir auch den Zeiger auf dem
Stapel, der darauf Es passieren viele Dinge
, wenn du das hier machst. Das ist jetzt implizit, was bedeutet, dass es
automatisch hinter den Kulissen passiert Sie haben keine
Kontrolle darüber. Boxen, eine sehr
teure Operation wenn wir uns
unser Beispiel zuvor angesehen haben, bei dem wir eine Ganzzahl an
die Methode übergeben haben und wir
einen Objektparameter hatten. All das passiert
hinter den Kulissen. Ein ganzer Speicherbereich auf
dem Heap wird zugewiesen,
nur weil wir eine Ganzzahl
übergeben und sie wird implizit in einen
Objekttyp umgewandelt Das ist die Strafe des Boxens. Dies ist auch etwas, das wir sehr stark
berücksichtigen sollten, insbesondere bei der Erstellung
umfangreicher Anwendungen. Gibt es einen besseren
Weg, das zu tun? Vielleicht sollten Sie stattdessen in Betracht ziehen , die Methode zu
überladen Wenn wir zum Beispiel die rechte Zeile der
Konsole haben, haben
wir hier all diese verschiedenen
Methodenüberschriften Wir können ein Char-Array,
eine Dezimalzahl, eine Doppelzahl aufnehmen . Aber sobald wir all diese
möglichen Werte haben, ja, dann gibt es eine Option
, ein Objekt aufzunehmen Aber das ist nicht verpflichtend. Es gibt Designaspekte , die bei der Verwendung von Objekten
hier
berücksichtigt werden müssen.
Wenn Sie beispielsweise bestimmte Datentypen ein Kästchen setzen, könnten
wir eine Zeichenfolge oder ein Zeichen in ein Kästchen setzen, aber im Prinzip wird dieser
Vorgang Boxen genannt. Das Gegenteil davon ist, wie Sie vielleicht
vermutet haben, das Unboxing Was ist Unboxing? Nun, Unboxing ist
so ziemlich das Gegenteil. Und das ist die Umwandlung
eines Referenztyps, z. B. eines auf dem Heap gespeicherten Objekts, sich den Heap-Bereich des
Speichers wieder in einen Wertetyp erinnert und
dann im Stapel gespeichert wird Das ist das Gegenteil von
Boxen, und das ist Unboxing. Es macht den
Vorgang in umgekehrter Reihenfolge. Schauen wir uns jetzt ein
Beispiel für Unboxing an. Jetzt werde ich
dieses Objekt hier auspacken. Denken Sie daran, dass beim Entpacken ein Referenztyp in einen Werttyp umgewandelt Schauen wir uns das
an. Jetzt möchte ich es
wieder in eine Ganzzahl umwandeln. Wenn ich es in
einen anderen Typ konvertiere, wird
ein Fehler auftreten. Wir werden ein Problem mit der
Typkonvertierung haben. Ich möchte eine Ganzzahl aus
dieser ganzen Operation herausholen. Das ist der Punkt, an dem ich
das Objekt wieder in
seinen ursprünglichen Typ bringen will. Ich habe eine Ganzzahl
namens result eingerichtet. Jetzt möchte ich das Objekt in
den
erwarteten Datentyp konvertieren . Das ist der erwartete
Typ, den ich will, das ist die Konvertierung. Ich möchte dieses
Objekt in eine Ganzzahl konvertieren. Und das ist der Prozess des
Entpackens von Objekten, die auf dem Heap
gespeichert sind Ich
möchte es in einen einfachen Datentyp konvertieren, und jetzt wird es genau hier
auf dem Stapel gespeichert Diese Ergebniszahl hier. Wenn ich nun das Ergebnis
im Konsolenfenster
ausgebe, schauen wir uns das Ergebnis an. Sie können hier sehen, wie ich meinen
ursprünglichen Wert habe, 1234. Jetzt fällt Ihnen vielleicht eine
Sache an diesem Tutorial auf,
und das ist, hey, ich führe hier dieses
Objekt-Schlüsselwort ein, diesen Objektdatentyp, aber Sie sollten ihn nicht wirklich oft
verwenden. Ja, ich weiß zu schätzen, dass dies
das allgemeine Thema
dieses Tutorials ist, aber es ist gut, sich dessen bewusst zu
sein. In den frühen Tagen von C Sharp war
es durchaus üblich, verschiedene Datentypen auf diese Weise zu konvertieren . Also konvertieren wir es in
einen Referenztyp und zurück in einen Wertetyp. Und das ermöglicht es uns,
verschiedene Datentypen als
ultimative Art von
Basisklassenobjekt zu übergeben verschiedene Datentypen als . Es war also ziemlich nützlich, aber dann wurden Dinge
wie Generika und andere Dinge eingeführt
, die
diese ganze
Objektnotation von Boxen und
Boxen irgendwie aus der Praxis
und aus der Mode gebracht diese ganze
Objektnotation von Boxen und
Boxen irgendwie aus der Praxis
und aus der Mode Aber es ist etwas
, dessen Sie sich bewusst sein sollten, denn vielleicht arbeiten
Sie mit älteren Systemen oder Sie arbeiten mit Systemen
, die zu Ihren passen Es heißt zum Beispiel
Interoperabilität, wenn Ihre Software
mit einer anderen
Software verknüpft wird und Sie auf
diesen Objektdatentyp stoßen. Wie Sie sehen können, wird es heute
noch verwendet. rechte Zeile
der Konsole verwendet
ein Objekt als Parameter und
viele andere Methoden und Klassen verwenden es ebenfalls. Aber es ist gut,
das Prinzip des Objektdatentyps und
den teuren Prozess
des Boxings und Unboxings zu kennen Objektdatentyps und
den , dem Datentypen und
Werttypen implizit
in Referenztypen
und dann wieder
zurück in Werttypen konvertiert Werttypen implizit
in Referenztypen und dann wieder
zurück in Werttypen Das
Boxen und Unboxing in C Sharp ist also mit einem ziemlich
großen Aufwand Boxen und Unboxing
67. 16-2. Das dynamische Keyword und die dynamische Typprüfung: In diesem Tutorial werden
wir uns das dynamische Schlüsselwort ansehen. Und das dynamische Keyword
sieht ungefähr so aus. Aber bevor wir über
das dynamische Keyword sprechen, wir einfach ein paar Schritte
zurück. Wenn Sie sich meine
vorherigen Tutorials ansehen in denen ich über C Sharp gesprochen habe, die Tatsache, dass es sich um eine stark typisierte und auch eine statisch
typisierte Sprache Lassen Sie mich kurz
darüber sprechen. einer statisch typisierten Sprache
sind die Variablentypen, zum Beispiel eine
Ganzzahl,
zur Kompilierzeit bekannt Dann klicke ich genau hier auf diesen kleinen grünen Play-Button Die Software kompiliert. Und wenn es irgendwelche Probleme gibt, warnt mich
der Compiler,
die Software kompiliert nicht Und das ist eine statisch
typisierte Sprache wie C Sharp. Dieser Vorgang wird als
statische Typprüfung bezeichnet. Statische Typprüfung, aber
was wäre, wenn ich Ihnen sagen würde
, dass es auch
etwas gibt, das als
dynamische Typprüfung bezeichnet wird? Was ist dynamische Typprüfung? Hier sind
zum Beispiel die
Variablentypen zur Laufzeit
bekannt. Wenn es ein Problem mit den Typen oder ähnlichem gibt, können
wir die
Software problemlos kompilieren. Wenn es jedoch einen Fehler gibt, wissen
wir es erst, wenn die
Software tatsächlich läuft. Was meine ich mit all dem? Nun, schauen wir uns hier ein Beispiel
an. Hier habe ich ein Beispiel für eine Ganzzahl. Ich initialisiere es
auf den Wert 55. Dann gebe ich
es einfach auf dem Bildschirm aus. Es macht nicht wirklich viel. Was ist jedoch, wenn ich dieser Ganzzahl jetzt vielleicht einen
Zeichenkettenwert
zuweisen
möchte ? Wenn ich
zum Beispiel nur Hallo eintippe , können Sie sehen
, dass hier ein offensichtlicher Fehler vorliegt. Es kann
die Zeichenfolge nicht implizit in eine Ganzzahl konvertieren. Das liegt daran, dass der Typ
dieser Variablen eine Ganzzahl ist. Aber was wir
hier versuchen, ist eine Zeichenfolge hineinzustopfen. Es wird nicht in Buchstaben geschrieben. Nicht nur das, unser
Programm lässt sich auch nicht kompilieren. Sie können sehen, dass hier
ein Fehler vorliegt. Dies ist ein Beispiel für die
statische Typprüfung. Es weiß, dass es sich um eine Ganzzahl handelt, also ist es ein Integer-Typ. Aber jetzt versuchen wir,
dort eine Zeichenfolge einzufügen. Aber wir werden gerade in der Entwicklung auf
dieses Problem aufmerksam gemacht in der Entwicklung auf
dieses Problem Dies wird also als
statische Typprüfung bezeichnet. Bei
so etwas wie der dynamischen Typprüfung werden
Sie jedoch nicht auf diesen Fehler
hingewiesen Alles wird gut aussehen, die Software wird gut
kompiliert Wenn Sie hier jedoch nichts gegen diesen speziellen
Fehler unternehmen, werden
Sie während der Laufzeit über
diesen Fehler informiert Es gibt also andere
Programmiersprachen, zum Beispiel Python oder Ruby. Nun, das sind dynamisch
typisierte Sprachen. Das heißt,
wir können das zum Beispiel tun und die Software wird
problemlos kompiliert, das ist kein Problem Sie werden jedoch während der Laufzeit
,
während die Software läuft, über diesen Fehler informiert Laufzeit
,
während die Software läuft Dies wird als Laufzeit bezeichnet und
hier
kann der Fehler während der Kompilierung auftreten Hier kann C Sharp
diese potenziellen Fehler im
Zusammenhang mit Typen erkennen, und das wird als
statische Typprüfung bezeichnet In
Sprachen wie Python und
Ruby werden Sie jedoch zur Laufzeit über diese Typfehler informiert Zum Beispiel während der Laufzeit, und das wird als
dynamische Typprüfung bezeichnet Jetzt habe ich über
statische Typprüfung und
dynamische Typprüfung
und die Unterschiede gesprochen . Es wird jetzt einfacher sein, das dynamische Schlüsselwort zu erklären. Unter der Haube
verhält sich
das dynamische Schlüsselwort also so ziemlich wie
der Objektdatentyp Wenn Sie meine vorherigen
Tutorials gesehen haben, in denen ich über
den Objektdatentyp und seinen
Kanal gesprochen habe , gilt er , gilt Basisklasse für
alle Typen, zum Beispiel die Basisklasse
von Double Integer Bolen. Aber nicht nur das,
sondern auch Dinge wie Listen und benutzerdefinierte Objekte
und solche Dinge Wenn Sie sich also an
dieses Detail über den
Objektdatentyp erinnern
und es verstehen , werden
Sie
mit dem dynamischen Schlüsselwort sofort loslegen. Schauen wir uns nun ein
Beispiel an. Also, was ich jetzt
machen werde, ist
ein Beispiel mit dem
Objektdatentyp zu machen . Also diese Variable, die
hier Test genannt
wird, wird ein Typobjekt sein. Ich
speichere hier einen Wert,
35,5, der ein Doppeltes sein könnte Zum Beispiel sieht es für mich
wie ein Double aus, aber hier gibt es kein
Problem, weil Objekt hier wie eine
Basisklasse ist, es wird
diesen Wert problemlos akzeptieren Aber jetzt versuchen wir, diesen Testwert, der ein Objekt vom Datentyp ist
, um
7,5 zu
erhöhen Objekt vom Datentyp ist
, . Es sieht so aus, als würden wir a zu einem Double
hinzufügen Was in Ordnung sein sollte, wenn
wir es vorher doppelt hatten. Es hat ohne Probleme funktioniert. Sie können hier also sehen, dass
es kein Problem gibt. Aber jetzt habe ich daraus einen Objektdatentyp gemacht,
es gibt ein Problem. Wenn ich das hervorhebe, heißt
es, dass Operator Plus
nicht auf ein
Objekt angewendet werden kann und Double bei der
Arbeit mit Objekten, wir haben über
Boxen und Unboxing gesprochen Was ich hier mache, ich habe hier
einen einfachen Datentyp,
35.5, der wie ein Double ist, und ich stopfe das
in einen Objektdatentyp Wenn Sie sich noch daran erinnern, dies ein Referenztyp ist, also wird er im
Wärmebereich des Speichers gespeichert Was wir tun, ist
den Wert hier zu testen. Wenn wir versuchen,
den Wert zu erhöhen , gibt es hier
ein Problem. Wir können
diesem Wert hier nicht 7,5 hinzufügen. Was wir hier tun müssen, wenn beispielsweise
den
Wert erhöhen,
ist, diesen Objektdatentyp explizit in einen Typ
zu konvertieren , mit dem wir arbeiten können Wir versuchen, 7,5
hinzuzufügen, was ein Double ist, also muss ich
das in ein Double umwandeln Wir können es
mit
der
Klasse convert static, die wir in den vorherigen Tutorials die ganze
Zeit verwendet haben, in
ein Double der
Klasse convert static, die wir in den vorherigen Tutorials die ganze
Zeit verwendet haben konvertieren. Und das wird
gut funktionieren. Was ich hier mache, ist den Wert hier
auszupacken. Ich boxe hier, ich packe aus. Wenn
wir das Boxen und
Auspacken machen, wie wir es
bereits besprochen haben, ist das ein bisschen
leistungsintensiv wir das Boxen und
Auspacken machen, wie wir es
bereits besprochen haben, ist das ein bisschen
leistungsintensiv Aber es funktioniert einwandfrei, wenn man
das Objekt in ein Double umwandelt. Dann füge ich ein Double hinzu, dann speichere ich den Wert
wieder im Objekt, also packe ich ihn erneut und gebe dann
den Wert Wenn ich das Programm starte, siehst du
jetzt, dass ich den Wert 43 habe, was ungefähr richtig aussieht Sie können sehen, dass es
funktioniert. Kein Problem. Ich kann tatsächlich
Werte zusammenfügen. Ich kann hier
zum Beispiel sogar fünf hinzufügen , und es
wird gut funktionieren. Das ist ein kleiner
Vorteil, wenn
man so etwas gegenüber
einzelnen Datentypen verwendet , aber es gibt Leistungseinbußen. Aber was ich damit sagen
will, ist, wenn Sie
den Objektdatentyp verwenden und die Werte ändern
möchten, müssen
Sie das
Unboxing hier durchführen Sie müssen hier eine
explizite Konvertierung durchführen. Nun zu dem dynamischen Schlüsselwort, das
ich gleich einführen werde, habe ich gesagt, dass es sehr eng mit
dem Objektdatentyp verknüpft ist. Es verhält sich sehr ähnlich. Aber wir müssen
diese explizite
Konvertierung hier nicht durchführen diese explizite
Konvertierung hier Und das ist nicht der
einzige Unterschied. Einer der wichtigsten Unterschiede besteht
darin, dass es eine
dynamische Typprüfung in
einer C Sharp-Umgebung ermöglicht . Lassen Sie uns also mit
dem dynamischen Schlüsselwort beginnen. Das allererste,
was ich tun werde, damit Sie
es ein wenig besser verstehen,
ist, dieses Beispiel
mit dem dynamischen Schlüsselwort zu konvertieren. Also was ich hier mache, ich definiere diese Variable hier
als dynamisch. Und weil es sich nicht um
den Objektdatentyp und wir nichts
explizit umwandeln müssen, brauchen
wir diese
Umwandlung nicht direkt. Wenn ich das Programm jetzt starte können
Sie sehen, dass es
genauso funktioniert wie zuvor. Es beschwert sich nicht darüber einem
Objektdatentyp einen Wert
hinzuzufügen Sie können also sehen, dass hier
ein erheblicher
Vorteil besteht Wir müssen zum Beispiel
unsere Variablen nicht explizit umwandeln. Das ist also ziemlich gut. Und
wie ich bereits erwähnt habe, funktioniert
es wie das
Objekt unter der Motorhaube. Es ist also fast, weißt du, die Master-Basisklasse,
die mit ganzen Zahlen,
Bouleenen und all diesen
Dingen arbeitet Bouleenen und all diesen
Dingen Das ist also der erste
Vorteil der Verwendung von Dynamic. Wir müssen nichts
explizit umwandeln, also müssen wir nicht explizit sagen,
okay, mach das
zu einer Ganzzahl. Deshalb können wir jetzt
eine Ganzzahl hinzufügen oder daraus eine doppelte Zahl
machen. Also können wir ein Double hinzufügen. Wir müssen nichts davon tun. Es sieht völlig in Ordnung aus. Sieht aus, wir haben
es als Double definiert, jetzt fügen wir
eine Ganzzahl hinzu. Das ganze
Umwandlungs-Casting-Boxen und das fertige Boxen finden
hinter den Kulissen statt. Davon haben wir keine
Einsicht. Es ist alles für uns erledigt. Das ist also ein Vorteil, dass uns die Komplexität
genommen wird. Schau dir an, was Als auch kann. Zum Beispiel initialisieren wir, das ist wie ein Double, und dann wollen wir eine Ganzzahl
hinzufügen Was ist nun, wenn ich zum Beispiel sage, dass Test
gleich Hallo ist? Was glaubst du, wird passieren? Lassen Sie uns jetzt die Anwendung ausführen, sie
aussieht,
wir geben Hallo aus Also was ich
tun werde, ich werde hier einige Haltepunkte
hinzufügen einige Haltepunkte
hinzufügen Wir werden in den Pausenmodus wechseln , wenn wir die Anwendung ausführen Und dann werden wir
diesen Variablentest hier unten analysieren . Lassen Sie uns das ansprechen, damit
wir es uns besser ansehen können. Im Moment können Sie sehen, dass wir
hier
ein dynamisches Objekt haben , nämlich ein Testobjekt. Und es hat noch keinen
Wert, weil wir diese Codezeile nicht ausgeführt
haben. Sobald ich diesen Wert überschritten habe, können
wir sehen, dass der Test jetzt abgeschlossen ist, weil wir einen
doppelten Wert eingegeben haben Jetzt erhöhen wir
den Wert um fünf, was ziemlich in Ordnung zu sein scheint Sie können also sehen, dass es
immer noch ein Doppelter ist. nun versuchen, hier einen
Zeichenkettenwert einzufügen, Wenn wir nun versuchen, hier einen
Zeichenkettenwert einzufügen, können
Sie sehen, dass wir jetzt
eine dynamische Zeichenfolge haben. Sie können also sehen, dass es in der Art und Weise, wie es funktioniert, ziemlich
flexibel ist. Es wirft so ziemlich einfach
das gesamte Konzept der Typen über Haufen oder verbirgt Ihnen zumindest das Konzept
der Variablentypen Bei der Entwicklung von
Anwendungen kann
es sich also so anfühlen, als ob Ihnen
all diese Komplexität genommen
wird Sie müssen sich keine Gedanken darüber machen, ob
es sich um eine Zeichenfolge handelt, ob es sich um eine Ganzzahl handelt. Vielleicht Python-Programmierer oder wenn Sie Java-Skript gemacht
haben, finden
Sie das vielleicht
wirklich nützlich Während der Laufzeit können jedoch Fehler
auftreten, und zwar dann, wenn Ihre
Anwendung tatsächlich ausgeführt wird Es gibt also einige
Probleme im Zusammenhang mit dem dynamischen Schlüsselwort, mit denen Sie vorsichtig sein
müssen. Also das dynamische Keyword, es klingt für Sie wahrscheinlich
ziemlich gut. Wir müssen uns
keine Gedanken über Typen machen, wir müssen nicht in verschiedene Typen
konvertieren. Wir können es einfach
für alles verwenden. Weißt du, warum nicht? Und vielleicht gibt es hier eine leichte
Leistung, aber ansonsten scheint es
ziemlich gut zu sein, oder? Nun, lassen Sie uns jetzt über
die Nachteile der Verwendung von
Dynamic sprechen jetzt über
die Nachteile der Verwendung von
Dynamic Aber zuerst werde ich
ein Beispiel vorstellen, in dem wir
mit einigen benutzerdefinierten Objekten arbeiten Also was ich hier habe, ich habe einen Videospielkurs,
es ist ziemlich einfach. Es hat vier private Felder, einen Konstruktor, eine Beispielmethode
und hier nur ein Beispiel für öffentliches
Eigentum, das nur den
Titel des Videospiels erhält. Es macht nicht viel Ich habe die Klasse instanziiert. Hier habe ich ein
Videospielobjekt namens Game One. Wenn Sie meinen
00-Tutorials von früher gefolgt sind, als wir diese Instanz verwenden
. Hier können wir verschiedene Dinge sehen. Wir können unsere Get
Publisher-Methode sehen. Und wir können unser Eigentum
genau hier sehen, den Titel. Wir können das sehen, wenn dieses
Fenster hier erscheint,
das ist, als würde Visual
Studio uns helfen Und ein anderes Wort davon
heißt Intellisense. Und was Intel Sense macht, es bietet uns nur einige nette Das erspart uns das Tippen. Zum Beispiel können wir darauf
doppelklicken und haben dann Zugriff auf die
Methode Nummer eins. Wir wissen, dass die Methode da ist. Zweitens wissen wir, dass wir auf die Methode zugreifen
können, sie ist nicht
privat oder so. Drittens, wenn wir darauf
doppelklicken, müssen
wir uns keine
Gedanken über die
Rechtschreibprüfung machen, also ist
es ziemlich gut Es gibt uns auch
Parametertypen, die wir verwenden
können, und
informiert uns auch über Rückgabetypen Intel Sense, auch
bekannt als Visual Studio, ist also ein
sehr gutes Feature, das uns
hilft, ist also ein
sehr gutes Feature, das uns
hilft und ich kann es nur empfehlen, es zu verwenden. Bei Verwendung
des dynamischen Schlüsselworts ist
Intellisense jedoch ist
Intellisense Nun, dafür gibt es einen guten
Grund, aber es ist einer der
großen Nachteile
gegenüber der Verwendung des dynamischen Schlüsselworts Schauen wir uns das jetzt an. Im Moment richte ich
hier gerade ein Spiel ein. Dann möchte ich
zum Beispiel
den Herausgeber ermitteln, lassen Sie uns das einfach in einer Zeichenfolge
speichern. Ich werde es in einer
Zeichenfolge namens Pub speichern. Und dann möchte ich es einfach im Fenster
ausgeben. Hier ist nicht viel los. Es sollte zum Beispiel
Blizzard ausgeben. Lassen Sie uns die Software jetzt ausführen und wir können Blizzard sehen Es sieht so aus, als ob es gut
funktioniert. Lassen Sie uns das nun
in einen dynamischen Typ umwandeln. Jetzt habe ich ein dynamisches
Objekt namens Game One. Es hat den Wert
der neuen Instanz
der Videospielklasse. Wie ich schon sagte, es
muss keine doppelte Ganzzahl sein. Es könnte ein komplexer Typ sein,
es könnte ein Array,
eine Liste oder sogar eine benutzerdefinierte Klasse sein , wie die Videospielklasse. Absolut, das
ist überhaupt kein Problem. Vollständig unterstützt durch
das dynamische Schlüsselwort .
Und auch das ist wie das
Objekt hinter den Kulissen. Soweit ist alles in Ordnung. Und wenn ich die Anwendung ausführe, erhalten
wir genau das gleiche
Ergebnis, überhaupt kein Problem. Aber sieh dir an, was passiert. Jetzt setze ich einen Punkt nach Spiel eins. Sie können sehen, dass wir das alles im wahrsten Sinne
des Wortes verloren haben. Visual Studio
weigert sich jetzt, uns zu helfen. Wir wissen nicht, welche
Methoden wir
zur Verfügung haben , es sei
denn, wir schauen uns das an und kopieren sie vielleicht und
fügen sie ein Auf diese Weise gibt es jedoch
viele Probleme. Die Sache ist die, sie ist darauf angewiesen, dass die
Erde keine Fehler macht. Erstens, wie ich schon sagte, vielleicht ist das eine private Methode, also können wir außerhalb dieser Klasse nicht einmal
darauf zugreifen. Also, weißt du, könnten
wir hier ein
großes Problem schaffen. Wenn ich die Anwendung starte, heißt es
jetzt, heißt es
jetzt aufgrund
ihrer Schutzstufe
nicht zugänglich Nun, was ist, wenn ich einen Tippfehler gemacht habe? Was ist, wenn ich F hier einfüge? Sie können sehen, dass es nicht rot
hervorgehoben ist. Führen Sie die Anwendung aus und sie enthält
keine Definition. Nun, das liegt daran, dass ich
es falsch buchstabiert habe und es ein Unfall ist Aber Visual
Studio hilft mir nicht. Ich habe null Intellisense. Das ist also einer der Nachteile der Verwendung des dynamischen
Schlüsselworts Verwendung des dynamischen
Schlüsselworts Sie haben absolut überhaupt keinen
IntelliSense. Und Intellisense
ist wirklich nützlich, und viele Leute halten es für selbstverständlich Aber es gibt Ihnen
alle Methoden und
Eigenschaften, die Sie
tatsächlich für ein Objekt verwenden können Sie fragen sich vielleicht, was diese Zauberei vorher
war,
bei der Sie Publisher falsch geschrieben haben
und es keine rote Linie gab Warum war das so? Was ist hier
los? Warum
konnte das Programm dich ausführen? Das ist normalerweise nicht erlaubt. Nun ja, das
stimmt, denn wenn ich das wieder in
ein Videospielobjekt
verwandle, kannst
du sehen, dass wir die rote Linie bekommen. Und das liegt daran, dass ich zu
Beginn dieses Videos gesagt
habe, dass C Sharp eine
statisch typisierte Sprache Und das bedeutet nur, dass alles bei der Kompilierung abgefangen
wird. Ich kann
die Anwendung also nicht einmal kompilieren , weil hier die Fehler abgefangen werden. Wenn Sie jedoch
das dynamische Schlüsselwort verwenden, ist all das weg. Nichts, was dynamisch ist,
wird bei der Kompilierung abgefangen. Der Fehler ist also weg. Das Programm kann kompilieren. Das Programm kompiliert, wenn das schwarze Fenster erscheint,
wie Sie dort sehen können Aber jetzt wird der Fehler
tatsächlich zur Laufzeit abgefangen. Und das ist der Fehler
, der ausgelöst wird. Es wird hier als
Runtime-Binder-Ausnahme bezeichnet. Also Runtime-Binder-Ausnahme. Das passiert also zur Laufzeit während Ihre Software tatsächlich
läuft. Kurz gesagt, wenn Sie das dynamische
Schlüsselwort so verwenden, lässt Ihnen
Visual Studio einfach freie Hand. Es heißt wortwörtlich, okay,
tu, was immer du willst Wenn etwas dynamisch ist,
rufen Sie eine beliebige Nachricht an, rufen Sie eine beliebige Immobilie an. Weißt du, es spielt keine Rolle. Ich werde
dir keine roten Linien geben. Ich lasse Sie Ihre Software
kompilieren, Sie können tun, was
Sie wollen. Sie können menschliches Versagen einführen, so
ziemlich Sie haben freie Hand. Das ist also ein Vorteil oder vielleicht ein großer Nachteil der Verwendung des dynamischen Schlüsselworts. In dieser Hinsicht liegt die Wahl also bei
Ihnen. Aber Programmiersprachen
wie Python, Ruby, sogar Java Script, das sind
dynamisch typisierte Sprachen C Sharp ist jedoch eine
statisch typisierte Sprache. Sie fragen sich vielleicht,
warum eine statisch
typisierte Sprache dies überhaupt
unterstützt Weißt du, warum haben
wir das überhaupt? Ich dachte, das wäre eine
statisch typisierte Sprache. Nun, was ist, wenn Sie
Software erstellen möchten , die
mit Python-Software funktioniert? Wenn Python und Ruby beispielsweise dynamisch typisierte Sprachen
sind, muss meine Software vielleicht mit ihnen arbeiten Und eine ausgefallene Art,
dies auszudrücken , heißt Interoperabilität oder kurz Interrupt Wenn ich
Software erstellen möchte, die mit der Software einer
anderen Person
funktioniert, diese
aber eine
andere Sprache verwendet hat, dann ist das dynamische
Schlüsselwort hier tatsächlich sehr nützlich, selbst wenn man mit
dem Dokumentobjektmodell arbeitet Nun, das ist etwas, das
HTML und XML verwenden , wenn sie solche Dinge verwenden. Sie wissen einfach erst zur Laufzeit,
welche Methoden und Eigenschaften verfügbar
sind. Deshalb ist es sehr nützlich. Zur Compilerzeit ist nicht alles bekannt
. Wenn Ihre Software kompiliert wird, wird sie Ihnen
manchmal nur zur Laufzeit
zur Verfügung gestellt Deshalb ist das dynamische
Schlüsselwort wirklich nützlich. Also ein paar ausgefallene
Terminologie für Sie. Wenn wir unser einfaches
Videospielobjekt haben über das
wir bereits gesprochen haben,
und wir sagen wollen, eine Methode namens
get publisher
aufrufen, dann ist das ein Beispiel für das,
was Early-Binding genannt wird. Und das heißt einfach, okay, diese Methode steht uns zur Verfügung, wir verwenden sie genau hier. Alle Fehler werden bei der Kompilierung
erkannt. Wenn wir auf diese
kleine graue Schaltfläche klicken und die Bindung früh abgeschlossen ist, funktioniert
alles,
es liegt kein Fehler vor. Wenn ich das zum Beispiel getan habe, gibt es ein
Fehlerbeispiel für frühes Binden. Wenn dies jedoch
dynamisch wäre und wir versuchen, dies jetzt zu
tun, haben
wir keine Ahnung, ob diese
Methode verfügbar ist. Wir haben keine Ahnung,
ob diese Methode
öffentlich, privat oder
intern geschützt ist . Wir haben keine Ahnung, ob ich es richtig
geschrieben habe. Wenn ich
die Anwendung jedoch ausführe, erfolgt die Bindung während der Laufzeit. Jetzt sofort, okay? Ja, die Methode ist verfügbar. Wir haben es gerade aufgerufen,
wir haben ein Ergebnis. Dies ist ein Beispiel für
spätes Binden, frühes Binden vor
spätem Binden während der Laufzeit. Ein paar Dinge, die Sie
vielleicht in Zukunft hören werden, aber ich dachte, ich würde
sie jetzt ansprechen. Eine andere Sache, die ich nicht
erwähnt habe, war Dynamik. Wenn Sie eine Variable definieren, zum Beispiel eine einfache Ganzzahl
oder etwas Ähnliches, was auch immer Sie wollen, ist
der Typ nicht wichtig. Sie müssen es nicht initialisieren. Du kannst, wenn du willst. Das kann nicht schaden, ist
aber nicht erforderlich. Du musst nicht sagen,
okay, das entspricht fünf. Du kannst das später herausfinden. Das ist eine weitere Sache, die Sie mit dem dynamischen Keyword
tun können. Eine andere Sache, die Sie mit Dynamic
tun können, ist, es sogar an Methoden zu übergeben und es aus Methoden
zurückzugeben. Ich habe gerade eine
Beispielmethode namens Echo eingerichtet. Es wird nur den
Wert des Herausgebers widerspiegeln. Ich weiß zum Beispiel für ein Faktenspiel einen Verlag
, der das für mich erledigt, ich habe kein Intellisense Ich gehe davon aus, dass es richtig geschrieben ist. Dann geben wir das einfach
auf dem Bildschirm aus. Lassen Sie uns das auskommentieren und dann rufen wir
die eigentliche Methode auf. Das sieht ziemlich gut aus. Wir übergeben das dynamische
Spielobjekt als Parameter an die dynamische
Spielobjekt als Parameter an Methode und geben
das Ergebnis
der
Get-Publisher-Methode wieder.
Lassen Sie uns das Programm ausführen Sieht aus, als ob es funktioniert. Sie können es hier sehen, aber nicht
nur, wie ich bereits erwähnt habe, wir können auch das
dynamische Schlüsselwort zurückgeben. Also hier rufe ich hier die Methode , die jetzt
keine Parameter benötigt. Ich initialisiere ein neues
Videospielobjekt und gebe es sofort zurück Aber ich gebe
das dynamische Schlüsselwort zurück , weil ich
kein Videospielobjekt haben möchte Und dann fange ich
das Ergebnis hier in einem neuen dynamischen Spielobjekt ab und dann erhalte ich
den Herausgeber. Sie können also sehen, dass es auch
als Rückkehr funktioniert , dynamisch. Sie können
es problemlos weitergeben. Lassen Sie uns das
dynamische Keyword jetzt zusammenfassen. Beim dynamischen Schlüsselwort müssen wir uns keine Gedanken
über die Typen machen, wir müssen uns keine Gedanken
über die Casting-Typen Das Boxen und die
Umstellung auf Boxen sind für uns erledigt. Das ist großartig.
Es gibt jedoch Auswirkungen auf die Leistung. Auch hier müssen wir uns darum
kümmern, dass
unsere Methoden korrekt buchstabiert werden herauszufinden, ob sie
tatsächlich zugänglich sind. Viele verschiedene Dinge. Kurz gesagt, Dynamik
wird in einer typischen C
Sharp-Anwendung nicht verwendet Wenn Sie nur einen Taschenrechner
oder etwas ganz Einfaches
erstellen , sollten
Sie
das dynamische Schlüsselwort nicht wirklich verwenden Wenn Sie jedoch
vielleicht mit anderer Software arbeiten vielleicht mit anderer Software die
in dynamischen Sprachen entwickelt wurden,
oder vielleicht mit etwas, das als COM-Objekt oder
dem
Dokument-Objektmodell für HTML
bezeichnet wird . Hier kommt das
dynamische Schlüsselwort ins Spiel, und hier sollten
Sie es verwenden, da Sie in
solchen Fällen zur Kompilierzeit sowieso keinen Zugriff
auf diese Methoden
haben Möglicherweise haben Sie nur
zur Laufzeit Zugriff auf sie. Hier würden Sie also
das dynamische Schlüsselwort
in diesem Sinne verwenden . Es wird also nicht in
gängigen Shop-Anwendungen verwendet. Es ist also eines von denen
mit Szenarien in denen Sie sich nie
wirklich fragen, ich das
dynamische Schlüsselwort verwenden
sollte. Es wird dir normalerweise präsentiert. Okay, ja, das sieht definitiv
so aus , als ob ich
das dynamische Schlüsselwort verwenden sollte. Und genau das
passiert im Allgemeinen,
wenn Sie zum Beispiel eine neue Software Das dynamische Schlüsselwort bietet also eine dynamische Typüberprüfung, und es ist im Grunde
der Objektdatentyp, aber auf Steroiden.
Danke fürs Zuschauen. Ich hoffe es war nützlich.
68. 16-3. Das var-Keyword und die Typ-Inferenz: Basierend auf allem, was
wir bisher gelernt haben. Was wäre, wenn ich dir sagen würde, dass wir
keine Datentypen mehr benötigen? Zum Beispiel benötigen wir keinen Objektdatentyp für
Videospiele. Wir benötigen keinen Listendatentyp. Wir benötigen keinen
String-Array-Datentyp, nicht einmal ein Interble
oder ein Zeichen Und alles ist in Ordnung und
die Software wird kompiliert. Was zur Hölle ist hier los? Nun, lassen Sie mich
etwas ganz anderes vorstellen. In diesem Tutorial
werde ich jetzt über
das Varki-Wort in C Sharp sprechen Es sieht ungefähr so aus. Wenn Sie
meine vorherigen Tutorials
zum dynamischen Schlüsselwort nicht gesehen haben , in denen ich über dynamische
Typprüfung
und auch über statische Typprüfung
gesprochen habe, all diese guten Dinge,
dann empfehle ich
Ihnen dringend , sich diese anzusehen, bevor Sie mit diesem Tutorial
fortfahren. Andernfalls wird es Ihnen schwerer
fallen die in diesem Tutorial
hervorgehobenen Konzepte zu
verstehen. Was ist also das
Schlüsselwort Var? Wie funktioniert es? Nun, wir können das Schlüsselwort Var verwenden , wenn wir
so etwas wie eine Variable definieren. Zum Beispiel haben wir
hier
eine Integer-Variable und wir setzen sie auf 55. Wir könnten dies auch als v
festlegen, was wie ein Var-Datentyp aussieht. Va ist jedoch kein Datentyp. Das Schlüsselwort Var ist die
Abkürzung für okay. Finden Sie heraus, um welchen
Datentyp es sich tatsächlich handelt , wenn Sie beispielsweise Ihre
Anwendung kompilieren Alle Prüfungen,
die das Schlüsselwort Var verwenden, werden also zur Kompilierzeit
durchgeführt. Erinnern Sie sich jetzt an unser letztes
Tutorial, in dem wir über
das dynamische Schlüsselwort gesprochen haben und darüber, wie alles, was mit
einem dynamischen Schlüsselwort zu tun zur Laufzeit herausgefunden
wurde. Existieren
die Methoden zum Beispiel? Existieren die Eigenschaften? Und dann verbindet es es irgendwie in einer späten Bindung
miteinander. Zur Laufzeit, naja, die Va ist zur Kompilierzeit fertig. Wenn ich also zum Beispiel versuche,
eine Methode
für eine var-Variable aufzurufen eine Methode
für eine var-Variable , dann wird es zu einem Fehler kommen, wenn die
Methode nicht existiert. Aber das werden wir später
behandeln. Schauen wir uns ein kleines Beispiel
mit dem Schlüsselwort var
an und
dann machen wir weiter. Schauen wir uns jetzt ein paar
einfache Beispiele an. Hier habe ich hier eine lokale
Variable namens test. Aber anstatt ihr beispielsweise
eine Ganzzahl oder eine Zeichenfolge
oder etwas Ähnliches zu geben , verwende
ich hier das Schlüsselwort var. Und wie ich bereits erwähnt habe, liegt
es an Visual Studio und dem Compiler, herauszufinden, um
welchen Datentyp es sich handelt Ich sage Visual Studio , weil ich
die Variable hier gerade definiert habe Und wenn ich hier mit der Maus drüber
fahre, können
Sie sehen, dass es denkt,
es ist eine Ganzzahl Wenn ich das in eine Zeichenfolge ändere, ist es egal, was da
drin steht . Es kann leer sein. Ich bewege den Mauszeiger über Test, und jetzt ist es ein String-Datentyp Was es macht, es berechnet den Datentyp auf
der Grundlage dessen,
womit Sie ihn initialisieren Ich habe es mit einer Zeichenfolge initialisiert. Hier können Sie sehen, wenn
ich mit der Maus darüber fahre, dass es sich wie zuvor um einen
String-Datentyp Es könnte zum Beispiel eine Ganzzahl
oder sogar ein Double sein, jetzt ist es ein Double Wenn ich die Anwendung nun tatsächlich
kompiliere, wird
hier
anhand Ihrer
Aktionen herausgefunden, ob etwas gültig oder ungültig ist. Dies ist der Kompilierungsprozess
und hier wird tatsächlich
herausgefunden, um welchen Datentyp es sich zur Kompilierungszeit handelt. Das ist ein einfaches Beispiel dafür dass Var kein Datentyp ist. Aber Sie können sehen,
dass
sein Datentyp tatsächlich auf dem basiert, wofür
Sie ihn initialisieren Was passiert, wenn ich
nicht initialisiere? Nun, das ist nicht möglich. Man kann nicht wirklich etwas mit
dem Schlüsselwort var
definieren und ihm
keinen Wert geben weil dann das
System keinen Datentyp
daraus berechnen kann , wann immer
es mit dem Schlüsselwort var immer initialisiert
werden muss dem Schlüsselwort var immer initialisiert
werden muss, damit es
herausfinden kann, um welchen Datentyp es sich handelt, zum Beispiel eine Zeichenfolge Der Prozess,
den Datentyp anhand
des Initialisierungswerts zu ermitteln ,
nun, dafür gibt es ein ausgefallenes
Wort und es heißt Typinferenz Vielleicht hören Sie das in der Zukunft. Es heißt Typinferenz, und hier erraten wir den Datentyp anhand
des Anfangswerts. Unsere lokale Variable
hier, der Typ, ist eine Zeichenfolge, weil sie
hier
auf dem
Initialisierungswert basiert auf dem
Initialisierungswert Was wir dann nicht tun können,
ist
dies einfach in einen völlig anderen
Typ umzuwandeln . Das kannst du hier sehen. Der Typ kann nicht in eine Zeichenfolge konvertiert werden,
sobald dieser initialisiert wurde. Zum Beispiel
ist dies jetzt eine Zeichenfolge. Es ist so ziemlich eine
Zeichenfolge für ihre gesamte Lebensdauer. Wir können es nicht einfach dann, okay, zu einer Ganzzahl
machen, es zu einem Booling Das können wir
mit dem Schlüsselwort Var nicht machen. Schauen wir uns ein Beispiel mit einigen
komplizierteren Objekten an. Lassen Sie uns nun zum Beispiel ein Spielobjekt
definieren. Dies ist unsere
Videospielklasse, in der
wir nur
einige Beispielwerte übergeben. Hier kannst du dir
den Kurs hier ansehen . Hier ist
nicht viel los. Privates Feld, ein Konstruktor
und eine Beispielmethode. Ich
nenne diese Beispielmethode hier
einfach Get Publisher
Back Out Here. Ich richte ein neues
Videospielobjekt ein, aber ich speichere es hier
in einem Spiel, das das Schlüsselwort Var verwendet. jetzt dieses Spielobjekt verwenden, können
Sie sehen, dass ich die
volle Intellisense Hier habe ich die vollständige
Visual Im Gegensatz zum dynamischen Schlüsselwort, denn ich erinnere mich daran, dass
im letzten Tutorial als ich über Dynamik gesprochen habe, alles zur Laufzeit
herausgefunden wird Wir haben also überhaupt kein
Intellisense,
weil all dies zur Kompilierzeit
herausgefunden wird Dann habe ich vollen Zugriff auf den Intellisense
. Ich werde also keine
Tippfehler machen, Methoden erraten, Methoden
aufrufen, die vielleicht
privat sind, und ich rufe sie außerhalb Ich werde
diese Fehler nicht machen, wie vielleicht bei der Verwendung
des dynamischen Schlüsselworts der Fall wäre Wenn ich die Anwendung starte, können Sie
jetzt sehen, dass ich
den Herausgeber problemlos finde
und dass ich vollen Zugriff auf
die Intellisense habe Lassen Sie uns also über
einige Fallstricke bei
der Verwendung des Schlüsselworts Var sprechen der Verwendung des Was kann ich damit nicht machen? Und warum ist es schlecht? Zum Beispiel? Nun, im Gegensatz zum
dynamischen Keyword hat
Var nicht
wirklich viele Nachteile oder negative Auswirkungen. Es gibt jedoch
einige Nachteile. Zum Beispiel können wir
das Schlüsselwort var nicht mit Methoden verwenden. Also hier habe ich hier eine
Testmethode. Wenn ich versuche,
etwas vom Typ var zurückzugeben, wird
es mich nicht lassen. Ebenso, wenn ich es als
Parameter verwende und
ihm einfach einen Namen
gebe, lässt es mich
das auch nicht. Das liegt einfach daran, Visual Studio nicht
über genügend Informationen ,
um den Typ
anhand einer Rückgabe
oder eines Parameters zu erraten . Zumindest wird
mir das vorgegaukelt. Aber Sie können
das Schlüsselwort var nicht
als Parameter für eine Methode verwenden als Parameter für eine Methode oder sogar ein
v von einer Methode zurückgeben. Es ist einfach nicht möglich. Aber mit dem dynamischen
Schlüsselwort zum Beispiel können
Sie das,
mit dem Schlüsselwort var nicht. Schauen wir uns einen
weiteren möglichen Nachteil der Verwendung des Schlüsselworts Var an. Lassen Sie uns jetzt einige
dieser Dinge hier aufräumen. Was ich
tun werde, sagen wir zum Beispiel, ich möchte eine
Finanzsoftware entwickeln. Ich möchte damit Geld berechnen, aber ich möchte ein hohes
Maß an Dezimalgenauigkeit. Ich möchte kein Geld
verlieren, weil meine Software nicht
genügend Dezimalstellen zulässt. Es ist ziemlich einfach zu machen. In einem Fall wie diesem benötige
ich einen dezimalen Datentyp. Wenn Sie sich an
mein erstes Tutorial erinnern , in dem ich über Dezimalzahlen gesprochen
habe, habe ich über Gleitkommazahlen und über
Doppelzahlen gesprochen Wenn Sie sich erinnern,
hat Dezimalzahlen den höchsten
Genauigkeitsgrad, also viele Doppelgänger liegen irgendwo
in der Mitte. Und Gleitkommazahlen haben die
geringste Genauigkeit, die geringste Anzahl
von Dezimalstellen Ich möchte eine Dezimalzahl, weil
ich mit Geld arbeite.
Ich möchte nicht, dass etwas
verloren geht Ich werde
eine neue Variable erstellen. Es wird
das Schlüsselwort var verwenden und ich
werde es Geld nennen. Jetzt werde ich das
initialisieren. Möge es zum Beispiel nicht wirklich wichtig sein,
welcher Wert, aber ich werde vielleicht so
etwas eingeben Eigentlich nein, lass uns ihn
einfach auf Null setzen. Also habe ich es mit
Null initialisiert und wenn ich das jetzt genauer
betrachte, können
Sie sehen, dass davon ausgegangen wird, dass
der Datentyp doppelt ist Jetzt entspricht das Doppelte einem mittleren Genauigkeitsgrad,
aber es liegt kein Weißt du, syntaktisch ist daran
nichts falsch .
Es ist perfekt. Die Anwendung läuft. Ich gebe hier Null aus. Jetzt kennt das System
meine Absicht nicht , das
System weiß es nicht Ich möchte eine
Anwendung erstellen, die auf Geld basiert. Ich möchte eigentlich ein hohes
Maß an Dezimalstellen. Ich möchte, dass das hinter den Kulissen eine
Dezimalzahl ist. Also, wie mache ich das? Also,
wenn Sie eine Dezimalzahl definieren, müssen
Sie M einfach genau dort
platzieren. Und wenn ich nach Geld suche, können
Sie sehen, dass es sich jetzt um eine
Dezimalzahl handelt, nicht um eine Doppelzahl Aber Sie können sehen, dass das
nur menschliches Versagen ist. Ich könnte leicht vergessen, das M zu schreiben und jetzt
habe ich ein Double. Also vielleicht, wenn ich meine Software
kompiliere, meinen Kunden
gebe, dann fangen
sie an, sie zum Beispiel zu benutzen. Dann stellen sie fest, dass
aufgrund der Rundung ein
bisschen Geld fehlt , weil angenommen
wird, dass es sich um ein Double handelt Ich verliere also viel an Genauigkeit, wenn ich
diesen winzigen Fehler mache Diese Software ist
dafür verantwortlich, Geld zu verlieren, und das ist nicht gut. Und auch hier verlieren Sie möglicherweise
kein Geld. Sie könnten Geld gewinnen, aber Tatsache ist, dass es falsch ist. Ich könnte also leicht vergessen,
dieses M hier zu verwenden und eine Dezimalzahl zu bekommen. Es ist also etwas, womit Sie sehr vorsichtig
sein sollten . Deshalb werde ich Ihnen das jetzt klarstellen, wenn ich
diesen Geldwert einfach auf einen hohen
Grad an Dezimalgenauigkeit setze , weil wir mit Geld
arbeiten Wenn ich die Anwendung starte, können
Sie sehen, dass all diese
Genauigkeit gekürzt wurde, sodass ziemlich viele
Informationen fehlen Und das nur für die Tatsache
, dass hier ein M verwendet wird. Also, weißt du, es ist
ziemlich einfach zu machen. Also, wenn ich das zunächst als Dezimalzahl herausfinden würde. Und dann mache ich so
etwas, dann können Sie sehen, dass es eine rote Linie
gibt, sodass die Software nicht einmal
kompiliert werden kann. Es ist ein Fehler aufgetreten. Und es heißt
so ziemlich, okay, wenn du eine Dezimalzahl brauchst,
musst du hier das M-Suffix verwenden Ich werde diesen Fehler niemals machen. Wenn ich
diese Variable Geld explizit als dezimalen Datentyp definiere , ist
das
ein bestimmtes Szenario,
in dem die Verwendung eines Var-Schlüsselworts zu Problemen führen
könnte. In Zukunft möchte ich jetzt ein weiteres Beispiel
zeigen, das mit dem Schlüsselwort Var und
einem möglichen Nachteil
seiner Verwendung zu
tun hat. Hier habe ich meinen
Videospielkurs genau hier. Hier gibt es verschiedene
Felder. Was ich tun werde,
ich werde einfach diese Felder
kopieren und sie
hier
in die Hauptmethode verschieben hier
in die Hauptmethode , damit ich etwas
veranschaulichen kann. Was ich habe, ich habe diese
verschiedenen Typen hier. Ich habe Ganzzahlen, Zeichenketten, Liste von Ganzzahlen und auch
ein Spielobjekt Was ich tun werde,
anstatt diese Datentypen hier zu haben, werde
ich sie
alle durch das Schlüsselwort Var ersetzen Und du wirst etwas bemerken wenn ich die Spielinformationen ändere,
um das Schlüsselwort Var zu verwenden .
Jetzt müssen wir ihm
einen Wert geben , bevor wir es
einfach so lassen können. Was als Null bezeichnet
wird, hat keinen Wert, und wir werden
in einem späteren Tutorial über Null sprechen. Aber jetzt benötigt es tatsächlich einen Wert, weil es
den Datentyp ermitteln
muss , ab dem Sie das Objekt
instanziieren Jetzt können wir das nicht
so leer lassen. Wir müssen ihm einen Wert geben. Das ist eine wichtige
Sache, die es zu beachten gilt. Wenn wir das Schlüsselwort var verwenden, müssen
wir es initialisieren Was ich tun werde,
ich werde diese einfach in
das Schlüsselwort Var
ändern Damit wir
noch etwas sehen können. Der andere Nachteil,
vielleicht ein potenzieller Nachteil, oder zumindest das Bewusstsein, besteht darin, dass es schwierig ist, ,
wenn man sich die deklarierten
Variablen hier ansieht zu sagen, um welchen
Datentyp
es sich handelt,
wenn man sich die deklarierten
Variablen hier ansieht. Vielleicht können wir
herausfinden, dass console eine Zeichenfolge und title
eine Zeichenfolge ist usw. Aber wir können die Null sehen
und wissen, dass es sich um eine Ganzzahl handelt. Aber wenn wir das verwenden, besonders einer anderen
Stelle in
der Anwendung, müssten
wir jedes Mal mit der Maus über
die Variable fahren und herausfinden, dass es sich um eine Ganzzahl handelt indem wir uns nur diesen Namen ansehen. Offensichtlich steht daneben
var, sodass wir den Datentyp
int auch nicht sehen es sich handelt ersten Blick ist etwas unklar, um
welchen
Datentyp Vielleicht können wir mit
unseren Variablennamen
vorsichtiger sein und sie
vielleicht rating int
oder vielleicht rating number nennen . Und dann wissen wir auf den ersten Blick, dass, okay, es eine Zahl ist. Es ist besonders nützlich
beim Debuggen, aber es ist nur zu beachten, wenn Sie das Schlüsselwort var verwenden,
insbesondere bei der Deklaration
der Variablen Hier sind diese
expliziten Informationen in
Bezug auf den Datentyp
verschwunden Wir können uns wirklich nur den
Anfangswert ansehen. Wir müssen unsere Maus über jeden einzelnen bewegen, nur um zu verstehen, um
welchen Datentyp es sich handelt Wenn Sie also große,
komplizierte Software haben und versuchen,
Hunderte von Variablen
zu debuggen, kann es ziemlich
zeitaufwändig
sein, herauszufinden, welchen Typ
die Variable hat, und vielleicht gibt es ein Typproblem Vielleicht versuchen Sie zum Beispiel,
eine Zeichenfolge in eine
Ganzzahl einzuspeisen Wenn das ein potenzieller Fehler ist, dann kann es, du weißt schon,
etwas länger dauern , bis er wenn wir hier keine
expliziten Typen haben. Und wir müssen quasi
mit der Maus über jeden einzelnen fahren, um
herauszufinden, um welchen Typ es sich handelt Und das ist keineswegs
ein Hindernis,
es zwingt Sie nur dazu Ihre Variablen richtig zu benennen Zum Beispiel könnte eine Variable namens Bewertungsnummer ein
besserer Name sein als nur Bewertung. Sie enthält etwas mehr Informationen über die Daten, die Sie in dieser Variablen
speichern. Wenn überhaupt, lehrt es dich
, ein besserer Entwickler zu sein. Das Letzte, worüber ich sprechen
möchte, ist, wann ich
das Schlüsselwort Var verwenden sollte. Sollte ich es
komplett ignorieren und
es nur als ein bisschen Wissen behalten oder
soll ich es ständig verwenden? Gibt es irgendwelche Nachteile? Gibt es praktische Gründe? Nun, viele Leute
verwenden das Schlüsselwort Var tatsächlich für alles. Ich habe mir Software angeschaut und sie verwenden nicht einmal Datentypen, oder zumindest hat fast
alles das Schlüsselwort Var. Ich meine, daran ist nichts
wirklich falsch, besonders wenn Sie
beschreibende Variablentypen verwenden Sie sind ziemlich vorsichtig, wenn Sie
zum Beispiel Dezimalzahlen und
Gleitkommazahlen
definieren. Es ist also nichts
falsch daran, das Schlüsselwort Var zu verwenden Sie können das Schlüsselwort Var
für so ziemlich alles verwenden, oder Sie können
Standarddatentypen verwenden. Es liegt an dir. Es gibt jedoch einige
Situationen, in denen das Schlüsselwort Var einige Vorteile
hat. Also lass mich dir diese jetzt zeigen. Lassen Sie uns hier einige
dieser Beispiele erläutern. Nehmen wir zum Beispiel an, wir entwickeln eine
Software , die eine Reihe
von Videospielshops verwaltet. Wir haben hier unseren
Videospielkurs. Jedes Geschäft, das Videospiele
verkauft, wird eine Liste von
Videospielen in seiner Sammlung haben. Es wird
ungefähr so aussehen. Wir möchten jedoch mehrere Geschäfte
verwalten. Jedes Geschäft wird eine
Liste mit Videospielen haben, aber vielleicht möchten wir katalogisieren, was jedes
einzelne Geschäft hat. In einer solchen Situation hätten
wir eine Liste mit
einer Liste von Videospielen. Und das wird zum Beispiel wie bei der Ultimate Game
Collection sein. Schauen Sie sich in diesem Fall diesen Datentyp hier
an. Es ist ziemlich lang, es ist
ziemlich nervig zu schreiben, es ist sogar ziemlich kompliziert
, es anzusehen. Du könntest
das sogar erweitern, indem du sagst, ich habe eine Liste von
einer Liste von einer Liste. Sie wissen also, dass das
Dilemma weitergeht. Sie können sehen, wie groß das ist. Aber in einer solchen Situation könnten
Sie das Schlüsselwort var verwenden. Und das
vereinfacht das alles einfach. Das erspart eine Menge Tipparbeit. Und Sie können sehen, dass Sie dort
eine nette praktische Abkürzung haben, wenn Sie hier
ziemlich große
Datentypen haben und Sie nicht alles
abtippen möchten und aus welchem Grund auch immer, in Tell Sense es Ihnen nicht
anbietet. Oder vielleicht möchten
Sie es wiederholen und nicht den ganzen Datentyp
ausschreiben. Es ist ziemlich einfach, einfach das Schlüsselwort Var zu
verwenden. Weißt du, es ist überhaupt kein
Problem. Und wissen Sie, in Fällen wie
diesem, wenn Sie keine
Dezimalzahlen oder Doppelzahlen definieren und das Risiko besteht, dass Sie vielleicht die
Dezimalgenauigkeit verlieren, dann ist
so etwas völlig Es ist ein ziemlich einfacher Weg, das zu tun. Und Sie können sehen, wie
schnell es war, nur drei Zeichen auf der Tastatur einzugeben, im Vergleich zu
all dem hier. Nur ein Beispiel, es gibt noch ein paar weitere
Beispiele, die wir noch nicht behandelt haben, aber wir werden eines davon
behandeln. Eines der beiden Beispiele ist also etwas, das als Linkabfragen bezeichnet wird. Und ein anderes Beispiel ist die
Erstellung anonymer Objekte
, über die wir bald
sprechen werden. Und das Schlüsselwort var eignet sich sehr gut zum Erstellen anonymer Objekte. Aber um es zusammenzufassen, und
das Ergebnis
dieses Tutorials ist, dass var kein Datentyp
ist Var ist einfach eine nette
Art zu sagen, okay, lassen Sie uns den Datentyp
anhand der Initialisierung herausfinden anhand der Und dieser Prozess wird
Typinferenz genannt. Das ist also das
Schlüsselwort var in C Sharp.
69. 16-4. Anonyme Typen: In diesem Tutorial
werde ich
über anonyme Typen im C-Shop sprechen . Wenn Sie mein
Tutorial zum Schlüsselwort Var noch nicht gesehen haben, empfehle ich
Ihnen dringend, es
zuerst anzusehen, bevor Sie sich
dieses Tutorial ansehen. Also anonyme Typen,
was sind sie? Schauen wir uns hier ein Beispiel
an. Hier habe ich eine Klasse
namens Videospiel, und ich erstelle vier Objekte. Es ist nicht wirklich
wichtig, was hier drin ist, aber es gibt einen Konstruktor, einige Felder, verschiedene Eigenschaften
und solche Dinge Sie können also in diesem Beispiel sehen, ich hier vier
Objekte einrichte, indem ihnen unsere
Klassen voranstelle, wie bei einem Datentyp Dann instanziiere ich
ein neues Objekt mit all Aber um das zu tun, muss
ich eine Klasse erstellen Jetzt muss meine Klasse einen Konstruktor
haben. Nun, es muss keinen
haben, aber ich habe einen
und ich will einen Es hat all diese privaten Felder, einige Methoden und Eigenschaften
und solche Dinge. Es hat also all das
Zeug in dieser Klasse hier, nur um hier
für Objekte zu erstellen. Aber bei
sogenannten anonymen Typen müssen
wir keine Klasse definieren. Sie sehen diese Klasse hier
, in der wir Videospiele definieren. Wir brauchen keine
dieser Definitionen. Wir brauchen diese Datei nicht. Wir brauchen diesen Kurs an sich nicht. Also, wie funktioniert das? Warum sollte es für
uns von Vorteil sein, keine Klasse zu haben , aber wir müssen von der Klasse aus
instanziieren Das ergibt für mich keinen Sinn. Bitte erläutern Sie anonyme Typen, sie sind aus
mehreren Gründen nützlich. Einer der Hauptgründe
ist etwas, das Link genannt wird. Nun, wir haben noch nicht über Link
gesprochen, also werde ich jetzt nicht darüber sprechen. Aber eine andere Situation,
zum Beispiel
, wenn Sie
einen Prototyp für eine Software entwickeln Sie möchten schnell eine Software erstellen, um sicherzustellen, dass
etwas funktioniert Oder vielleicht
möchten Sie nicht
eine ganze Klasse mit vielen
Methoden und Dingen erstellen . Weil das, was Sie erstellen,
etwas ganz
Einfaches und Schnelles ist . Es gibt also wirklich ein paar
Gründe. Aber einer der
Vorteile ist Geschwindigkeit, und ein weiterer Vorteil
ist, wenn Sie etwas nicht besonders Kompliziertes
erstellen, hat es
vielleicht nur zwei Eigenschaften und Sie können nicht viel
damit anfangen. Dann können Sie
sogenannte anonyme Typen verwenden. Wie erstelle ich also eine Instanz einer Klasse
, die nicht existiert? Nun, das ist eine sehr
gute Frage. Und es beginnt mit
dem Schlüsselwort var. Also was ich
tun werde, ich werde dieses
Videospielobjekt hier
simulieren, aber anstatt
die Videospielklasse zu verwenden, werde
ich
einen anonymen Typ verwenden. Also werden
all diese gelöscht und wir werden
diesen als Beispiel verwenden. Wie kann ich mit anonymen Typen eine Klasse
instanziieren , die nicht existiert? Nun, weil die
Klasse nicht existiert daher
anonym ist, können wir sie hier nicht wirklich mit
einem Klassennamen beginnen Hier
verwenden wir das Schlüsselwort var über
das wir
in einem früheren Tutorial gesprochen haben. Jetzt wollen wir ihm einen Namen geben, ich
nenne es einfach Game On. Jetzt müssen wir
ein neues anonymes Objekt instanziieren. Wie machen wir das? Wir
verwenden das neue Schlüsselwort, aber jetzt verwenden wir geschweifte Klammern In diesen geschweiften Klammern werden
wir nun unsere
Eigenschaften für unsere Klasse einrichten Diese Zeile hier
ahmt diese Zeile hier ziemlich genau nach. Der einzige Unterschied besteht darin, dass wir keine Klasse definieren müssen Diese Klasse
muss nicht existieren. Wir können sie nennen
, wie wir wollen. Es spielt keine Rolle, weil
es ein anonymer Typ ist. Wenn ich mein Objekt hier verwende, wenn ich hier einen Punkt setze, können
Sie sehen, dass ich auf alle
Eigenschaften zugreifen kann , die
ich hier definiert habe. Ich habe sie mit
verrückten Zeichen wie Gampd buchstabiert, aber Sie können sehen,
dass das in
der Liste erscheint und ich kann tatsächlich
darauf als Eigenschaft zugreifen Genau hier haben wir eine Konsole
, Herausgeber und Bewertung,
du kannst sehen, dass es
egal ist, wie ich sie nenne,
es spielt keine Rolle, welche Werte Das ist rein anonym
, weil es keinen Namen hat, es hat keine Klasse. Da es anonym ist, speichern wir es mit dem
Schlüsselwort var in einem Objekt. Genau hier können Sie sehen, dass
das ziemlich mächtig ist. Wir brauchen keine Klasse, sie ist völlig
anonym, und
dafür verwenden wir hier einfach
das neue Schlüsselwort. Aber hier gibt es ein paar
Ausnahmen. Wenn wir einen anonymen Typ
wie diesen hier erstellen , können
wir nur
schreibgeschützte Eigenschaften erstellen. Es gibt keinen Konstruktor,
es gibt keine Methoden, es gibt keine privaten Felder Stellen Sie sich vor, diese
Klasse, die hier als
Videospiel bezeichnet wird , wäre ein
anonymes Objekt, dann können
Sie
hier nur schreibgeschützte Eigenschaften haben , Titel, zum Beispiel, Bewertung
des Herausgebers
und deren Schreibschutz Sie können die Werte nur abrufen, Sie können sie nur einmal festlegen. Und dann
definierst du den anonymen Typ, genau hier, das
anonyme Objekt, aber hinter den Kulissen würde
das
generiert werden, würde
das
generiert werden wenn du
einen anonymen Typ erstellst. Lesen Sie also nur Eigenschaften, keine Konstruktoren, keine
Felder, keine Methoden Das sind also die Einschränkungen bei der
Verwendung von so etwas. Es hört dort nicht wirklich auf. Beim Erstellen anonymer Typen. Hier können wir
tatsächlich
einen anonymen Typ in einen
anderen anonymen Typ einfügen . Wir können eine
Reihe anonymer Typen erstellen. Wir können also viele verschiedene Dinge mit ihnen machen. Lassen Sie mich Ihnen jetzt ein
Beispiel zeigen. In diesem Beispiel habe ich
einen anonymen Typ genau hier in einem anderen
anonymen Typ. Wenn ich
hier meinen Tiertyp verwende und zu Punkt gehe, kann
ich zu einer Art wechseln,
die ebenfalls
ein anonymer Typ ist , und auf das Geräusch zugreifen,
das das Tier machen könnte. Die Tierart könnte ein Hund sein, wobei der Name des
Tieres ein Hund wäre, und dann
wäre das Geräusch eine Bar. Sie können zum Beispiel sehen, dass ich tatsächlich kaskadierende
anonyme Typen habe Sie sind ziemlich mächtig
darin, wie sie funktionieren. Und Sie können sehen, dass
Sie, genau wie zuvor,
das Schlüsselwort Var verwenden , die volle Kontrolle
über den Intel-Sinn haben. Sie können hier deutlich alles sehen
, was Sie angegeben haben. Das ist ziemlich cool. Eine Sache, die
Sie nicht wirklich tun sollten, aber Sie können, ist, diese
anonymen Typen an Methoden zu übergeben. Schauen wir uns ein Beispiel an. Nun, als ich zuvor über
das Schlüsselwort var gesprochen habe, kann
man var nicht als Parameter für eine
Methode verwenden, es funktioniert nicht. Was Sie benötigen würden, ist das dynamische Schlüsselwort
, in dem das funktionieren würde. Wenn ich die
Testmethode dann hier nenne, gebe
ich unser Tier gleich hier ab. Und dann können wir von hier aus
darauf zugreifen. Aber weil wir Dynamic verwenden, haben
wir, wenn Sie sich mein
Tutorial Dynamic ansehen, wenn Sie sich mein
Tutorial Dynamic ansehen, hier keinen Zugriff auf
den Intell Sense, aber wir können ihn verwenden Aber auch hier gilt: Wir sollten Dynamic nicht wirklich verwenden
, wenn wir es nicht brauchen Es wird wirklich nur empfohlen , es zu verwenden, wenn Sie es
unbedingt müssen. Ich sehe nicht viele
Situationen, in denen Sie möglicherweise einen anonymen
Typ an eine Methode übergeben. Wirklich, sie sollten nur
innerhalb der Methoden verwendet werden ,
sie sind definiert. Aber wenn Sie das tun müssen, können
Sie ja
das dynamische Schlüsselwort verwenden ,
um dieses Problem zu umgehen. Sie können jetzt also sehen, dass
ich Dynamic verwende. Ich habe keinen
Zugriff auf den Intel-Sense, aber ich kann das
jetzt hier an diese Methode weitergeben. Lassen Sie uns also überprüfen,
ob es funktioniert. Sie können hier also sehen, wie
Bark ausgegeben wird.
Es sieht so aus, als ob es ganz gut
funktioniert Dies ist ein Beispiel für
anonyme Typen in C Shop, da es sich um einen anonymen
Typ handelt und er keinen Typ hat Daher
würden Sie zu diesem Zeitpunkt das Schlüsselwort Var verwenden. Und Sie können hier sehen, dass Sie ihm zwei Methoden übergeben
können, aber Sie müssten
das dynamische Schlüsselwort
verwenden , um es zu übergeben. Aber ich
empfehle nicht, das zu tun. Schließlich
handelt es sich bei der Erstellung
anonymer Typen nur um Eigenschaften, und wenn sie einmal definiert sind,
gelten sie als schreibgeschützt. Und Sie können sie nicht ändern, wie Sie hier sehen können Das sind anonyme
Typen in C-Shop.
70. 17-1. Das null-Keyword: In diesem Tutorial werden
wir über das Schlüsselwort Null
sprechen. Das Null-Schlüsselwort sieht
ungefähr so aus. Was ist das Null-Schlüsselwort
und wie wird es auch verwendet? Warum sollten wir es verwenden? Wenn Sie mein
vorheriges Tutorial gesehen , in dem
wir über Stack
-
und Heap-Speicher sowie über Referenztypen
und Werttypen gesprochen haben, werden
Sie
dieses Tutorial sehr schnell verstehen dieses Tutorial sehr schnell Hier sind einige Objekte
vom Typ Referenz, wie zum Beispiel Listen, Zeichenketten, Arrays, Videospielobjekte Es ist eine benutzerdefinierte Klasse. All dies sind
Referenztypen, und sie werden im Heap gespeichert, dem
Heap-Bereich des Im Gegensatz dazu
sind dies einfache Werttypen, also zum Beispiel Ganzzahlen, Boolings Haben Sie sich jemals gefragt,
wann Sie eine Variable deklarieren, damit wir sie nicht initialisieren, ihr keine
Werte Sie können sehen, dass die
Software kompiliert
wird, sie funktioniert, das ist kein Problem Wir haben sie deklariert,
alles sieht ziemlich gut aus. Aber haben Sie jemals darüber
nachgedacht, was die Standardwerte
für diese sein könnten? Wenn wir ihnen nicht wirklich einen Wert
geben, welcher wäre dann der
Standardwert? Wäre er Null? Wäre es, was wäre es? Nun, lassen Sie uns einen Blick darauf werfen. Ich werde am Ende von hier einen
Breakpoint hinzufügen
und dann werde ich
im Locals-Fenster nachschauen. Lassen Sie uns die Anwendung ausführen. Wenn wir jetzt hier zum
Tab Locals kommen, können
wir uns verschiedene
Dinge ansehen, die mit
unseren Variablen zu tun haben, die
wir gerade definiert haben. Hier können Sie unsere
Referenztypen sehen. Wir haben unsere Liste hier, wir haben unser benutzerdefiniertes Objekt hier, unser String-Array genau hier,
Sie werden etwas bemerken. Der aktuelle Wert ist nein. Aber wenn Sie sich diese
Wertetypen wie Integer, Boolean und Character
oder ihre Standardwerte ansehen, unterscheiden sich ihre
Standardwerte geringfügig Typischerweise hat ein
Wertetyp den Standardwert Null. Wenn Sie Bolen als
Null angeben, wäre das falsch. Ein Boolean als Eins wäre wahr. Sie können sehen, dass Bolen auch
einen Standardwert von Null hat. Sogar diese Zeichenvariable hier hat einen
Standardwert von Null Sie können hier ein Muster sehen. Es sieht so aus, als hätten
Referenztypen einen Standardwert von Null oder was auch immer Null ist. Typen haben einen Standardwert, der
wie Null aussieht. in diesem Beispiel hier Was ist in diesem Beispiel hier los? Erinnerst du dich, als wir
über Referenztypen gesprochen haben? Wenn wir einen Referenztyp haben, wird
ein Zeiger auf dem
Stapel erzeugt. Aber der eigentliche Kern
der Operation die Daten auf dem Haufen Der Zeiger auf dem Stapel zeigt
auf die Daten auf dem Heap. Jetzt haben wir hier einen
Referenztyp deklariert. Diese Liste und
ihr Standardwert sind beispielsweise Null. Was Null hier sagt, ist, dass es
sich um eine Nullreferenz handelt. Wir haben unseren Zeiger
auf der Aufrufliste. Das ist im
Stack-Bereich des Speichers, aber wir haben noch
nichts auf dem Heap, wir haben es nicht instanziiert Das bedeutet, das neue Schlüsselwort zu verwenden
. Wenn wir etwas
mit dem neuen Schlüsselwort instanziieren, erstellen
wir etwas im Heap-Bereich
des Speichers In diesem Teil erstellen wir
den Zeiger auf dem Stapel. In diesem Teil
erstellen wir tatsächlich die Daten auf
dem Heap und daher zeigt
der Zeiger darauf Im Moment instanziieren wir jedoch
nichts. Wir haben unseren Zeiger
auf dem Stapel, aber er zeigt nirgendwohin Es gibt keinen Verweis auf
die Daten im Heap-Speicher. Daher ist der
Standardwert Null, was für
eine Nullreferenz steht Es geht nirgendwohin. Sobald wir jedoch das neue Schlüsselwort
verwenden, ändert sich der Wert von Null und es wird auf die Daten auf dem Heap verwiesen Stellen Sie sich Null als
Nichts oder einen Nullzeiger oder
eine Nullreferenz Es führt nicht wirklich irgendwohin, aber vielleicht wird es das später tun Sie können hier zum Beispiel sehen, dies nur für Objekte vom Typ
Referenz gilt, komplizierte Objekte, über die
wir bereits gesprochen haben. Es gilt nicht für Objekte vom Typ
Wert. Da gibt es jedoch
eine gewisse Bedingung. Dies gilt für Objekte vom Typ
Wert, wenn
sie als nullwertfähig markiert sind Jetzt werden wir später
über NULL-Werte sprechen. Mach dir darüber keine Sorgen. Aber für dieses Beispiel gilt
Null, wenn Objekte vom Typ
Referenz deklariert werden, weil wir einen Zeiger benötigen, aber
keinen haben Der Anfangswert ist
Null, was nichts ist. Schauen wir uns ein paar
Beispiele an, die jetzt
mit dem Schlüsselwort Null arbeiten. Also was ich tun werde, ich
werde eine Eigenschaft ausgeben
oder vielleicht versuchen, eine
dieser Methoden hier
dieser Referenztypen zu verwenden . Ich werde einfach in das Konsolenfenster schreiben
, ich werde eine zufällige
Eigenschaft aus dieser Liste ausgeben. Ich werde
zum Beispiel die Anzahl der Listenpunkte sagen. Schauen wir uns an,
was hier passiert. Jetzt habe ich eine rote Linie. Sie können die Verwendung einer nicht zugewiesenen
lokalen Variablenliste sehen. Ich kann
dieses Objekt nicht einmal verwenden , weil
es nicht zugewiesen ist Aber warte, ich dachte, es
wäre standardmäßig Null. Nun, Null
passiert standardmäßig zur Laufzeit, nicht zur Kompilierzeit. Das ist Kompilierzeit. Wir machen die
Entwicklung tatsächlich genau hier. Das ist Kompilierzeit. Ich kann die Anwendung nicht einmal
kompilieren. Was wir zur
Kompilierzeit tun müssen, ist das einfach auf Null zu initialisieren Auf diese Weise
verschwindet der Fehler und wir können das Programm tatsächlich
ausführen Aber der Compiler
hilft uns hier. Es heißt, schau, das ist Null. Sie sollten eigentlich keine
Eigenschaften für einen Nullwert verwenden, sonst
wird er umfallen. Aber indem wir es ausgetrickst haben, haben
wir diesen Fehler behoben. Ich kann Ihnen also ein Beispiel für die Verwendung
von etwas zeigen , das Null ist Jetzt ist die Liste Null. Ich versuche hier auf eine
Eigenschaft namens
count in der Null-Objektliste zuzugreifen . Mal sehen, was passiert. Jetzt ist
hier ein Fehler aufgetaucht und es heißt Nullreferenz, Ausnahmeobjektreferenz, nicht gesetzt auf eine Instanz
eines Objekts Jetzt werden Sie diesen
Fehler bei
Ihren
zukünftigen Unternehmungen mit C Sharp häufig sehen Ihren
zukünftigen Unternehmungen mit C Sharp Es ist nur eines dieser Dinge. Aber im Grunde können Sie hier sehen, unser Referenztyp Null ist. Wenn etwas Null ist, können
wir keine Methoden dafür verwenden. Wir können keine Eigenschaften dafür verwenden, weil
es keinen Wert hat, es hat keinen Speicher auf dem Heap
gespeichert Es ist so ziemlich nur
ein leerer Zeiger auf ein Objekt. Da ist
nichts. Es ist Null, wir können es nicht benutzen. Alles was wir tun müssen, ist es zu
instanziieren und
ihm tatsächlich etwas zu geben Wenn ich die Anwendung jetzt ausführe, können
Sie hier sehen, dass der Fehler
behoben ist, weil wir das Objekt
instanziiert haben und es nicht mehr Null ist Das ist etwas, bei dem man sehr
vorsichtig sein sollte , wenn man mit
Null arbeitet Ich denke, du verstehst
den Punkt Null. Nun,
wenn ich zum Beispiel eine Zeichenfolge habe, lassen Sie uns einige
dieser Sachen hier löschen. Wenn ich eine Zeichenfolge habe, nenne ich
sie Test. Ich werde
es mit einer leeren Zeichenfolge initialisieren. Und was ich damit
sagen will, ist
zum Beispiel, dass eine leere Zeichenfolge nicht
dasselbe ist wie Null Wir haben über Null gesprochen. Wir wissen, dass es sich um eine Nullreferenz handelt. Was viele Leute tun, verwechseln sie ein
bisschen mit Null. Sie denken, es ist nur
ein leerer Wert, wie eine leere Zeichenfolge. Das ist überhaupt nicht wahr. Und das kann ich dir beweisen, wenn ich zum Beispiel
nur einen Bolen aufstelle Und ich habe eine Bedingung
, die
diese leere Zeichenfolge
hier mit dem Nullwert vergleicht , und Sie werden sehen,
dass sie falsch ist Was ich hier sagen will, ist,
ob Test gleich Null
ist, wenn eine leere Zeichenfolge dasselbe wie Null ist, ich kann es sogar so schreiben, ich brauche nicht einmal eine Variable. Dann gib den Wert
true aus, wenn es derselbe ist, andernfalls false, wenn nicht. Sie können dort also sehen,
dass Null keine leere Zeichenfolge ist. Ein Anfängerfehler,
vielleicht das zu denken. Aber ich dachte, ich hätte
erwähnt, dass Null nicht dasselbe ist
wie eine leere Zeichenfolge. Null ist einfach eine Nullreferenz. Eine leere Zeichenfolge ist genau
das, eine leere Zeichenfolge. Ich hoffe, das
klärt, was Null ist und wie es verwendet werden kann
und warum es erscheint In unserem täglichen Leben machen wir Softwareentwicklung.
Danke fürs Zuschauen.
71. 17-2. Nullable-Werttypen: In diesem Tutorial werden
wir über Typen
sprechen, die Nullwerte zulassen Was sind nullfähige Typen? In unserem letzten Tutorial empfehle
ich
Ihnen dringend, sich das anzusehen wir über
das Schlüsselwort Null gesprochen haben, habe ich kurz erwähnt,
dass
Objekte vom Referenztyp wie Listen und
Objekte und Dinge, wenn Sie sie nicht initialisieren, den
Standardwert Null erhalten, was ein Nullzeiger ist Bei Werttypen haben
diese jedoch in der Regel den
Standardwert Null Aber wenn wir versuchen,
das Schlüsselwort Null mit
einem Objekt vom Typ Wert zu verwenden , wird das nicht
funktionieren, weil wir ihm nicht wirklich
einen Referenzzeiger geben
können. Da es sich um einen Wertetyp
handelt, speichert es beispielsweise einen Wert wie
3.456 oder true Es speichert tatsächlich den Wert
eines Wertetyps im
Stack-Bereich des Speichers Was ist also ein Typ, der Nullwerte zulässt? Nun, ein
Wertetyp wie dieser, der auf Null gesetzt werden kann, ist eine Instanz, in der ein
Werttyp tatsächlich Null speichern kann Also warum sollten wir
das tun wollen und wie machen wir das? Als ich zum Beispiel zuvor versucht habe,
dies auf Null zu setzen , hat
es nicht funktioniert. Wenn ich jedoch hier nach dem
Datentyp
ein Fragezeichen hinzufüge , können
Sie sehen
, dass der Fehler behoben ist. Was ist hier los? Nun, um ein
Objekt vom Typ Wert in einen Ball,
einen Charakter, einfache Typen umzuwandeln . Wenn wir hier am Ende ein Fragezeichen
hinzufügen, dann steht das für einen Wertetyp, der
Nullwerte zulässt Jetzt ist diese Variable ein Wertetyp, der
NULL-Werte zulässt. Jetzt kann sie einen Wert annehmen, oder sie kann das Schlüsselwort Null annehmen Warum möchtest du das vielleicht tun? Was ist der Sinn davon? Nun, stellen Sie sich vor, Sie haben zum Beispiel ein Klassenbuch. Sie haben ein bisschen
Software und sie kennzeichnet die Anwesenheit der Schüler
in Ihrem Klassenzimmer. Nehmen wir an, es ist eine Datenbank
an die Datenbank angehängt, Sie haben alle Namen
der Schüler, Vorname, Nachname, all das gute Zeug. Und dann haben Sie einen booleschen Wert in der Datenbank und der Wert in der Datenbank würde so
etwas heißen wie ist anwesend Nun, wenn die Kinder noch nicht einmal
im Klassenzimmer angekommen sind, dann wissen wir nicht, ob
sie anwesend sind Wir können nicht wirklich die Wahrheit sagen
, weil wir es nicht wissen. Wir haben das Register nicht wirklich
gemacht, wir haben nicht wirklich
überprüft
, welche Schüler
zur Klasse gekommen sind. Aber wenn ich den Wert von
Falls standardmäßig in der
Datenbank speichere , kann ich ihn einfach auf
true ändern , wenn sie in der Klasse
anwesend sind. Nun, ich meine, das heißt, dass
sie nicht anwesend sind, aber ich bin mir wirklich noch nicht
sicher, weil
sie noch nicht im Klassenzimmer angekommen sind
. In Fällen wie diesem möchten
Sie vielleicht Beispiel
einen dritten Wert für
einen Bolen Vielleicht möchtest du Null
, falls wir es noch nicht wissen. Wenn der Student ankommt und
er hier ist, können wir das für wahr halten. Aber wenn der Student abwesend ist, vielleicht ist er krank,
wir können falsch sagen. In solchen Fällen möchten wir vielleicht einen dritten Wert. Und ein Schlüsselwort wie Null steht für
so etwas wie einen Standardwert, zum
Beispiel, dass man das Ergebnis
noch nicht kennt, oder so etwas Ähnliches. Wenn wir uns also nicht sicher sind,
ob sie schon da sind,
könnten wir hier so etwas wie
einen nullbaren Datentyp verwenden ,
nämlich den Und wir wissen nicht, ob
sie in der Klasse sind, also können wir sie einfach auf Null
initialisieren Und in der Datenbank dafür wäre dieses Feld
vielleicht leer Oder es könnte sogar
Null stehen. Es spielt keine Rolle. Aber der Punkt ist,
wenn die Kinder anfangen, in die Klasse zu kommen, dann können wir das
auf wahr und falsch setzen. Und das ist quasi das
Prinzip, das dahinter steckt. Es gibt Ihnen zum Beispiel eine dritte
Option. Und auch hier ist das bei ganzen Zahlen
ähnlich. Wir können diese auf
Null setzen, wenn wir keinen
bestimmten Wert für die
Zahl haben , die wir modellieren möchten Also,
es gibt viele
verschiedene Gründe, warum
wir
bei der Arbeit mit
nullwertfähigen Werttypen einen nullwertfähigen Wertetyp
verwenden möchten , indem einfach ein kleines
Fragezeichen
hinter dem Typ hinzufügen hinter dem Es gibt Ihnen ein paar weitere Optionen.
Und warum ist das so? Nun, nehmen wir
zum Beispiel
diese Variable hier . Das ist nullfähig Wenn ich danach einen Punkt setze, habe ich hier Zugriff auf ein
paar Immobilien Wenn ich das Fragezeichen entferne, sodass ich ein einfaches Bolen habe, können
Sie sehen, dass diese
Eigenschaften
verschwunden sind. Was
ist hier los? Warum habe ich diese
zusätzlichen Eigenschaften für einen Wertetyp, der NULL-Werte zulässt liegt daran, dass es sich hinter
den Kulissen um
eine Struktur handelt, die einer Klasse sehr
ähnlich ist eine Struktur handelt, die einer Klasse sehr
ähnlich Anstatt wie zuvor eine einfache
Boolene zu haben, bei der wir einfach eine
Boolene haben und sie dann verwenden können Wir können es im Fenster ausgeben, wir können es an eine Methode übergeben,
all das Wir haben eine Struktur.
Stell es dir wie eine Klasse vor. Was die Klasse in diesem Fall
macht,
ist, dass sie nur zwei Eigenschaften verfügbar macht Einer ist der tatsächliche Wert für
unseren nullbaren Datentyp. Dieser Stop-Wert, der jetzt
anwesend ist ,
wäre dasselbe wie ein Datentyp
, der
keine NULL-Werte zulässt. Wenn diesen Wert verwenden, können wir hier die Eigenschaft value verwenden, um
den zugrunde liegenden Wert
zu ermitteln
, der wahr oder falsch wäre Zum Beispiel hat es noch eine andere Sache namens hat
einen Jetzt können wir
diese boolesche Eigenschaft hier tatsächlich verwenden , um
herauszufinden, ob sie einen Wert hat Was Sie normalerweise für so etwas
tun würden ist eine
if-Anweisung zu haben und zu sagen, okay, hat sie einen Wert Okay, sie hat einen Wert, also können wir zum Beispiel auf
den Wert zugreifen und ihn auf
der Konsole ausdrucken. Also so etwas und
Dinge auf diese Weise zu tun und uns diese Eigenschaften
zur Verfügung zu
haben ,
vermeidet Dinge wie Nullreferenzausnahmen oder einfach nur die
Suche nach Null zum Beispiel. Aus diesem Grund stehen diese
Eigenschaften zur Verfügung. Wir wollen überprüfen, ob es einen Wert hat und dann können wir den Wert
verwenden. Aus diesem Grund
sind diese sehr nützlich. diesem Grund werden bei der
Definition eines Datentyps, der NULL-Werte
zulässt, diese zusätzlichen Eigenschaften
zur Verfügung gestellt, damit Sie sie nutzen können , weil Sie damit diese
dritte Option erhalten, die Wenn Sie sich fragen,
ob Sie
ein Objekt vom Typ Wert haben , das Nullwerte zulässt,
und Sie es nicht initialisieren, dann wäre der
Standardwert Null,
in diesem Fall nicht Null dann wäre der
Standardwert Null,
in diesem Fall nicht Null. Da es nullwertfähig ist,
ist
der Standardwert kurz gesagt Null ist Das ist ein Beispiel für
nullfähige Typen in C-Shop.
72. 17-3. Die Null-Koalescing-Operatoren: Nullkoaleszenzoperatoren in C sharp klingen sehr kompliziert.
Aber was sind sie? Nun, eines davon sieht
so aus, zwei Fragezeichen, ein anderes sieht so aus, zwei Fragezeichen
gefolgt von n sind gleich Aber was sind diese zufälligen
Zeichen, die du da eintippst? Ich höre Sie fragen:
Erlauben Sie mir, zu erklären Null-Koaleszenzoperatoren
es Ihnen ermöglichen, mit
Referenztypen wie dieser
Liste hier zu arbeiten , mit
Referenztypen wie dieser
Liste hier Was Null sein könnte, aber
es könnte nicht Null sein. Außerdem
Werttypen, die auf Null gesetzt werden können, die Null
sein könnten oder
etwas völlig anderes sein könnten Schauen wir uns hier ein Beispiel
an. Also hier erstelle ich hier eine
Liste von Zeichenketten, und das wird
Einkaufsliste genannt. Und das wird
alle Artikel auf
meiner Einkaufsliste enthalten . Also gehe ich als Nächstes einkaufen, ich habe diesen Typ hier
, der eine Ganzzahl ist und das
sind die Kosten für meinen Einkauf. Jetzt werde ich diesen Wert
standardmäßig auf
Null setzen, weil ich noch nicht
eingekauft habe. Jetzt finde ich vielleicht die
Zeit, einkaufen zu gehen, aber vielleicht finde ich nicht die
Zeit, einkaufen zu gehen. Wenn ich einkaufen
gehe, entsprechen die Kosten
dem Wert meines Ladens. Wenn ich mir jedoch nicht die
Mühe machen kann, einkaufen zu gehen, wird
der Wert Null
beibehalten , weil ich noch nicht eingekauft
habe Daher fallen für meinen Shop
keine Kosten an. Später in der Anwendung spielt es keine Rolle, ob ich einkaufen gegangen bin oder ob
ich nicht einkaufen ob ich einkaufen gegangen bin oder ob
ich nicht einkaufen gegangen bin. Aber ich möchte
eine Nachricht ausgeben, die besagt, dass meine Einkaufskosten damals
dem Wert des Ladens entsprachen. In einer normalen Welt mit einem
einfachen Datentyp wie diesem initialisieren
Sie
ihn vielleicht auf Null und dann, oder er könnte einen anderen Wert haben Ich starte zum Beispiel das Programm, es zeigt mir die Kosten für meinen Shop Wenn ich jedoch
einen Wertetyp
wie diesen erstelle, der Nullwerte zulässt, und ihn mit Null
initialisiere, verwende ich hier normalerweise die Eigenschaft value, um
auf den Wert zuzugreifen Wenn dies jedoch
keinen Wert hat, habe ich
vielleicht keine
Zeit gefunden, einkaufen zu gehen Wenn ich
dann das Programm starte, habe
ich hier einen Fehler Wir haben schon einmal darüber gesprochen. Das Objekt, für das NULL-Werte zulässig sind,
muss einen Wert haben. Sie können sehen, dass ich auf
diese Werteigenschaft zugreife, aber ich überprüfe nicht
, ob sie einen Wert hat Normalerweise mache ich in diesem Fall einfach
eine if-Anweisung hier und überprüfe hier die Eigenschaft has value dieses nullbaren
Typs Jetzt sage ich, wenn
ich einen Wert habe, dann möchte ich den Wert ausgeben Das sieht so aus, als ob es funktionieren sollte. Jetzt sieht es so aus, als hätte ich
nichts. Aber es stürzt nicht Zumindest sieht es ziemlich gut aus. Aber Sie können sehen,
dass ich jedes Mal, wenn
ich versuche, auf diesen Wert zuzugreifen , hier
eine Bedingung erfüllen muss. Ich muss eine
if-Anweisung machen und
überprüfen, ob dort ein Wert
steht bevor ich ihn
endlich verwenden kann. Ob ich
es im Fenster ausgeben möchte, ob ich
den Wert an eine Methode oder eine Methode einer Klasse
oder an einen anderen Ort übergeben möchte . Also im Grunde muss ich
es überprüfen, bevor ich es tatsächlich benutze. Aber was wäre, wenn ich dir sagen würde, dass es eine Möglichkeit
gibt diese
beiden Dinge zu einem zu kombinieren? An dieser Stelle stelle
ich einen
der Nullkoaleszenzoperatoren vor, nämlich die beiden Fragezeichen Schauen wir uns hier an, wie
ich das vereinfachen kann. Ich werde dort die Überprüfung „
Hat Wert“ entfernen und dann werde ich hier den Punktwert
entfernen. Dann werde ich einen der
Null-Koaleszenzoperatoren
einführen , das sind zwei Fragezeichen Ich werde hier einfach
Null als Beispiel verwenden
und das Ganze in
Klammern setzen, und das Ganze in
Klammern setzen damit es
keinen Was glaubst du,
wird das jetzt bewirken? Oder vielleicht weißt du es nicht, weil ich es nicht genug
erklärt habe. Lassen Sie uns die Software ausführen und
sehen, was passiert. Ich lasse die Software jetzt laufen, da steht, dass die
Einkaufskosten gleich Null waren. Sie können sehen, naja,
die Kosten sind Null, aber aus welchem Grund auch immer, sie gibt diese Null hier Wenn ich jedoch die Kosten von
4567 ändere und die Anwendung starte, gibt sie
jetzt tatsächlich 4567
aus Was ist hier los? Nun, dieser
Null-Koaleszenzoperator sagt im Grunde, wenn das Null ist, es
also keinen Wert gibt, dann bewerte, was sich auf
der rechten Seite
dieser beiden Fragezeichen befindet der rechten Seite
dieser beiden Fragezeichen Wenn dies jedoch einen Wert hat,
alles, was nicht Null ist Bewerten Sie beispielsweise diese Seite der Fragezeichen und
ignorieren Sie diese Seite vollständig. Bewerten Sie diese Seite nicht einmal. So funktioniert also einer der Operatoren ohne
Koaleszenz. Und Sie können sehen, dass wir diese Bedingung
dort nicht brauchen. Es ist hier in
einer ordentlichen kleinen
Aussage aus zwei Zeichen verpackt , das sind zwei Fragezeichen Lassen Sie mich
das etwas besser veranschaulichen, nur für den Fall, dass
Sie es beim ersten Mal nicht verstanden haben Lassen Sie mich hier eine Methode erstellen. Und ich
nenne es einfach Get Default Cost. Also, was diese Methode tun
wird, sie wird
einen Standardwert
für die Kosten zurückgeben , wenn kein
Wert angegeben ist. Mit diesem Operator hier wird es einfach
Null zurückgeben. Ich füge nur eine Zeichenfolge an das Ergebnis an, was auch immer
das auswertet Es wird entweder auf der linken Seite
ausgewertet,
was die Kosten ist, oder auf der
rechten Seite, was Null ist Es muss jedoch nicht
nur eine
Null oder eine einfache Variable sein . Es könnte zum Beispiel das Ergebnis einer
ganzen Methode sein. Wenn das nun
Null ist, was es auch ist, wird es alles auswerten,
was sich auf dieser Seite befindet. Es könnte ein einfacher Typ sein, es könnte eine Methode sein. Sie sehen, dass es hier
viele Optionen gibt. Das nennt man Evaluieren. Wenn ich die Anwendung starte, gibt sie
jetzt Null aus Und nur um zu beweisen
, dass die Methode tatsächlich ausgeführt wird,
lassen Sie uns sie ausführen Auch hier können Sie sehen, dass
die rechte Seite ausgewertet
wird , weil
die linke Seite Null ist. Das ist die Stärke der
beiden Fragezeichen, auch bekannt als
Null-Koaleszenzoperator Hier ist die Syntax, hier die beiden Fragezeichen Die Verwendung ist, Sie
haben einen Typ, der Nullwerte zulässt,
unabhängig davon, ob es sich um einen
einfachen Datentyp handelt, oder ob es sich um
eine Liste handeln könnte, zum Beispiel, weil Referenztypen
Null sein können , wie Sie Und dann haben
wir auf der rechten Seite etwas, mit dem wir auswerten können,
ob der nullwertfähige Typ, also dieser Typ auf der
linken Seite
, Null ist Wir haben über all das gesprochen,
aber das ist eine nette Visualisierung falls Sie
sie nicht gleich beim ersten Mal verstanden Das ist einer der
Null-Koaleszenz-Operatoren hier. Ich möchte
jetzt einen weiteren
Null-Koaleszenzoperator einführen , der ungefähr so aussieht Es sind zwei Fragezeichen,
gefolgt von einem Gleichheitszeichen. Und es ist dem letzten Beispiel ziemlich
ähnlich, hat
aber auch mit der
Aufgabe zu tun. Also, was bedeutet das alles? Nun, schauen wir uns dieses Beispiel hier
an. Ich habe hier eine Liste von ganzen Zahlen. Und diese Liste wird
all diese Ausgaben zusammenfassen. Also all die Rechnungen, die
ich diesen Monat bezahlt habe, alle Kosten für die
Einkäufe, die ich in diesem Monat gemacht habe, und die gesamten Kosten mein Geld
für nutzlose Dinge
auszugeben Also alle diese
werden hier als
separate Einzelposten zu
diesen Gesamtsummen hinzugefügt hier als
separate Einzelposten zu
diesen Gesamtsummen Es ist eine Liste, also möchte ich jede dieser
Summen zu dieser Liste
hinzufügen Das können wir also ganz einfach machen. Wir können die Methode ad verwenden, die
das der Liste hinzufügt,
und dann können wir einfach die
Summen hier einfügen, aber denken Sie das der Liste hinzufügt,
und dann können wir einfach die daran, es sich um einen Typ handelt, der Nullwerte zulässt, also müssen wir
den Wert hier verwenden, was gut aussieht,
aber oh, warte, nein Jetzt müssen wir überprüfen, ob
es einen Wert hat. Wir müssen dieses
Eigentum nutzen. Oh ja. Aber das muss hier so sein,
dass es einen Wert hat. Dann
können wir zum Beispiel den Wert hinzufügen. Das sollte funktionieren, aber denken Sie daran, als ich sagte, dass
Null-Koaleszenzoperatoren Abkürzungen für all das
sind Wir brauchen das alles überhaupt
nicht. In solchen Fällen können
wir den anderen
Null-Koaleszenzoperator verwenden, nämlich die beiden
Fragezeichen und das Gleichheitszeichen Was macht das und
wie funktioniert das? Nehmen wir zum Beispiel an, diese sind hier als Null definiert, aus welchem
Grund auch immer,
während unserer Software geben
wir ihnen keine wirklichen Werte, sie bleiben Null. Nun, vielleicht hat einer von
ihnen einen Wert, aber aus welchem Grund auch immer, können einige
von ihnen immer noch Null sein. Wir kommen dazu,
diese zur Liste hinzuzufügen, wir wollen nur die
Werte hinzufügen, bei denen sie nicht
Null sind , weil wir einer Liste keine
Null-Sachen hinzufügen können. Selbst wenn wir es versuchen, wird es
nicht zu Buchstaben. Was ich tun möchte, ist, wenn diese
zum Beispiel einen Wert wie diesen
haben , dann
möchte ich ihn der Liste hinzufügen. Dieser hat einen Wert von 4567, also möchte ich ihn hinzufügen Wenn sie jedoch Null sind, möchte ich
stattdessen Null oder einen
anderen Standardwert hinzufügen stattdessen Null oder einen
anderen Standardwert Im Grunde möchte ich keine Null
hinzufügen, weil ich das nicht kann. Es gibt tatsächlich einen schnellen
Weg, das zu tun. Was ich tun kann, ist
diesen
Null-Koaleszenzoperator gefolgt von
einer Null zu verwenden diesen
Null-Koaleszenzoperator gefolgt von . Lassen Sie uns das zurücksetzen Was das bedeutet, wenn diese
Variable hier Null ist, dann wird sie dieser Variablen
Null zuweisen dann der Liste hinzufügen. Wenn das so ist, wenn die
linke Seite dieses Operators Null
ergibt,
was auch
der Fall ist, weil sie Null ist, dann erhält diese Variable den Wert dessen, was
sich auf der rechten Seite befindet Denken Sie daran, dies könnte ein einfacher Wert
sein, es könnte eine Methode sein,
die einen Rückgabewert hat Es kann grundsätzlich jeder
Ausdruck sein, der ausgewertet werden kann. Also lass uns hier einfach Null setzen. Was wir tun können, wir können das
für all diese tun. Wir wollen zum Beispiel all unsere Kosten für
die Rechnungen dazurechnen. Wir wollen natürlich die Kosten
hinzurechnen, die entstehen, wenn wir unser
Geld für nutzlose Dinge ausgeben. Schauen Sie sich jetzt an, was passiert, wenn ich das Programm starte und hier
einen Breakpoint hinzufüge. Jetzt gehe ich
hier runter zu meinen Gesamtwerten und erweitere sie. Sie können hier sehen, dass die Liste alle Nullen
enthält.
Dies ist der Standardwert,
wie Sie hier sehen können Nicht nur das, Sie können sehen, dass sich
dies in den
Variablen selbst widerspiegelt, sie haben jetzt den Wert Null Um diesen Punkt zu veranschaulichen, werde
ich einfach
eins in etwas Ähnliches ändern. Ich werde die
Software noch einmal ausführen. Wenn ich zum
Locals-Fenster hier unten komme, können
Sie sehen, dass diese Variable diesen Wert tatsächlich
beibehalten
hat. Sie wurde ihr zugewiesen,
sie hat jetzt einen neuen Wert, 4567, und das
spiegelt sich jetzt auch in der Liste Dieser Null-Koaleszenzoperator ist
gleichbedeutend mit Fragezeichen Wenn die linke Seite Null ist, erhält die linke Seite den Wert auf
der rechten So
funktioniert dieser Operator. Genau wie zuvor. Ich werde einen Code-Kommentar schreiben, damit Sie das hier
illustriert sehen können. Wenn der
Nullwert-Typ
beispielsweise Null ergibt, sind die
Einkaufskosten Null, und zu beispielsweise Null ergibt, sind die
Einkaufskosten Null, diesem Zeitpunkt sind
sie Null Dann werten Sie alles aus, was sich
auf der rechten Seite dieses Operators befindet, und weisen Sie
es dem Typ zu, für den Wenn der Typ, für den
Nullwerte zulässig sind, Null ist, erhält
er natürlich er Das sind zwei
Null-Koaleszenzoperatoren in C Sharp, wie sie funktionieren und
warum sie nützlich Es ist nichts, was man
nicht schon
mit einer Bedingung machen kann, um den Wert zu
überprüfen, aber es ist eine nette Abkürzung, um Code und auch
Entwicklungszeit zu minimieren
73. 18-1. Benannte und optionale Parameter: Ich werde jetzt ein
paar Tipps vorstellen, die
Sie beim Aufrufen von Methoden in C Sharp verwenden können. Das hat mit
der Übergabe der Parameter zu tun. Ich werde
über sogenannte benannte Parameter und auch
optionale Parameter in C Sharp sprechen. Schauen wir uns dieses Beispiel hier an. Es macht nicht wirklich viel. Ich habe eine Beispielmethode, sie verwendet verschiedene Parameter, alle von unterschiedlichen Typen. Wir haben ein Videospielobjekt, ein paar Zahlen, eine Zeichenfolge und auch ein Booling Innerhalb der Methode geben
wir nur
die Title-Eigenschaft dieses Spielobjekts
aus, die wir hier oben
im Konstruktor angeben Als Nächstes addieren wir
die beiden Zahlen und
zeigen das Endlich haben wir eine Bedingung. Wenn der Wert dieser
boolenden Variablen wahr ist, geben wir
die Nachricht hier aus Es ist ein ziemlicher Spießrutenlauf mit Aufgaben
. Es hat in der realen Welt keinen
wirklichen Zweck. Es dient nur dem
Zweck dieses Beispiels. Wenn wir die Methode aufrufen, können
Sie sehen, dass wir hier ein neues Objekt
einrichten. Und dann
rufen wir die Methode übergeben dieses Objekt und auch den Rest
der Parameter wenn ich das Programm ausführe. Sie können sehen, dass es beim
Aufrufen von Methoden so
ziemlich genau das tut, was es bisher
sagt. Wir haben
diese Methoden mit
den Parametern in der Reihenfolge aufgerufen , in der sie erscheinen. Das Spielobjekt ist „Zuerst bestehen
wir das Spiel zuerst“, gefolgt von Nummer
eins. Nummer eins. Nummer zwei, Sie können
alle in der Reihenfolge sehen, in der sie
angegeben sind , indem Sie
sogenannte benannte Parameter verwenden. Wir müssen
die Parameter nicht der Reihe nach angeben. Schauen wir uns jetzt ein
Beispiel dafür an. Angenommen, ich möchte
die Position dieser
beiden Parameter hier ändern,
Hallo, und auch
den booleschen Wert true Jetzt möchte ich zuerst den Bolen angeben
. Was wir tun, wir nehmen den
Namen des Parameters hier und stellen ihm einfach so einen
Doppelpunkt Wir werden das zuerst
spezifizieren, jetzt werden wir die Nachricht
spezifizieren. Danach machen wir
genau das Gleiche. Wir nehmen den Parameter, fügen den Doppelpunkt
und dann seinen Wert hinzu. Jetzt habe ich die Reihenfolge
dieser beiden Parameter getauscht. Um das zu tun, muss
ich den Namen
des Parameters angeben , nur um
dem System mitzuteilen , welcher zu welchem
gehört. Wir korrigieren das hier einfach
mit einem Doppelpunkt. Wenn ich die Anwendung starte, haben wir
jetzt genau
das gleiche Ergebnis. Das sind benannte Parameter. Sie können sehen, dass wir nur
die Reihenfolge der
letzten beiden Parameter geändert haben. Die ersten drei bleiben
in derselben Reihenfolge. Dass wir diesen keinen Namen geben
müssen , weil sie in
derselben Reihenfolge sind. Wenn ich jedoch
meinen ersten Parameter benennen und ihn an einer
völlig anderen Stelle
platzieren möchte, muss ich jeden einzelnen Parameter
benennen. Andernfalls erhalten wir
hier eine Fehlermeldung. In diesem Fall
muss ich die ersten
drei nicht benennen , da sie
von Anfang
an in exakt derselben Reihenfolge sind. Aber wenn ich das Spiel zum Beispiel
ganz bis zum
Ende verschiebe zum Beispiel
ganz bis zum
Ende und dem Spiel einen Namen gebe, der
ungefähr so aussieht, dann
erhalte ich diesen Fehler. Und das liegt daran, dass ich allem
anderen den Namen
voranstellen muss . Jetzt können Sie sehen, dass
der Fehler
behoben wurde , weil das Spiel aus der Position verschoben
wurde. Und das war der allererste. Daher gibt es überhaupt
keine Bestellung. Also werden sie alle einen Namen brauchen. In diesem Fall ist das die
Stärke benannter Parameter. Aber warum ist es nützlich? Nun, man könnte argumentieren, dass es
die Lesbarkeit verbessert. Man könnte anhand des
eigentlichen Aufrufs selbst sagen,
vorausgesetzt, diese Methode
war
in einer anderen Klasse
oder einer anderen Datei gesperrt , Sie haben diese
Sichtbarkeit nur auf Ihrer Seite, Sie können deutlich
sehen, dass Nummer eins den Wert
dieser Zahl zwei
hat, da
Sie dadurch ein bisschen mehr Informationen
über den Aufruf Es erzeugt jedoch etwas mehr Code in
Ihrer Anwendung. Ein weiterer Grund,
vielleicht arbeitet
ein Entwickler an dieser Methode. Hier ist die Methode noch nicht
ganz fertig. Sie haben zum Beispiel vielleicht fünf
Parameter, aber vielleicht
werden sie bald noch ein paar mehr hinzufügen. Ihre Aufgabe als Tester
ist es, die Methode zu testen. Sie testen die Methode
mit diesen fünf Parametern, wissen
aber nicht,
ob der Entwickler später
weitere davon hinzufügen
wird. Was Sie also tun können, Sie können hier
benannte Parameter verwenden hier
benannte Parameter um beliebige Tests
durchzuführen. Wenn der Entwickler dann zwei weitere in beliebiger Reihenfolge
hinzufügt, spielt das keine Dann wissen Sie, dass Ihre
Parameter nicht versehentlich
an
andere übergeben werden. Wenn
der Entwickler dann zum Beispiel zwei weitere
Integer-Parameter
hinzufügt, dann wissen wir, dass Nummer eins und Nummer zwei in diesem Fall
5,3 sein werden. Wenn der Entwickler zum Beispiel
3,4 hinzufügt, setzen
wir
diese Zahlen nicht versehentlich in diese Slots. In solchen Fällen ist es sehr
nützlich, wenn Sie
nicht versehentlich Parameter
desselben Typs an
verschiedene Parameter
übergeben . Sie sagen buchstäblich, okay, dieser Parameter, der so heißt,
erhält diesen Wert. Das ist ziemlich nützlich. Das sind nicht nur Methoden. Sie können dies auch in Konstruktoren und einigen anderen
Dingen tun Wenn ich zu dieser
Videospielklasse gehe, in der wir diesen Parameter
für den Konstruktor
angegeben haben , können
Sie sehen, dass der Konstruktor nur ein
Argument akzeptiert,
nämlich Genau wie beim Aufrufen von
Methoden kann
ich dem zum Beispiel einen
Titel voranstellen und es wird
problemlos kompiliert Wir sind nicht
auf Methodenaufrufen
mit
solchen benannten Parametern beschränkt . Wir können sie auch in
Konstruktoren und ähnlichen
Dingen verwenden Konstruktoren und ähnlichen
Dingen Lassen Sie uns jetzt über
optionale Parameter sprechen .
Was bedeutet das? Wenn Sie einen
optionalen Parameter haben, können
Sie dem Parameter
einen Standardwert geben , wenn kein
Parameter angegeben ist. Schauen wir uns zum Beispiel
diese Display-Meldung Bolen an. Genau hier übergeben wir
den Wert von true. Sagen wir einfach, wir
müssen keinen Wert übergeben. Aber wir können, wenn wir wollen, was wir hier tun können,
sagen, okay, wenn dieser Parameter nicht an diese
Methodenanzeige übergeben wird, dann setzen wir ihn einfach auf
den Standardwert true. Wenn der Parameter
weggelassen wird, ist er nicht da. Wenn diese Methode
dann aufgerufen wird, wird
sie sie einfach auf true
initialisieren Wenn das hier wahr ist, wird die Nachricht
ausgegeben Wir können uns das
jetzt ansehen, um zu sehen, ob das funktioniert. Sie können sehen, wie die
Nachrichten ausgegeben werden. Ebenso
wird uns diese Meldung überhaupt nicht
angezeigt, wenn ich diesen
Standardwert auf False ändere . Es wird nicht Hallo sagen,
was nicht der Fall ist. Bei der Angabe optionaler
Parameter in C Sharp müssen
sie nach
den erforderlichen Parametern suchen. Wenn ich beispielsweise
eine Nachricht zu einem optionalen Parameter mache, initialisiere
ich sie einfach mit einem Standardwert einer
leeren Zeichenfolge wie dieser Sie können sehen, dass ich
hier
einen kleinen Fehler habe, wenn ich versuche, die Anwendung zu
kompilieren Wenn ich das zum Beispiel einfach
auf true setze, können
Sie sehen, dass ein Fehler vorliegt. Wenn wir hierher kommen, können
wir diesen Fehler hier sehen. Optionale Parameter müssen hinter allen erforderlichen Parametern stehen. Alle optionalen Parameter
müssen am Ende stehen. Hier kannst du so
viele haben, wie du willst. Zum Beispiel können wir
message als
leere Zeichenfolge zum Standardwert machen und die Nachricht auch als
Standardwert true
anzeigen. Dann können wir diese Werte tatsächlich
entfernen. Wir können sogar so
weit gehen zu sagen, okay, lass uns
diese beiden Zahlen
auf Null initialisieren , wenn sie
nicht angegeben sind Sie können also dort sehen, dann brauchen
wir diese zum Beispiel nicht Aber es hängt wirklich von
Ihrem Zweck ab und davon, was Sie erreichen möchten, wenn wir die Anwendung
ausführen. Jetzt können wir sehen, wie wir die
beiden Zahlen addieren, eine Null, weil wir sie mit Null
initialisieren, weil wir die Parameter nicht
angeben So ziemlich das Einzige, was wir tun, ist hier den Titel
des Videospiels auszugeben,
obwohl wir
diese Methode hier aufrufen Wenn wir uns jetzt die
Parameterliste ansehen können
Sie sehen, dass es hier etwas
mehr zusätzliche Informationen Es erfordert ein Videospiel , da dies ein
erforderlicher Parameter ist. Sie können jedoch sehen, dass
optionale Parameter jetzt über diese
eckigen Klammern verfügen. Außerdem erhalten Sie den
Standardwert 00, eine leere Zeichenfolge und auch „true“ Es gibt Ihnen auch einige
Rückmeldungen darüber, was
erforderlich ist , wenn
Sie versuchen, diese Methode aufzurufen. Sie können sehen, wie diese
optionalen Parameter
dargestellt werden , wenn Sie
versuchen, Ihre Methoden aufzurufen. Auch hier sind Sie nicht
auf Methodenaufrufen beschränkt. Damit können
Sie diese, genau wie zuvor, in
Konstruktoren und auch in
einigen anderen Dingen verwenden auch in
einigen anderen Dingen Delegiert Indizes. Wenn ich meinen Parameter Standardwert,
als leere Zeichenfolge, auf
den Konstruktor setze, benötige ich diesen
Wert nicht mehr, da er optional ist Wenn wir die Anwendung ausführen, erhalten
wir nur eine leere Zeichenfolge Sie können dort sehen, dass
es keinen Spieltitel , da der Standardwert eine leere Zeichenfolge
ist. Das ist die Stärke
benannter Parameter und auch optionaler
Parameter in C Sharp. Es eröffnet den Dingen ein ganz
neues Reich von Möglichkeiten. Ich hoffe, dieses Tutorial hat
dir geholfen und viel Spaß beim Codieren.
74. 18-2. Das out-Keyword: Ich werde
über das Schlüsselwort out
in C Sharp sprechen und warum es nützlich ist. Betrachten Sie dieses
Beispiel hier. Diese Methode, was sie tut, benötigt vier Parameter. Ich möchte diese
beiden addieren und dann diese beiden zusammen subtrahieren Sie können sehen, dass ich das hier mache. Ich erhalte das Ergebnis
der Addition in dieser Variablen und das Ergebnis der Subtraktion
in dieser Variablen Aber wie gebe ich
beide zurück? Als wir über
Rückgaben in Methoden gesprochen
haben, können wir hier einen Typ zurückgeben, aber wir können nur einen Wert
zurückgeben. Wie würde ich vielleicht 235 verschiedene Dinge aus
einer Methode machen? Ist das möglich? Nun, kurz gesagt, ja, wir können dafür das Schlüsselwort
out verwenden. Und Sie sehen das Schlüsselwort out, das in vielen Fällen
verwendet wird. Zum Beispiel könnte eine Methode einige Operationen ausführen und ein Ergebnis
zurückgeben. Aber wir möchten
vielleicht auch zurückgeben, ob die Methode
erfolgreich war , oder vielleicht ein Protokoll aller Fehler, die dabei
aufgetreten sind. Wir benötigen nicht nur das
Ergebnis der Methode, sondern vielleicht auch
mehr Informationen darüber, wie sie damit umgegangen ist, weißt
du, welche Fehler aufgetreten sind oder so ziemlich
ähnliches. Schauen wir uns also
das Schlüsselwort out an und
wie nützlich es ist. Nun das Schlüsselwort out
darüber, wie es sich verhält Es ist dem Schlüsselwort ref sehr
ähnlich Wenn Sie sich
mein Tutorial zum Schlüsselwort ref oder
zur Übergabe von
Typen anhand von Methoden nicht angesehen haben,
empfehle ich
Ihnen dringend, sich das anzusehen Schlüsselwort ref oder
zur Übergabe von
Typen anhand von Methoden nicht angesehen haben, empfehle ich
Ihnen dringend, sich das anzusehen Was ich hier tun werde,
ich habe hier zwei
lokale Variablen definiert,
result, add und
results subtract, und ich habe
sie auf Null initialisiert Im Moment gebe ich
sie im Fenster aus. Innerhalb der Methode mache ich so
ziemlich
genau das Gleiche,
aber ich möchte, dass sich diese
Ergebnisse hier in diesen Variablen
widerspiegeln damit ich
sie in das Fenster ausgeben kann, weil ich
diese beiden Werte momentan nicht
aus dieser Methode herausholen kann diese beiden Werte momentan nicht
aus dieser Methode herausholen Wie mache ich das? Schauen
wir uns die Verwendung des Schlüsselworts out an, was ich hier in der
Parameterliste tun kann. Für diese Methode kann ich
mit dem Schlüsselwort out
einen zusätzlichen Parameter hinzufügen . Was ich tun möchte,
ich möchte diese
beiden Werte
aus der Methode zurückgeben . Ich werde hier zwei
Ausgangsvariablen haben. Die erste wird das Ergebnis
der Addition sein. Der zweite wird das Ergebnis
der Subtraktion sein Ergebnis
der Subtraktion Da diese nun mit ihren
eigenen Typen und eigenen Namen an
die Methode übergeben werden , kann
ich ihnen dann keinen
brandneuen Typ geben. Ich entferne diese. So
ziemlich funktioniert es. Jetzt können Sie sehen, dass hier ein Fehler
aufgetreten ist. Und wenn ich mit der Maus darüber fahre
, dass kein Argument angegeben wird, das
dem erforderlichen Parameter entspricht, muss ich
im Grunde
zwei zusätzliche Parameter angeben Die Anzahl der Parameter
entspricht der Definition. Hier, ich brauche noch zwei. Wenn Sie hier das Schlüsselwort out
in der Methodendeklaration haben , müssen
Sie beim
Aufrufen
der Methode auch das Schlüsselwort out angeben . Das
werde ich hier tun. Wenn Sie sich mein Video
über das Schlüsselwort ref und die
Übergabe von Wert- und
Referenztypen an Methoden angesehen haben, wissen
Sie, dass wir, wenn wir
etwas per Referenz an eine
Methode übergeben , die Werte
innerhalb der Methode ändern können und wir verweisen auf den Speicherbereich , in dem sich
diese Variablen Genau das macht das Schlüsselwort
out. Hier gibt es jedoch einen subtilen
Unterschied zwischen dem Schlüsselwort ref und
dem Schlüsselwort out. Das heißt, Variablen müssen
nicht
initialisiert werden, bevor eine Variable
mit dem Schlüsselwort out
übergeben mit dem Schlüsselwort out Was meine ich damit? Nun, lassen Sie uns tatsächlich sehen, ob
dieses Beispiel funktioniert. Zuerst, bevor wir uns selbst überholen, übergebe
ich 20 Werte
als Schlüsselwortparameter. Sie kommen in die Methode, und dann legen wir die
Werte genau hier fest. Lass uns einen Blick darauf werfen. Sie können sehen, dass wir das erwartete Ergebnis erzielen. Zwei plus zwei ist 4,6
minus vier ist zwei. Es funktioniert. Und
wir bekommen tatsächlich beide Ergebnisse aus der Methode
zurückgegeben. Aber es geht nicht wirklich darum
, aus der Methode herauszukommen, es geht nur
darum,
diese beiden Werte zu modifizieren, während sie per
Referenz an diese Methode übergeben werden, und
dann geben wir nur die Ergebnisse Ich habe bereits gesagt, dass es einen
subtilen Unterschied zwischen
dem Schlüsselwort out und
dem Schlüsselwort f Und das heißt, dass bei
Verwendung des Schlüsselworts out die übergebenen
Variablen
nicht initialisiert werden müssen, das heißt, sie benötigen
keinen Wert Es wird immer noch funktionieren,
wenn ich die Software starte. Jetzt können Sie sehen,
dass sie Werte haben. Und das liegt daran, dass
wir,
wenn hier Dinge an eine Methode
übergeben werden , ihnen einen Wert geben müssen. Wenn wir das nicht tun, übergeben
wir eine Variable. Hier können Sie sehen, dass ein
Fehler vorliegt und es heißt, dass das Ergebnis ad zugewiesen werden muss,
bevor die Methode abgeschlossen ist. Also müssen wir hier tatsächlich
etwas mit diesen
Out-Parametern machen. Wir müssen
etwas mit ihnen machen, ihnen einen Wert
geben, sie
initialisieren, etwas
tun, das den subtilen Unterschied
zwischen out und ref ausmacht Aber im Allgemeinen ermöglicht Ihnen das
Schlüsselwort out
gewissermaßen, mehr als ein Objekt aus einer Methode zurückzugeben, und das ist ihre Hauptstärke Wirklich eine andere Sache, wir
müssen unsere
Variablen hier nicht definieren. Wir können
sie tatsächlich alle in einer Zeile definieren. Wenn ich diese
Variablen
zwischen dem Schlüsselwort out und
der Variablen komplett entferne , tippe ich einfach zum Beispiel
int
für den Datentyp ein. Jetzt definieren wir hier
unsere Variablen tatsächlich in einer
Codezeile. Und Sie können sehen, es
sieht nach einer tollen Idee aus. Also definieren wir sie hier, dann geben wir
sie alle in einem weiter. Und dann tut es etwas, wirft sie wieder raus. Und dann geben wir
die Ergebnisse aus. Sie können also sehen, dass wir hier
dieselben Ergebnisse erzielen. Das ist also die Stärke des Schlüsselworts
out in C Sharp.
75. 18-3. Das in Keyword: Ich werde über
das Schlüsselwort in C Sharp sprechen. Jetzt habe ich ein sehr
einfaches Beispiel. Hier rufe ich eine Methode auf, die
zwei Zahlen zusammenzählt. Wenn die Methode aufgerufen wird, füllen
wir das Ergebnis
davon in eine Variable
und geben das Ergebnis aus, indem wir zwei plus zwei addieren, wir erhalten die Ausgabe von vier Wie kommt das Schlüsselwort
dazu? Nun, wenn wir das
Schlüsselwort hier in einer Methode verwenden, können
wir es vor
jedem beliebigen Parameter angeben. Erstens, was das Schlüsselwort bewirkt, verhindert
es, dass wir diesen Wert überhaupt
ändern können. Wenn wir dann
zum Beispiel versuchen, einen solchen Wert
festzulegen, können Sie sehen, dass die
Software nicht einmal kompiliert wird. Wenn wir das markieren
und mit der Maus darüber fahren. Es heißt, dass die
Variable int nicht zugewiesen werden kann, da
sie schreibgeschützt ist Es hindert uns tatsächlich daran irgendetwas mit
dieser Variablen zu tun. Auch hier könnten wir
dies auf eine beliebige Anzahl von
Parametern setzen , die wir möchten. Dies sind einfache
Werttypen, einfache Ganzzahlen. Schauen wir uns an, wie
das mit Objekten funktioniert. Sie können hier zum Beispiel
sehen, dass ich hier ein Beispiel
mit einem Objekt habe, wie zum Beispiel ein Videospiel Ich
setze den Titel des
Spiels über den Konstruktor auf Minecraft und gebe einfach den Titel des Spiels Aber wenn ich versuche, dieses Objekt in
irgendeiner Weise zu
ändern , wenn ich
das Schlüsselwort in
angebe, wird ein
ähnlicher Nur-Lese-Fehler Sie können hier sehen, dass ich
den Titel lösche , indem ich
ihn auf eine leere Zeichenfolge setze Aber es heißt, es kann nicht
zugewiesen werden, es ist nur lesbar. Ebenso habe ich genau
den gleichen Fehler, wenn ich versuche,
daraus
eine neue Instanz zu erstellen versuche,
daraus
eine neue Instanz . Das ist die Stärke
des Schlüsselworts in C Sharp. Es verhindert, dass Dinge wie
Methoden versehentlich Ihre Parameter
ändern , die Sie übergeben möchten. Wenn Sie wissen, dass diese Methode nicht
dafür verantwortlich
ist , Ihre
Parameter in irgendeiner Weise zu ändern, sollten Sie
erwägen,
sie mit dem
Schlüsselwort in anzugeben , um
Ihre Daten zu schützen und zu verhindern, dass
Methoden Ihre Daten ändern und dass
unerwartete Dinge passieren, was ziemlich
oft passieren kann, glauben Sie mir. Aber das Schöne an
dem Schlüsselwort ist ja, Sie könnten
hier zum Beispiel eine Konstante oder eine
schreibgeschützte Variable übergeben . Aber vielleicht sind Ihre Objekte nicht
schreibgeschützt oder konstant, sondern Sie möchten sie nur vorübergehend nur für die
Dauer der Methode
lesbar
machen . Das ist der Sinn
des Q-Wortes in C-Shop.
76. 18-4. Das params-Schlüsselwort: Das Schlüsselwort Perms in C Sharp. Es sieht einfach so aus und
ist die Abkürzung für Parameter. Aber was bedeutet es
und was macht es? Schauen wir uns dieses Beispiel
an. Genau hier habe ich eine Methode, die einige einfache
Ganzzahlen
zusammenfügt Es benötigt vier Parameter, addiert
sie alle zusammen und gibt das Ergebnis aus Die Methode übernimmt sie
von dem, was auch immer sie aufruft. Wir fügen 224,5 hinzu. Lassen Sie uns das
Ergebnis ausgeben. Da ist es da. Wenn ich zum Beispiel zwei
Zahlen addieren möchte, möchte ich
vielleicht
drei Zahlen zusammenzählen. Oder vielleicht 17 Zahlen zusammen. Aber ich will dasselbe, ich will nur eine Methode. Ich möchte dieselbe Methode und eine Methode, um all
diese Zahlen zu addieren. Wie erreiche ich das? Nun, vielleicht könnte ich ein benutzerdefiniertes Objekt
erstellen, zum Beispiel alle Zahlen eingeben. Oder vielleicht eine Liste erstellen und alle Zahlen zur Liste
hinzufügen. Dann kann ich die
Liste an diese Methode übergeben. Im Wesentlichen macht das das Schlüsselwort prams genau
das. Wenn ich in diesem Fall das Schlüsselwort Prams
verwende, tippe
ich hier Prams in
die Hier ist es ein Parameter selbst. Als nächstes gebe ich den Datentyp ein. Der Datentyp kann hinter den Kulissen
so ziemlich alles sein. Er verwendet den Objektdatentyp, dem ohnehin alle
Datentypen abgeleitet Aber wir verwenden Integer. Wir können benutzerdefinierte
Objekte verwenden, wenn wir möchten. Benutzerdefinierte Instanzen,
das ist nicht wirklich wichtig. Ich werde diese Liste einfach aufrufen weil diese Liste all unsere Zahlen enthalten wird all unsere Zahlen enthalten , die wir
an diese Methode übergeben. Wenn wir jetzt mit Listen arbeiten, werden
wir so
etwas wie eine Schleife verwenden, um jedes
Element in dieser Liste in einer
Schleife zu durchlaufen. So können wir alle Zahlen zusammenzählen. Lass uns das jetzt machen. Wir initialisieren eine
Variable auf Null. Dadurch wird eine Liste
aller Zahlen gespeichert, die
wir addieren Das sollte genau dort funktionieren. Wir schauen uns
jede Zahl in der Liste an. Wir führen eine laufende Bilanz, fügen hier alles zu
diesem Ergebnis hinzu
und geben es dann aus. Wir werden
das gleiche Ergebnis erzielen. Hier können
Sie 13 sehen Das ist nun die Stärke
des Schlüsselworts params. Schau dir das an. Okay, ich habe das
Aufrufargument hier
geändert, um dieser Liste viel mehr
Parameter
hinzuzufügen, aber Sie können sehen, dass es keine Probleme
verursacht hat. Das ist die Stärke des
Schlüsselworts params. Wenn wir zum Beispiel
eine Liste erstellen und diese an die Methode übergeben würden, müssten wir
die Liste auch auf diese Weise ändern Aber Sie können sehen, dass dies überhaupt keine Fehler
verursacht. Wir können die Software kompilieren
und wir können die Software ausführen, und wir haben hier unser erwartetes
Ergebnis. Das ist die Stärke des
Schlüsselworts params. Es ermöglicht uns,
eine Methode zu verwenden, um
eine unterschiedliche Anzahl von
Parametern desselben Typs zu akzeptieren , und dann kann es
mit diesen Informationen arbeiten Damit sind nun einige Regeln
verbunden. nur
ein Schlüsselwort params geben Pro Methodendeklaration kann es
beispielsweise Wir können nicht zwei davon haben, also wird es nicht funktionieren Zweitens
muss das Schlüsselwort params hier am Ende
von allem Wenn ich hier mehr als
einen Parameter habe, müssen
params ganz am Ende stehen Es kann nicht am Anfang sein, es kann nicht in der Mitte sein Sie können also sehen, dass hier ein Fehler
aufgetreten ist, weil er am Ende
der Liste stehen muss. Und schließlich
müssen die Parameter hier ein
eindimensionales Array sein Es kann kein
zweidimensionales Array sein, es kann nichts
Seltsames sein Es gibt also einige Regeln, die mit dem Schlüsselwort
params
verknüpft sind Das ist also die Stärke des Schlüsselworts
params in C Sharp. Ja, es gibt andere Möglichkeiten, dieselben Ergebnisse
zu erzielen, aber je mehr Tools Sie in Ihrer Toolbox
haben, desto besser werden
Sie als Entwickler Das ist also das
Schlüsselwort params in C Sharp.
77. 19-1. Enumerations - Der enum-Typ: Ich möchte über
Aufzählungen in C Sharp sprechen, auch bekannt als Enums. Und das Schlüsselwort sieht
ungefähr so aus. Aber was ist eine Aufzählung und
warum sollte ich sie verwenden? Nun, ich habe hier ein
Beispiel. Hier richte ich vier
Videospielobjekte ein. Sie nehmen verschiedene Parameter auf. Schauen wir uns jetzt die Klasse
an. Sie können also sehen, dass
eine Konsole, ein Videospieltitel, ein Videospiel-Publisher
und eine Bewertung erforderlich sind. Lassen Sie uns also genau hier auf diese
Bewertungszeichenfolge achten. Was ich tun möchte,
ich möchte nur bestimmte Bewertungen
für alle
zulassen. Zehn plus Teenager, reifer, 17 und so weiter, und so weiter Ich möchte nur, dass diese
Werte weitergegeben
werden und ich möchte mich nur mit diesen Werten
befassen Aber wenn Sie diese Objekte
einrichten, können
Sie sehen, dass ich
sie hier einfüge. Aber es ist sehr leicht
, einen Fehler zu machen. Ich könnte einen Rechtschreibfehler machen, vielleicht einen Kleinbuchstaben, so
etwas Wenn diese Anwendung mit einer Datenbank
verbunden ist, gibt es ein paar Probleme Ich werde
falsche Werte speichern und das ganze
System kann durcheinander geraten Wenn jemand zum Beispiel nach einem Spiel
suchen möchte
und die Bewertung falsch ist, weil es falsch geschrieben wurde, dann wird
dieses Videospiel vielleicht nie
in der
Suche auftauchen, wenn er nach Bewertung dieses Videospiel vielleicht nie
in der
Suche auftauchen Es gibt viele Gründe, warum wir brauchen , dass
unsere Daten
präzise und korrekt sind Eine Möglichkeit, dieses
Problem anzugehen, besteht darin
, sicherzustellen , dass
für diese Zeichenkettenvariable keine
Rechtschreibfehler für diese Zeichenkettenvariable Bewertung besteht beispielsweise darin,
etwas zu verwenden Eine
Bewertung besteht beispielsweise darin,
etwas zu verwenden, das als Aufzählung oder Aufzählung bezeichnet wird Wie
richte ich das ein und wie
integriere ich es hier in meinen
Videospielkurs Nun, lass uns einen Blick darauf werfen. Gehen wir
hier auf
die rechte Seite , wo wir unser Projekt haben. Wir schreiben Click, Go to Add und dann Go to Class. Wir werden das
etwas nennen , das unserer Bewertung
entspricht. Wenn wir nun eine sehr
umfangreiche Software haben, sollten
wir das vielleicht sehr
anschaulich beschreiben Ich denke, vielleicht ist die Bewertung von
Videospielen gut. Wenn
Sie jedoch eine Aufzählung erstellen, haben
Sie manchmal eine Klasse mit
genau demselben Namen, und Sie können keine
Klasse mit demselben Namen erstellen Was viele Leute tun, wenn sie eine Aufzählung
erstellen, ist , danach das Wort Status
oder Typ hinzuzufügen Jedes Mal, wenn sie eine erstellen, endet
sie also entweder mit Status oder Typ Es liegt wirklich an dir,
es spielt keine Rolle. Aber ich werde
es ungefähr so nennen. Also pass auf,
du merkst, dass es sich
hier um eine Klasse handelt, wenn ich auf Hinzufügen klicke Wenn wir
also nach links kommen, haben wir
jetzt einen internen Klassenbewertungstyp für
Videospiele. Nun, wir wollen keine
Klasse, wir wollen eine Aufzählung. Und dafür gab es keine
Vorlage, also haben wir jetzt eine Aufzählung Es ist so einfach wie das
Ändern der Klasse in eine Aufzählung. Wir haben
hier eine Aufzählung. Also, wie funktioniert das? Nun, lass uns
hier zu
unserem Videospielkurs gehen und unsere
erlaubten Bewertungen nehmen. Ich werde sie hier
als Kommentar einfügen , damit ich auf sie
verweisen kann. Und ich möchte für
jede dieser Bewertungen einen Eintrag in
der Aufzählung erstellen für
jede dieser Bewertungen einen Eintrag in
der Aufzählung Also ich will alle
zehn plus Teenager, reife 17, und so weiter Also ich will all diese
Artikel in dieser Aufzählung haben. Und die Aufzählung
ist wie eine Liste. Also wie eine Liste von Werten. Und diese Liste ist nicht nur eine Liste, sondern sie ist wie eine schreibgeschützte Liste. Wir können
diese Informationen nicht ändern. Es ist so gut wie schreibgeschützt, also verwenden wir es, um auf diese Werte
zu verweisen. Es wird alles gleich
klar werden. Ich werde für jede
dieser Bewertungen
einige Werte erstellen für jede
dieser Bewertungen
einige Werte In der Aufzählung werde ich damit beginnen, was für alle
steht Sobald ich einen Wert erstellt habe, setze
ich ein Komma und
dann eine neue Zeile Jetzt kann ich den nächsten machen.
Jetzt gibt es ein Problem. Sobald ich zehn eingegeben habe, liegt
das daran, dass
Ihre Artikel in Aufzählungen keine
Zahlen oder bestimmte Zeichen
wie dieses Pluszeichen enthalten dürfen Zahlen oder bestimmte Zeichen
wie dieses Wir müssen
das abtippen. In diesem Fall
können wir zehn plus sagen, und das funktioniert einwandfrei. Lass uns weitermachen. Ich habe hier eine grobe Aufzählung eingegeben
. Sie können sehen, dass sich all diese Werte
in der Aufzählung widerspiegeln Wir können zu einem
späteren Zeitpunkt weitere hinzufügen, wenn wir möchten. Nun, wie funktioniert das? Wie können wir das
in unseren Unterricht integrieren? Nun, das ist jetzt
wie ein Datentyp bei dem wir vorher eine
Zeichenkettenbewertung hatten. Wir können diese
Aufzählung genau hier verwenden. Wenn wir hier zu unserer
Klasse gehen, ersetzen
wir Zeichenfolge durch den Bewertungstyp für
Videospiele Wir ersetzen es auch
im Parameter und auch in allen Methoden, die wir hier
haben. Auch da. Und es sieht so aus, als
hätten wir ein Problem, und das liegt an der Barrierefreiheit. Standardmäßig ist unsere
Klasse intern, aber da unsere
Videospielklasse öffentlich ist, müssen
wir auch die
Aufzählung öffentlich machen Jetzt sind all diese Fehler
verschwunden. Jetzt haben wir
den Parameter tatsächlich in
unseren Konstruktor geändert , einen Aufzählungstyp Schauen wir uns an, wie wir diese Objekte
jetzt konstruieren. Jetzt können Sie hier sehen, dass
bei all diesen Fehlern aufgetreten sind. Lassen Sie uns versuchen, diesen Teenager
so zu ändern, dass er unsere Aufzählung verwendet. Wenn ich hier ein Komma setze, siehst
du die Intellisens.
Die automatische Vervollständigung hat
unsere Die automatische Vervollständigung hat Wir werden einfach darauf doppelklicken. Dann setzen wir einen Punkt. Jetzt können Sie sehen, dass es hier
eine nette Liste gibt. Wenn jemand diese Objekte
konstruieren möchte. Jetzt können sie nicht einfach irgendeinen Wert
eingeben. Schau, dafür ist ein Bewertungstyp für
Videospiele erforderlich. Sie können es in der
Parameterliste sehen. Aber jetzt
können wir einfach nichts mehr angeben. Wir müssen
etwas aus dieser Liste auswählen. Wenn wir das nicht tun, wird
die Anwendung nicht einmal kompiliert
, weil ein Fehler vorliegt. Sie können sehen, wie diese Aufzählung uns
zwingt, ein
Element aus dieser Liste auszuwählen Jetzt können wir zum Beispiel
Teen sagen. Wenn wir nun jedes
dieser Objekte durch die Aufzählung ersetzen, können
Sie sehen, wann wir diese Objekte
konstruieren Jetzt wird es
ungefähr so aussehen Sie können sehen, dass es sich um eine verschlossene Idee
handelt. Aber nicht nur das, es
zwingt Menschen oder Software oder irgendetwas anderes, keine Fehler
in unseren Informationen zu machen. Du würdest das nicht wirklich für etwas wie
Blizzard oder
World of War Crafts verwenden Blizzard oder
World of War Crafts weil diese einzigartig sind Vielleicht könnte die
Konsole jedoch
eine Aufzählung darstellen , da es
nur eine begrenzte
Anzahl von Konsolen gibt nur eine begrenzte Weißt du, du hast die
Playstation X-Box oder den PC. Das könnte also wiederum durch eine Aufzählung
dargestellt werden, aber für so etwas wie eine Bewertung scheint
dies ein perfekter
Kandidat für die Verwendung als Aufzählung zu sein, scheint
dies ein perfekter
Kandidat für die Verwendung als Aufzählung zu wenn mit
Aufzählungen
gearbeitet Zum Beispiel sind
diese Videospiele vielleicht Datenbank gespeichert Diese Datenbank wird
nun den Namen und den Titel
des Videospiels enthalten und möglicherweise nicht den vollständigen
Namen
der Aufzählung in der Datenbank haben vollständigen
Namen
der Aufzählung in der Datenbank Sie könnte eine
Ganzzahl wie 01 oder zwei haben. Jede dieser
ganzen Zahlen kann für
eine andere Bewertung
in der Aufzählung stehen eine andere Bewertung
in der Aufzählung Zum Beispiel
wäre jede Zahl 010 plus eins, zehn wäre zwei usw. Wenn Sie Aufzählungen
in Visual Studio definieren, gibt es einen zugrunde liegenden Typ, d.
h. im Hintergrund Standardmäßig hat jeder
von ihnen einen Wert
, der eine Ganzzahl ist Und ich werde dir zeigen
, was ich damit meine. Dadurch wird eine
dieser Aufzählungen im Konsolenfenster
ausgegeben dieser Aufzählungen im Konsolenfenster Ich werde nur die
Videospiel-Bewertung vom Typ Teen ausgeben. Wahrscheinlich steht das
nur auf
dem Fenster selbst,
da steht nur Teen. Aber sieh dir an, was passiert, wenn ich das
in eine Ganzzahl umwandle. Wenn ich also die Anwendung starte, sehen Sie
jetzt, dass sie
den Wert zwei hat. Standardmäßig gibt es hier eine
zugrunde liegende Ganzzahl. Das liegt daran, dass
das erste Element standardmäßig 012345 ist. Dies erfolgt standardmäßig. Es ist das Standardverhalten, aber Sie können es tatsächlich ändern
, wenn Sie möchten. Sie können Ihre
eigenen Werte für diese angeben. Standardmäßig sieht es
ungefähr so aus. Jeder hat den Wert Null. Dieser hat den Wert 12345. So
sieht es hinter den Kulissen aus. Diese haben diese Integer-Werte. Sie können sie mit der Nummer oder mit dem Namen
referenzieren. Die Wahl liegt bei Ihnen. Aber normalerweise, wenn Sie so
etwas vielleicht
in einer Datenbank speichern so
etwas vielleicht
in einer Datenbank oder diese Werte
an eine andere
Software weitergeben , senden Sie
die Ganzzahl vielleicht nur, weil sie
kleiner ist und
einfacher zu handhaben ist. Aus diesem Grund
haben Aufzählungen einen zugrunde liegenden Typ. Betrachten Sie dies zum Beispiel als
einen Index. Aber wie gesagt,
Sie können
Ihre eigenen Typen, aber
auch Ihre eigenen Werte konfigurieren . Ich möchte zum Beispiel,
dass
dieser zehn ist, der andere 2030, 40, 50. Es spielt keine Rolle, die Wahl liegt ganz bei Ihnen. Und wenn wir das jetzt
erneut im Konsolenfenster ausgeben, können
Sie sehen, dass Zehn jetzt den Wert 22
hat, und das liegt daran, dass wir
ihm den Wert 22 gegeben haben. Ich weiß nicht, warum wir das gemacht haben, aber Sie können sehen, dass das Prinzip
so funktioniert. Im Grunde genommen verwendet
es hinter den Kulissen eine Ganzzahl, aber Sie können dies auf Wunsch in einen
anderen Datentyp ändern , z. B. ein Byte oder ein Long
oder etwas Ähnliches. Die Wahl liegt wirklich
bei Ihnen, aber standardmäßig. Es sieht ungefähr so aus. Wenn Sie den Typ ändern möchten, können
Sie danach einen Doppelpunkt hinzufügen
und den neuen Typ hier eingeben. Wenn Sie hier einen Typ haben, müssen alle diese Werte dem
Typ folgen, den Sie angeben. Vielleicht nutzen
Sie das nicht sofort, aber es ist immer gut, dieses Wissen im
Kopf zu
haben , wenn Sie es
zu einem späteren Zeitpunkt anwenden möchten. Aber das sind die Möglichkeiten und Dinge, die Sie
mit Aufzählungen machen können Was auch ziemlich üblich ist, ist, wenn Sie zum Beispiel eine Aufzählung haben All dies sind Bewertungen für
Videospiele. Möglicherweise
möchten Sie keine Bewertung angeben, aber der Benutzer hat
die Wahl zwischen sechs Optionen. Aber was ist, wenn es optional ist? Also, was viele
Leute tun, definieren ein Element namens non und geben
ihm normalerweise den Wert Null. Oder sie könnten ihm den Wert
999 geben und ihn zum Beispiel
ans Ende setzen. Dies ist jedoch nur ein Beispiel dafür wie Sie es optional machen können. Non wäre in diesem Fall das optionale
Feld. Wenn es nicht verpflichtend ist, können Sie
andernfalls hier
eine Bewertung auswählen. Auch dies spiegelt sich nur darin wider, dass
Sie den Artikel auswählen, der kein
Artikel aus der Liste ist. Für dieses Spiel gibt es keine Bewertung In diesem Fall ist es optional. Jetzt die Aufzählungen. Aufzählungen haben noch viel mehr
zu bieten, und Sie können
viel mehr mit ihnen machen Hier gibt es eine statische Klasse
namens enum.
Sie können verschiedene Methoden verwenden, um mit Ihren
Aufzählungen umzugehen Sie können den zugrunde liegenden Typ abrufen,
wie die Ganzzahl, über die wir zuvor
gesprochen haben Und du kannst verschiedene Dinge tun. Also haben wir hier nur an der Oberfläche
gekratzt. Aber was ich erwähnen werde,
ist eine Sache, um Ihre Projekte
etwas besser zu organisieren Wenn wir
hier nach rechts kommen und mit der rechten
Maustaste auf unser Projekt klicken, und ich neige dazu, genau hier
einen neuen Ordner hinzuzufügen, und das nenne ich normalerweise Enums In diesem Ordner habe ich alle
meine Aufzählungen abgelegt, damit sie übersichtlicher Auf diese Weise werden Sie
nicht
wirklich verwirrt,
weil sie dieselbe
Dateierweiterung wie eine Klasse haben Sie können
alle Ihre Aufzählungen
in einem Enum-Ordner verstecken alle Ihre Aufzählungen
in einem Enum-Ordner Wenn Sie sich erinnern, als
wir im
Schnittstellen-Tutorial über
Schnittstellen gesprochen haben, dass sie das Schlüsselwort
interface und nicht das Schlüsselwort class haben, dann können Sie auch einen Ordner
für Ihre Schnittstellen erstellen Das ist ziemlich üblich.
Es hält die Dinge einfach
organisiert, weil sie dieselbe Dateierweiterung
haben. Wenn Sie eine sehr
große Anwendung
mit Hunderten von Klassen haben , können
Sie
Ihre Aufzählungen leicht finden , einfach weil sie sich alle in einem
Verzeichnis namens Enums ein nettes Stück Organisation bei der Arbeit mit Schnittstellen.
Und
Aufzählungen sind auch sehr nützlich Aufzählungen Es verhindert Rechtschreibfehler
oder ähnliches. Und es ist sehr nützlich
, wenn Sie
eine begrenzte Liste von Elementen haben , zum Beispiel Vielleicht, wenn du mit Farben
in einem
Kartenspiel arbeitest oder wenn du
Monate des Jahres repräsentierst oder
etwas Ähnliches Denken Sie jedoch daran, dass Aufzählungselemente wie Konstanten nur gelesen
werden können, sodass Sie ihnen
nichts zuweisen können. Betrachten Sie sie
daher als schreibgeschützt, wenn Sie
mit ihnen arbeiten Das sind also Aufzählungen im Geschäft.
78. 19-2. Rekursion und Dateibehandlung (File IO / System.IO): Ich werde jetzt über
ein brandneues Konzept sprechen. Und dieses Konzept wird Rekursion
genannt. Wenn Sie
mit Informatik vertraut sind oder vielleicht schon andere
Programmiersprachen oder sogar Mathematik Vielleicht haben Sie schon einmal von diesem Wort
gehört , aber vielleicht auch nicht. Warum bin ich dann bei Google?
Ich höre dich fragen. Nun, als ich mit meiner
Programmiertätigkeit begann, war
Rekursion etwas
, das mich wirklich verwirrte Haben Sie jemals
den Film Inception gesehen, wo der Typ schläft
und dann in einem Traum ist, aber dann geht er im Traum
schlafen Und spielt irgendwie mit deinem Verstand und du
fragst dich, ob er träumt? In welcher Träumungsebene befindet
er sich oder ist er wieder wach? Weißt du, es ist sehr verwirrend. Und die verschachtelten Träume
in diesem Film haben mich immer an das Konzept der
Rekursion erinnert und Sie werden sehen Aber hoffentlich werde
ich es in diesem Tutorial in
einfache Schritte aufteilen, damit Sie es viel einfacher
verstehen als ich es früher getan habe, als ich mit dem Lernen begann. Und
ich werde dir zeigen warum. Wenn du den
Begriff Rekursion
googelst, bekommst du hier eine Beschreibung. Der Prozess der
Definition eines Problems oder einer Lösung in Form einer
einfacheren Version von sich selbst Sie können zum Beispiel eine Operation
definieren und Ihren Weg nach Hause
finden, als
ob Sie zu Hause wären. Verstehst du, was ich hier meine? Es ist nicht sehr klar, oder? Und je mehr du scrollst, desto verwirrter wirst du. Es ist einfach eines dieser
Dinge, über die man sich irgendwie die Haare rauft und
wenn man sich die Bilder anschaut, naja, die Bilder helfen auch nicht
wirklich. Man macht sich einfach ein Bild
von etwas in
etwas anderem und es wiederholt sich für immer. Lassen Sie mich Ihnen erklären,
was Rekursion ist. Es hilft, sich die
Rekursion in C Sharp in Google anzusehen, und es gibt Ihnen eine
bessere Erklärung was es in
Bezug auf C Sharp ist Rekursion ist ein Konzept
, bei dem sich eine Methode selbst aufruft, und genau das ist es In der Welt von C Sharp definiert
man eine Methode und die
Methode ruft sich dann selbst Nun, warum sollte sich eine Methode selbst aufrufen
wollen? Nun, wenn Sie
innerhalb einer Methode Funktionen haben , um etwas zu tun, dann
möchten Sie diesen Code vielleicht wiederverwenden. Warum nicht? Beim Programmieren dreht sich
alles um die Wiederverwendung von Code. Das spart Zeit, ist
einfacher zu pflegen, und dafür gibt es noch viele andere
Gründe Das werden wir
uns heute ansehen, Rekursion in C Sharp, und wir werden eine
Methode definieren, die sich selbst aufruft Wir sind hier
in Visual Studio. Jetzt möchte ich eine Methode einrichten
, die sich selbst aufruft. Wenn Sie sich andere
Tutorials zur Rekursion ansehen, werden
Sie wahrscheinlich
etwas sehen, bei
dem Sie den Faktor
einer Zahl vier berechnen müssen dem Sie den Faktor
einer Zahl vier berechnen Faktoriell ist eins mal zwei, drei
mal vier Und dann richten Sie
eine Methode ein, um das zu tun. Ich denke, das ist ein ziemlich
schwaches und langweiliges Beispiel. Ich denke, wir können etwas gebrauchen vielleicht können wir es
in der realen Welt anwenden. Ich denke, dafür
ist eine Suchfunktion wirklich gut. Was ich tun möchte, ich möchte dir meine sehr
schlechte Musiksammlung
vorstellen. Hier kannst du sehen,
dass es ziemlich eklektisch ist. Wir haben hier alle
verschiedenen Genres. Ich möchte
einen Suchbegriff angeben und
das könnte ein beliebiger sein, es könnte ein Bandname sein, es könnte der Name eines
Songs sein, irgendwas in der Art. Ich möchte alle Musikdateien zurückgeben , die
diesen Kriterien entsprechen. Also werden wir den
Benutzer nach einem Suchbegriff fragen, der Benutzer wird ihn eingeben. Das Ergebnis werden
die vollständigen Dateipfade all
unserer Musikdateien sein. Jetzt
ist diese Musiksammlung sehr unorganisiert, weshalb wir hier eine
Suchfunktion benötigen Ich habe hier einen Musikordner und darin habe ich einen Ordner mit dem Namen „Noch mehr Musik Ich habe all diese neuen Ordner und dann habe ich
überall Musik. Ich denke, eine Suchfunktion
könnte für dieses Beispiel gut Das Problem, ich brauche
etwas, um die Verzeichnisse
in einem Dateipfad , den ich der Software zur Verfügung stelle. Also wenn ich die Software,
diesen Dateipfad hier, zur Verfügung stelle, brauche
ich ihn, um
die Verzeichnisse zu bekommen. Das zweite, was ich tun
muss, ist, die Software dazu zu bringen, alle Dateien in einem Verzeichnis und nacheinander jede
dieser Dateien zu überprüfen , um zu sehen, ob sie
den Suchkriterien entsprechen. Es muss zwei Aufgaben erledigen. Und warum ist dieses Szenario ein
gutes Beispiel für Rekursion? Wie kann ich eine rekursive
Methode auf dieses Beispiel anwenden? Nun, ich möchte
die Verzeichnisse und
die Dateien für jedes
Verzeichnis hier drin Ich möchte hier
dieselbe Logik anwenden. Ich möchte diese
Verzeichnisse, diese Dateien haben. Und dann möchte ich es in diesen
Verzeichnissen überprüfen. Es gibt mehr Verzeichnisse,
dann bekommst du auch die Dateien. Die Methodenlogik
gilt für so ziemlich jedes
Verzeichnis hier. Ich möchte
die Funktionalität wiederverwenden. Ich möchte es zunächst hier verwenden. Dann möchte ich
in diesen Ordnern stöbern. Graben Sie weiter, bis
es keine mehr gibt, und überprüfen Sie dann die Dateien hier. Rekursion wird ein
sehr gutes Beispiel etwas sein, das wir hier für dieses
spezielle Szenario verwenden können Schauen wir uns an,
wie wir das machen können. Ich bin jetzt hier in
Visual Studio. Was ich tun muss,
ist eine Methode zu erstellen. Und die Methode
wird sich selbst aufrufen. Und die Aufgabe der Methode besteht
im Wesentlichen darin, nach einer Datei zu suchen
, die der Benutzer angibt. Lassen Sie uns das jetzt einrichten. Als erstes
möchte ich
den Benutzer nach einem
Suchbegriff fragen . Lass uns das machen. Dann möchte ich
die Eingabe des Benutzers akzeptieren. Jetzt habe ich den
Suchbegriff vom Benutzer. Ich möchte eine Methode aufrufen. Lassen Sie uns eine Methode einrichten , die tatsächlich
die Suche durchführt. Ich werde
die Methode search aufrufen. Ich finde, das ist ein
ziemlich passender Name. Jetzt muss ich
einige Parameter definieren. Welche Parameter sollte es annehmen? Nun, als Erstes müssen
wir wissen, wo die Musik
auf dem System befindet. Wir brauchen einen Dateipfad. Ich denke, das ist ein ziemlich
guter erster Parameter. Der zweite ist wahrscheinlich
der Suchbegriff. Wir brauchen die Methode, um zu wissen ,
wonach wir eigentlich
suchen. Der letzte, vielleicht
ein Referenzparameter und vielleicht ist das eine
Liste oder ein Array. Dies wird
alle unsere Ergebnisse sammeln. Wenn Sie nach etwas suchen, haben
Sie möglicherweise ein Ergebnis, möglicherweise keine Ergebnisse. Möglicherweise
erhalten Sie aber auch zehn Ergebnisse, z. B. zehn Treffer
für Ihre Suche. Wir können nicht einfach
einen einfachen Typ zurückgeben, wir müssen etwas
wie ein Array oder eine Liste zurückgeben. Ich denke zum Beispiel, dass es ziemlich passend sein wird,
hier
eine Sammlung wie eine Liste zu verwenden . Ich nenne das
Ergebnisse, weil es all unsere Ergebnisse
enthalten wird , die wir bei unserer Suche gefunden haben. Jetzt haben wir den Pfad
, auf dem sich die Musik befindet. Wir haben den Suchbegriff für das,
wonach wir suchen. Jetzt haben wir hier eine Sammlung , in der unsere Ergebnisse
gespeichert werden. Eine Sache, die Sie
sich vielleicht fragen, ist, warum haben wir das nicht
als Rückgabewert? Warum brauchen wir einen Parameter, der ein Referenztyp
ist,
wie hier zum Beispiel? Nun, die Wahrheit ist, dass
es nicht wirklich wichtig ist, ob ich das
als Rückgabetyp festlege. Ich denke, es könnte
dieses Beispiel etwas komplizierter machen. Ich möchte
Ihnen vermitteln, wie Rekursion funktioniert,
bei der eine Methode eine Methode aufruft, die
auch als
rekursive Methode bezeichnet Wenn ich einen Rückgabetyp einrichte, muss ich
den Wert aus
jedem Aufruf an die
Methode in sich selbst zurückgeben jedem Aufruf an die
Methode in sich Ich denke, das könnte
das Beispiel etwas verkomplizieren. Ich werde vorerst einen
Parameter verwenden, wenn ich die Lösung
dann tatsächlich
entwickelt habe, werde
ich ihn einfach auf
einen Rückgabetyp umstellen, damit ich
Ihnen auch dieses Beispiel zeigen kann Das ist der
Grund dafür hier. Es wird nur die Ergebnisse
speichern. Bei der Entwicklung rekursiver
Methoden wie dieser hier ist
es immer gut, zuerst die
Basisfunktionalität zu Und genau dafür ist
es konzipiert,
Rekursion komplett zu ignorieren Dort ruft sich die
Methode selbst auf. Ich möchte
den Pfad verwenden , der uns
gegeben wurde, und
den Suchbegriff verwenden und
sehen, ob wir hier tatsächlich einige Ergebnisse aus
dem Stammordner
erhalten können . Im Moment ignorieren wir
das Durchforsten von Ordnern
und dergleichen Ich möchte diese Dateien hierher
bringen, alle Dateien für
das angegebene Verzeichnis
abrufen und dann nacheinander jede Datei überprüfen, um sicherzustellen, dass sie
unseren Suchbegriff enthält Wenn ja, möchte ich es
der Ergebnisliste hinzufügen , die
wir gerade erstellt haben. Schauen wir uns an, wie
wir
diese Dateien tatsächlich für ein
Verzeichnis abrufen können , und überprüfen wir dann jeden Titel, um
sicherzustellen, dass er
unseren Suchbegriff
in Visual Studio enthält . Wenn wir nun
mit Dateien, Verzeichnissen,
Dateipfaden oder
ähnlichem arbeiten wollen , gibt es tatsächlich einen
Namensraum, den wir verwenden können. Dieser wird uns zur Verfügung gestellt. Wir verwenden das Schlüsselwort using
und geben dann System ein und dann steht O für Input Output. Es ist so ziemlich alles
, was mit Dateien zu tun hat
, die in Textdateien protokolliert werden, aus Dateien lesen, all diese Dinge. Es ist ein wirklich nützlicher
Namespace, den wir verwenden können. Er ist standardmäßig nicht enthalten. Zum Beispiel zuvor in einem
früheren Tutorial, in dem wir die statische Klasse
Mathe verwenden und innerhalb der Mathematik
verschiedene mathematische Funktionen ausführen können. Dies ist
standardmäßig enthalten , da es sich um eine
sehr beliebte Bibliothek handelt. Wenn Sie eine Anwendung erstellen, möchten
Sie vielleicht viele
Dinge tun, die
zum Beispiel mit Mathematik zu tun haben, und auch viele
andere Dinge. Allerdings funktioniert nicht jede
Software , die Sie
erstellen, mit Dateien. diesem Grund müssen wir diese Bibliothek manuell explizit einbeziehen. Das sind nur ein paar
Informationen. Wenn Sie dafür einen anderen
Namespace verwenden möchten, können Sie ihn unten
im System-I-Namespace
hier hinzufügen im System-I-Namespace
hier Es gibt viele
Dinge, die du tun kannst. Du kannst all
diese Sachen hier machen. Viele,
viele Dinge. Es gibt jedoch
einige statische Klassen auf die
Sie vielleicht aufmerksam gemacht
werden möchten. Die erste
ist zum Beispiel Directory, und das
ist eine statische Klasse. diese Weise können wir Verzeichnisse auf
unserem System
erstellen , indem wir
ihm einfach einen Pfad als Parameter geben. Wir können Verzeichnisse löschen. Wir können Dateien in einem
Verzeichnis abrufen, das wir bereitstellen. Wir können viele Dinge
mit Verzeichnissen tun. Dieses Verzeichnis, die statische
Klasse, ist wirklich nützlich. Eine andere ist eine statische
Klasse namens file. Mit file können wir Dateien erstellen. Wenn wir beispielsweise eine Protokolldatei erstellen
möchten, können
wir Dateien löschen. Wir können überprüfen, ob Dateien existieren, wir können geöffnete Dateien verschieben. Es gibt also viele verschiedene
Dinge, die mit Dateien zu tun haben. Die letzte, die sehr nützlich ist, ist die statische Pfadklasse. Path ist wirklich nützlich,
um mit Pfaden zu arbeiten. Wenn wir unseren Dateipfad angeben, können
wir den
Dateinamen aus dem Pfad abrufen. Wir können vielleicht die
Erweiterung einer Datei ermitteln. Wir können tatsächlich mit
einem vollständigen Pfad arbeiten und wir können Pfade
auch miteinander verbinden. Das ist wirklich gut für die
Arbeit mit Verzeichnispfaden. Es gibt drei
statische Klassen, die Sie in Zukunft sehr
nützlich finden werden. Und wir werden
heute einige davon
verwenden , wenn wir unsere
rekursive Funktionssuche entwickeln Hier habe ich bereits erwähnt,
dass wir mit unserer Methode
zunächst
die Dateien im Routenverzeichnis
abrufen wollen die Dateien im Routenverzeichnis
abrufen , nur um sicherzugehen, dass es
tatsächlich funktioniert Wir
wollen
alle Dateien in einem
bestimmten Verzeichnis abrufen alle Dateien in einem
bestimmten Verzeichnis Wir kennen diese Information
, weil dies
der Pfad ist , der an unsere Methode
übergeben wird. Ich möchte alle Dateien
in diesem Verzeichnis hierher bekommen. Dazu verwenden wir die statische Verzeichnisklasse und es gibt eine Methode
namens get files. Get files benötigt
einen Parameter und das ist der Pfad, in
dem sich die Dateien befinden. Die Rückgabe dieser
Methode ist nun ein String-Array. Jetzt enthält dieses Array
die vollständigen Dateipfade für jede
Datei in diesem Verzeichnis. Wenn wir zu
unserem Musikkanal rüber kommen, wird er all
diese Dateien hierher bekommen. Jedes Element im Array wird den vollständigen Dateipfad
enthalten. Der vollständige Pfad auf dem System, das ist das
Ergebnis dieser Methode, Dateien abrufen. Ich werde das in
einer Variablen namens files speichern. Das werden alle
Dateien im angegebenen Verzeichnis sein. Jetzt möchte ich all
diese Dateien hier durchgehen und
überprüfen, ob der Dateiname,
nicht unbedingt der gesamte Pfad,
ist diese Dateien hier durchgehen und
überprüfen, ob der Dateiname, . Wir wollen nur
den Dateinamen überprüfen, um zu überprüfen
, ob der Dateiname unseren Suchbegriff
enthält. Hier brauchen wir eine Schleife. Ich denke, für jede Schleife
könnte das ausreichend sein. In diesem Fall
hat uns Visual Studio hier freundlicherweise Hilfe bei der
automatischen Vervollständigung gegeben Ich nehme es jetzt. In diesen vier Schleifen möchte ich jede Datei nacheinander
überprüfen und überprüfen, ob der Dateiname dieser Datei
unseren Suchbegriff enthält. Wie mache ich das? Nun, wenn ich das überprüfen will,
brauche ich eine Bedingung. Ich weiß, dass ich hier
eine If-Aussage brauche. Nun, welche Bedingung
brauche ich in der Erklärung? Nun, ich muss den
Dateinamen aus diesem Pfad abrufen. Ich will nicht den Laufwerksbuchstaben, ich will nicht die Ordnernamen, ich will nur den Dateinamen,
wenn ich mit Pfad arbeite. Wie ich bereits erwähnt habe, ist
eine statische Klasse namens Path dafür sehr gut geeignet. Es gibt eine Methode namens
get file name without extension, die
den Dateinamen abruft, sagen wir drei. Es gibt auch eine Methode
namens Get-Dateiname. Sie können wählen, welche Sie möchten, je nachdem, ob Benutzer auch nach
Dateierweiterungen suchen
sollen. Ich werde einfach diesen benutzen. Es benötigt einen Parameter und
das ist der Pfad von
diesem hervorgehobenen Code hier. Dadurch wird der
Name der Datei abgerufen, ohne dass die Erweiterung auf
unsere Musik übertragen wird. Es wird diesen
hervorgehobenen Abschnitt genau hier haben, was großartig ist. Das wollen wir in Visual Studio
noch einmal überprüfen. Jetzt weiß ich, dass
das der Dateiname ohne die Erweiterung
und ohne den Pfad ist. Ich möchte versuchen zu sehen,
ob etwas davon
unseren Suchbegriff enthält. In einem früheren Tutorial
habe ich die Arbeit mit Zeichenketten behandelt, habe ich die Arbeit mit Zeichenketten behandelt bei der wir verschiedene
Dinge mit Zeichenketten,
Teilstrings und ähnlichen
Dingen gemacht haben Teilstrings und ähnlichen
Dingen Da es sich hier um eine Zeichenfolge handelt, path get file name ohne die Erweiterung eine Zeichenfolge
zurück Daher wird dies eine Zeichenfolge
darstellen. Wenn ich Kunst
dahinter setze, haben wir all diese verschiedenen Dinge, die
wir mit Saiten machen können. Es gibt hier eine Methode
namens contains. Enthält. Nimmt einen Parameter an, bei dem
es sich entweder um ein Zeichen, eine Zeichenfolge oder tatsächlich um
zahlreiche Parameter handelt. Ein Zeichen und ein
Vergleichstyp. Aber wir wollen hier nur
diese Zeichenkettenüberladung verwenden. Wir wollen überprüfen, ob
es unseren Suchbegriff enthält. Ich denke, das ist ein
ziemlich guter Zustand. Nun, da ist ein kleines Problem drin, das ich
etwas später enthüllen werde, aber vorerst
werde ich es belassen Jetzt überprüfen wir nacheinander,
ob jede Datei unseren
Suchbegriff enthält. Das ist ziemlich gut. Wenn es nun tatsächlich unseren Suchbegriff
enthält, dann wollen wir
diesen Pfad hier,
nämlich Datei, zu unserer
Ergebnisliste hinzufügen . Lass uns das jetzt machen. Dazu verwenden wir die
Methode add. Wir fügen die Datei dort hinzu. Wenn Sie
nichts über Listen wissen, dann habe ich ein
Tutorial dazu gemacht. Ich empfehle dir, das auszuprobieren. Jetzt sieht es so aus, als ob wir etwas ziemlich Gutes
machen. Wir schauen uns alle
Dateien im angegebenen Verzeichnis an. Wenn es den Suchbegriff enthält, fügen
wir ihn hier
der Ergebnisliste hinzu.
Da es sich um einen
Referenztyp
handelt, wird er sich daran erinnern,
was wir hinzugefügt
haben wenn die Ausführung dieser Methode
abgeschlossen ist. Das liegt daran, dass es auf dem Heap
gespeichert ist, es ist ein Referenztyp. Jetzt möchte ich diese Methode
tatsächlich aufrufen. Geben Sie Parameter
dafür an. Lass uns das machen. Jetzt. Der erste Parameter ich benötige, ist der Pfad, in
dem sich die Musik befindet. Holen wir uns das.
Leg das jetzt wieder rein. Das ist das Routenverzeichnis , in dem sich die gesamte Musik befindet. Der nächste Parameter, den wir
eingerichtet haben, ist der Suchbegriff
, den wir aus
der Eingabe des Benutzers übernehmen. Als letztes müssen wir
eine Liste bereitstellen , in der wir unsere Resorts tatsächlich speichern
werden. Ich werde hier in Maine einen
lokalen definieren. Erstelle hier eine neue Liste. Ich habe ihm
keine Kapazität zugewiesen, weil wir nicht wissen, wie viele Resorts
es geben wird. Habe hier gerade eine MT-Liste erstellt. Ich werde
das in die Methode übernehmen. Wenn die Ausführung der Methode
abgeschlossen ist, haben
wir hier unten Zugriff auf diese
Ergebnisse. Das liegt daran, dass
es sich, wie ich bereits erwähnt habe , um einen Referenztyp handelt. Jetzt wollen wir nur noch die Ergebnisse dem Benutzer
anzeigen. Wir könnten dafür vielleicht auch
jeweils eine Vier verwenden. Was ich tun möchte, jedes Mal wir ein Ergebnis in Ergebnissen haben, werde
ich sagen, lassen Sie uns das Ergebnis
einfach ausgeben. Dann könnte ich
eine if-Aussage hinzufügen , die besagt, dass,
wenn es keine Ergebnisse gibt, ich
vielleicht die
Tatsache ausdrucken werde, dass es keine Ergebnisse gibt. Okay, es sieht also
ungefähr so aus. Ich weiß, dass es
in der Softwareentwicklung
elegantere Möglichkeiten gibt , so ziemlich alles zu
erledigen, aber ich versuche, das
so zu schreiben, dass Sie verstehen es leichter zu ist, weil das Gehirn
eben so funktioniert. Vielleicht können wir es am Ende
aufräumen, was optional ist, aber was ich vermitteln möchte, ist das Prinzip der
rekursiven Methoden Wir haben
hier bei der Softwareentwicklung einige Basisfunktionen , wir testen können, nur um
sicherzugehen, dass sie funktioniert, wir müssen die Entwicklung der Software nicht komplett abschließen Ich denke, jetzt ist vielleicht ein
guter Zeitpunkt, um das zu testen, nur um sicherzugehen, dass es funktioniert. Lassen Sie uns die Anwendung jetzt ausführen. Geben Sie nun bitte einen Suchbegriff ein. Versuchen wir zum Beispiel,
nach Aba zu suchen. Warum gehe ich nicht in meine Bewerbung, ich tippe Abba sagt es gibt keine Ergebnisse für
meine Suche. Warum ist das so Lass uns versuchen, das herauszufinden. Ich gehe jetzt zurück zur Software, ich erhalte hier keine
Ergebnisse,
aber ich
füge hier eindeutig ein Ergebnis hinzu. Was ist hier los? Mal sehen, ob wir das
herausfinden können. Lassen Sie uns hier einen
Breakpoint setzen und
die Software ausführen . Geben Sie Ab ein. Was haben wir hier? Es sieht so aus, als würden wir
all unsere Dateien hier haben. Haben wir tatsächlich
diesen Grenzpunkt erreicht , an dem wir
den Mehrwert hinzufügen ? Es sieht
so aus, als ob wir es nicht sind. Also stimmt hier etwas nicht. Wir können den Dateinamen nicht
richtig ermitteln oder hier passiert etwas ganz
anderes. Es sieht so aus, als hätte ich versehentlich den Pfad hierher eingegeben, obwohl
wir eine Datei haben sollten. Im Moment
suchen wir nur nach dem
Dateipfad, in dem sich die Musik befindet, und nicht nach
dem Dateinamen, der sich in der Schleife
befindet. Wenn das Problem dadurch behoben ist,
okay, es
sieht so aus, als ob es funktioniert Wie Sie jetzt sehen können, ist
niemand perfekt. Fehler passieren,
aber wenn Sie sich
meine Tutorials zum Debuggen
und dergleichen ansehen , wissen
Sie auch, wie Sie
Probleme selbst beheben Es sieht also so aus, als ob es funktioniert. Lass uns ganz schnell etwas
anderes versuchen. Ich habe vorhin auf ein Problem
hingewiesen,
und zwar, wenn ich
nach Aber suche, wo es klein geschrieben ist, ich treffe
und es heißt, es gibt keine Ergebnisse Aber wir haben eindeutig
einen Song namens Abba. Was Sie hier sehen können, ist, dass es ein Problem
gibt, bei dem Groß- und Kleinschreibung unterschieden wird. Das liegt daran, dass Aber im
NP Drei in Großbuchstaben geschrieben ist, wir
aber einen Suchbegriff in
Kleinbuchstaben verwenden. Also, wie umgehen wir das? Nun, Datei ist eine Zeichenfolge und
der Suchbegriff ist eine Zeichenfolge. Wenn wir Zeichenketten verwenden, stehen uns viele Dinge zur
Verfügung. Was wir verwenden können, ist diese
Methode, die hier als Lower bezeichnet wird. Was das macht, es wandelt
all das in Kleinbuchstaben um. In ähnlicher Weise können wir
dies für den Suchbegriff tun. Jetzt vergleichen wir all
unsere Suchbegriffe, alle in Kleinbuchstaben, dem Namen der Datei, alles in Kleinbuchstaben. Jetzt sollten wir keine Probleme mehr haben, bei denen Groß- und
Kleinschreibung beachtet wird. Wenn ich die Anwendung
jetzt starte und nach Aber suche, können
Sie sehen,
dass ich jetzt das Ergebnis habe. Jetzt ignorieren wir den Fall.
Das ist ziemlich gut Ich werde noch einmal
suchen und
vielleicht nach dem Buchstaben E suchen , um
sicherzugehen , dass wir
mehrere Ergebnisse erhalten. Wenn ich zurückkomme,
sieht es ziemlich gut aus. Es sieht so aus, als ob wir alle Dateinamen
bekommen , die den Buchstaben enthalten. Das ist ziemlich gut. Ich glaube, wir sind bereit für die Rekursion Wir haben die
Basisfunktionalität in Betrieb. Wir freuen uns, dass es
für das Basisverzeichnis funktioniert. Jetzt können wir Rekursion einführen. Das Problem ist,
wenn Sie die
Rekursion von Anfang an einführen ,
vor allem, wenn Sie sich
nicht auskennen. Wenn Sie
dann einen Fehler haben, kann
dies nur
an Ihrer Kernfunktionalität liegen Es ist wirklich gut, das zum Laufen zu
bringen bevor Sie
die Rekursion einführen Es macht die Dinge viel einfacher. Lassen Sie uns eine
Rekursion in diese Methode einführen. Ich weiß es zu schätzen, dass Sie das vielleicht
nicht beim ersten Mal bekommen, aber machen Sie sich keine Sorgen, Sie
werden es irgendwann bekommen Es gibt ein paar Möglichkeiten, wie wir dieses Problem angehen
können. Was ich tun möchte, ich habe diese Suchmethode
, die die Dateien abruft, was ziemlich gut ist. Aber ich möchte dieser Methode auch
das nächste Verzeichnis
im aktuellen Verzeichnis
geben . Hier
haben wir zum Beispiel unser Musikverzeichnis. Wir
überprüfen bereits die Dateien, aber ich möchte auch alle Verzeichnisse hier haben. Dann möchte
ich in jedem Verzeichnis die
Kernfunktionalität ausführen, nämlich die Dateien abrufen, aber ich möchte trotzdem auch
die Verzeichnisse abrufen. Dann möchte ich hier drinnen
dasselbe tun , die Dateien holen. Gibt es hier irgendwelche
Verzeichnisse? Offensichtlich benötige ich eine
Funktion, um alle Verzeichnisse
im aktuellen
Verzeichnis abzurufen. Lass uns das machen. Das werde ich jetzt hier
aufstellen. Es gibt eine nützliche Sache, die wir tun
können, um Verzeichnisse abzurufen, und das ist die Verwendung der statischen
Verzeichnisklasse. Es gibt eine Methode namens Get Directories und sie benötigt einen Pfad. Welcher Pfad tut das? Es
nimmt unseren Wurzelpfad. Und genau wie zuvor gibt es
ein String-Array zurück und jedes Element in diesem Array ist der vollständige Pfad der Verzeichnisse
in diesem Pfad hier. Also werde ich das
DRs für Verzeichnisse nennen. Und weil wir wissen, dass wir in
jedes Verzeichnis gehen wollen, müssen
wir
auch das durchgehen , ohne an irgendetwas zu
denken. Wir wissen, dass wir
Verzeichnisse brauchen und wir wissen, dass wir
jedes einzelne überprüfen müssen, ohne Gedanken über das
Problem der Rekursion oder des Eingangs oder was auch immer
Sie sagen wollen, machen zu Wir wissen, dass wir diese
Funktionalität jetzt brauchen. Sobald wir diese
Funktionalität eingerichtet haben, müssen
wir herausfinden, wie dieses Problem
tatsächlich lösen können. Was geben wir hier rein? Brauchen wir hier irgendwas? Brauchen wir
hier irgendwas? Und so weiter. Aber jetzt haben wir eine
kleine Vorlage. Schauen wir uns an, wie
wir dieses Problem angehen können. Ich gebe der Methode das
Stammverzeichnis. Was ich
in dieser Situation tun könnte ist alle Verzeichnisse abzurufen. Und mit dem ersten
Verzeichnis gehe ich hinein, dann rufe ich die Methode erneut auf.
Was sie tun wird, ist
genau dasselbe. Es wird alle
Verzeichnisse abrufen und in das erste gehen. Es wird alle Verzeichnisse
in das erste verschieben. Und jetzt sind wir
im letzten Ordner. Es gibt keine Verzeichnisse mehr, also können wir nicht in das erste gehen. Das Letzte, was wir tun
müssen, ist die Dateien zu besorgen. Also, was wir hier machen, wir sorgen dafür, dass die Verzeichnisse immer im ersten laufen, immer im ersten. Bis wir ganz
am Ende angelangt sind, holen
wir uns die Dateien, wir
gehen eines raus, gehen in das nächste, bringen alle Verzeichnisse
in das erste, holen uns alle Verzeichnisse, gehen
in das erste, und so weiter. Das ist es also, was wir hier tun. Wir tauchen bis ganz nach unten, und das ist das Erste,
was wir tun. Wir gehen rein, rein,
rein, bis zur größten
Sackgasse, die es hier gibt. Und dann
suchen wir nach Dateien. Das werden
wir also mit unserer Methode replizieren. Nun, die erste Ausführung
dieser Suchmethode, wir übergeben ihr
den Pfad, der
das Stammverzeichnis
für unsere Musik genau hier ist für unsere Musik genau hier Ich möchte alle Verzeichnisse, wie ich sie gerade
erwähnt habe, im Stammordner abrufen . Das sind all diese hier. Das ist es, was diese
Vierschleife tun. Die erste Iteration
der vier Schleifen wird
dieses Verzeichnis hier sein Jetzt wollen wir tatsächlich in dieses Verzeichnis
gehen. Was wir tun können, wir können
diese Methode an sich selbst weitergeben. Wir können die
Methode von selbst aufrufen. Ich möchte sogar die
Methode aufrufen. Lassen Sie uns das vereinfachen.
Die Ergebnisse werden sich niemals ändern. Wir definieren
keine neuen Ergebnisse, wir
hängen einfach Ergebnisse an wenn wir ein Ergebnis haben,
wenn wir ein Spiel haben Wir initialisieren
und definieren Ergebnisse
hier oben jedes Mal, wenn wir Ergebnisse
weitergeben Wir wollen es einfach
weitergeben. Wenn wir diese
Methode in sich selbst aufrufen, wollen
wir
diesen Wert nur intern übergeben. Der einzige Grund, warum wir das
tun wollen , ist einfach, etwas hinzuzufügen. Wir
müssen hier wirklich nichts Besonderes damit machen. Das Gleiche gilt für
den Suchbegriff. Wir ändern hier nicht den
Suchbegriff, wir fragen
den Benutzer quasi nach einem Suchbegriff. Soweit es uns betrifft, ist
es innerhalb dieser Methode so gut wie
schreibgeschützt. Auch hier geben wir
das nur weiter. Genau wie bei den Ergebnissen ist
das einzige, was sich
hier wirklich unterscheidet , der Pfad innerhalb
unseres ersten Verzeichnisses. Wir wollen eigentlich das Verzeichnis
, in das wir gehen. Es wird
ungefähr so aussehen. Wenn ich das nur ein wenig entferne, wird es so aussehen. Ich weiß nicht, ob Sie
das verstehen können, aber wenn das zum ersten Mal ausgeführt wird, bekommen
wir die Verzeichnisse. Wir durchforsten
diese Verzeichnisse in einer Schleife. Also das erste Verzeichnis, wir rufen diese Methode erneut Jetzt
wird diese Methode mit
dem ersten Verzeichnis
im ursprünglichen Pfad aufgerufen . Sobald es wieder in diesem
Verzeichnis ist, rufen
wir die
Verzeichnisse wieder ab bis wir das
Ende erreichen, das hier ist. Stellen Sie sich vor, das ist der Pfad, der jetzt übergeben
wird, jetzt gibt es keine Verzeichnisse. Das wird
eine Zählung von Null haben. Dies für jede Schleife wird
nicht einmal
ausgeführt, denn wenn dieses Ergebnis keine
Verzeichnisse enthält, wird
dies vollständig übersprungen Wenn dies nun übersprungen wird, ruft sich
diese Methode nicht von selbst auf, da dies das einzige Mal ist, dass sich
die Methode selbst aufruft Was sie dann tun wird,
ist, alle Dateien abzurufen. Dann werden diese
Dateien hierher gebracht und geprüft , ob wir eine Übereinstimmung haben,
und dann endet die Methode. Wenn die Methode beendet ist, kehren
wir zum vorherigen Aufruf zurück, der sich in dieser Schleife befindet. Dann wird sie
sich im
nächsten Verzeichnis, bei der nächsten Iteration
der Schleife, erneut aufrufen sich im
nächsten Verzeichnis, bei der nächsten Iteration
der Schleife, erneut nächsten Iteration
der Schleife Dann ist es fertig und geht
in das nächste Verzeichnis. Hier sucht es nach Verzeichnissen
und Dateien. Funktioniert das? Lassen Sie uns einen Blick darauf werfen, warum
nicht einen Suchbegriff eingeben? Also was ich tun werde, ich werde einen
Suchbegriff für eine Datei wie diese eingeben. Zum Beispiel hallo, hallo. Nun, hallo, hello
befindet sich in diesem
Ordner, in diesem Ordner, und
hello, hello ist nicht im
Basisverzeichnis. nach Hallo suche, weiß
ich mit Sicherheit, dass es ziemlich viele Ordner durchsucht, um diese Datei
zu finden.
Das ist ein geeigneter
Test, den ich verwenden könnte. Lass uns das Programm ausführen. Bitte
geben Sie Ihren Suchbegriff ein. Geben wir hier Hallo ein. Es sieht so aus, als ob es ihn gefunden hat. Sie sehen dieses Ergebnis, bei der
Suche nach Unterverzeichnissen es in zwei Verzeichnissen gefunden und die Datei wurde
schließlich gefunden Hier sieht es so aus, als ob
es tatsächlich funktioniert. Dies ist hier
ein Beispiel für eine rekursive Methode, das ist nur eine Methode,
die sich selbst aufruft Wir stopfen nur Ergebnisse in einen Parameter, der ein
Referenztyp ist, es ist eine Liste Lass uns noch einen Test machen, nur
um sicherzugehen, dass es funktioniert. Ich nehme
die Hello-Datei, die hier drin ist, und füge
sie an ein paar weiteren Stellen ein. Ich werde sie hier ablegen. Ich werde es hier hinstellen. Ich werde es hier reinstellen. Jetzt sollten wir
viel mehr Ergebnisse erzielen. Lassen Sie uns das Programm ausführen und Hallo
eingeben. Und jetzt können Sie sehen,
dass
ich all
diese Instanzen von Hello P Three gefunden habe , es sieht
also so aus, als ob es funktioniert. Das sind also ziemlich gute Neuigkeiten. Nun die Sache beim Schreiben
rekursiver Methoden, Sie brauchen eine Möglichkeit, der Rekursion zu
entkommen Die Rekursion wird nicht aufhören es sei denn, Sie führen so
etwas wie eine Bedingung ein, vielleicht eine Oder vielleicht haben wir in unserem
Fall eine Schleife, die
Verzeichnisse und Dateien durchläuft Wir haben nicht
unendlich viele Verzeichnisse, wir haben nicht unendlich viele Dateien. Irgendwann wird diese
rekursive Methode also aufhören. Es ist jedoch ziemlich einfach, dass sich
eine Methode endlos selbst aufruft, wie in diesem Wenn ich diesen Methodenaufruf selbst mit den gleichen Parametern habe, kann er nicht beendet werden Das ist die Gefahr
der Rekursion. beim Schreiben rekursiver Methoden
immer
sicher, Sie beim Schreiben rekursiver Methoden
immer
sicher, dass Sie
eine Bedingung oder eine
Escape-Klausel haben eine Bedingung oder eine
Escape-Klausel Andernfalls stürzt Ihre Anwendung ab
und Sie
werden eine Menge
unerwartetes Verhalten zeigen. Sie
sehen, wenn ich das Programm starte ,
jetzt gebe , ich einen beliebigen Suchbegriff ein,
Sie können sehen, dass wir
einen Stapelüberlauf haben Es hat
24.000 Mal versucht, sich selbst aufzurufen, bevor es schließlich abgestürzt ist, weil der
Stack den gesamten Speicherbereich voll Seien Sie immer vorsichtig wenn Sie rekursive Methoden schreiben Zu Beginn des
Tutorials sagte ich, oh, wir könnten diese
Sammlung problemlos als Gegenleistung hier haben Wir brauchen es nicht als Parameter. Jetzt habe ich die Rekursion erklärt, das kann diesen Code modifizieren
und das als Rückgabewert haben Stattdessen habe ich hier den
Rückgabewert eingerichtet. Ich definiere das hier oben. Lassen Sie uns diesen Teil entfernen. Lassen Sie uns die Ergebnisse hier
in einer Ergebnisliste speichern, denn das wird unsere Rückkehr hierher
sein. Ich muss diesen Parameter nicht mehr
übergeben, und ich benötige
ihn nicht mehr als Parameter, aber ich muss hier
ein Ergebnis definieren. Lass uns das jetzt machen. Okay,
was ich hier gemacht habe, ich habe
hier ein Return to search hinzugefügt, das ist eine Liste mit einer Zeichenfolge. Ich habe hier die Ergebnisliste
der Zeichenfolge innerhalb
der Methode definiert . Jetzt gibt es ein
paar Dinge zu beachten. Das erste, was ich tun muss, ist das tatsächlich
aus der Methode zurückzugeben. Das werde ich tun. Als Nächstes muss ich jedes Mal dieselbe Methode hier rekursiv
aufrufen Ich muss die Rückgabe auch
jedes Mal speichern , wenn ich sie
rekursiv aufrufe Andernfalls werden wir diese Informationen
verlieren. Wenn wir uns in der
Tiefe unserer Ordnerstruktur befinden, haben
wir einige Dateien gefunden, zum Beispiel hier. Nun, wir müssen diese
aus dem inneren
Aufruf der Methode herausgeben , weil ich hier zum Beispiel
keine Rückgabe speichere. Was ich jedes Mal tun muss, wenn
ich das rekursiv aufrufe, ich muss
die Ergebnisse hier speichern Jetzt denkst du, okay, es
sieht so aus, als ob es funktioniert. Ich habe die Liste definiert.
Jedes Mal, wenn ich mich selbst rekursiv
aufrufe, erinnere
ich mich an diese
Werte und setze sie hier. Jedes Mal, wenn wir eine Übereinstimmung haben, füge
ich sie der Liste hinzu, gebe sie irgendwann zurück und drucke die Ergebnisse
aus Lassen Sie uns einen Blick darauf werfen und sehen, was
passiert. Lasst uns Hallo sagen. Sieht so aus, als hätten wir
ein kleines Problem. Hier ist das Debuggen
sehr nützlich, aber ich kann Ihnen sagen,
was hier vor sich geht Das Problem ist, dass wir einige Dateien
in den inneren Tiefen
unserer rekursiven Aufrufe
gefunden haben , zum Beispiel diese Dateien Das ist jetzt zwei Ordner
tief, das können Sie hier sehen. Was jetzt passiert, ist, dass sie
nicht gespeichert werden, denn wenn das
irgendwann herauskommt, setzen
wir diesen Wert
jedes Mal zurück, wenn wir
diese rekursive Methode aufrufen Und das ist ein kleines Problem. Wir fügen das Zeug hier hinzu, aber wir setzen es auch zurück Es wird im Wesentlichen
an nichts erinnert, aber wir fügen hier tatsächlich
Informationen hinzu Wenn ich einen
Breakpoint einfüge, geben Sie Hallo ein, es gibt hier tatsächlich Dateien, aber das Problem ist, dass sie
tatsächlich zurückgesetzt werden. Wenn ich mir meinen
Locals-Tab hier unten ansehe, kann
ich die
Ergebnisse direkt hier verfolgen. Ich habe bei der
Rückkehr einen Breakpoint gesetzt und eine Fünf erreicht. Jetzt kannst du sehen, dass ich ein
Ergebnis habe, wenn ich hier rauskomme. Jetzt können Sie sehen, dass die Ergebnisse
auf Null zurückgesetzt wurden. Sobald ich hier rauskomme, wird an
nichts mehr erinnert. Was ist hier los. Das Problem ist, naja, es ist ein ziemlich einfaches Problem, aber es ist vielleicht sehr schwer zu verstehen, wenn wir rekursiv
sprechen Was wir
eigentlich tun müssen, ist
die Ergebnisse dieser
Suche zu dieser Liste hinzuzufügen die Ergebnisse dieser
Suche zu dieser Liste Wir können
die Liste nicht einfach durch die
Ergebnisse der Suche ersetzen , sonst
vergessen wir alles, was wir bisher gelernt haben Was wir tun müssen, ist
alles aus den Ergebnissen
der rekursiven Suche hinzuzufügen alles aus den Ergebnissen
der rekursiven Und es gibt eine Methode
namens Add Range. Und was das macht, es fügt unserer Liste
einen oder mehrere Artikel hinzu. Und das ist der
Vorteil der Verwendung einer Liste gegenüber
so etwas wie einem einfachen Array. Diese Methoden
stehen uns zur Verfügung. Schauen wir uns das
jetzt an und sehen, ob das besser
funktioniert. Also starte ich die Anwendung, ich tippe Hallo und jetzt haben wir alle
unsere Ergebnisse. Sie werden nicht mehr
durch unsere rekursive Methode generiert Dies
zu nennen, ist der Grund, warum
es eine Rückkehr hat, es macht die Dinge etwas
komplexer Und deshalb habe ich
das Beispiel zuerst mit einem
Parameter eingeführt . Da dies nicht
jedes Mal zurückgesetzt wird , wenn
wir eine Rückgabe haben, ja, wir definieren die Rückgabe hier und initialisieren sie
in einem neuen Speicherbereich Aber wir müssen daran denken,
unsere Ergebnisse
jedes rekursiven Aufrufs hinzuzufügen ,
jedes Mal, wenn wir unsere
Methode rekursiv aufrufen Nun, ich weiß, dass
das so viel
zu verarbeiten ist , dass es
sehr kompliziert ist Aber ich, ich habe es für dich
in einfachen Worten aufgeschlüsselt. Wenn du dir dieses Tutorial
vielleicht zwei- oder dreimal ansiehst. Und geben Sie vielleicht auch Ihre
eigenen Beispiele an. Irgendwann wirst du es
herausfinden und eines Tages
wird es einfach Klick machen. Ich verspreche dir, das ist Rekursion in C Sharp.
Nicht nur C Sharp Rekursion gibt es in vielen
Programmiersprachen und sogar in Mathematik
und ähnlichen Dingen Ich hoffe, Ihnen hat dieses Tutorial gefallen und danke Ihnen fürs Zuschauen
79. 20-1. Abschließendes Projekt (Top Trumps Simulator): Also das endgültige Projekt. Was ist das endgültige Projekt? Nun, lassen Sie uns einen Blick darauf werfen. Das Abschlussprojekt ist optional, aber ich empfehle
Ihnen dringend,
das gesamte Wissen, das
Sie
bisher gelernt haben, anzuwenden das gesamte Wissen, das
Sie
bisher gelernt haben und es gründlich zu versuchen. Dann
erhalten Sie offiziell den Titel,
den inoffiziellen Titel C
Sharp Computer Programmer oder C Sharp Software Klingt ziemlich gut, nicht wahr? Für das endgültige Projekt werden
wir also ein Top-Trumps-Spiel simulieren Falls Sie mit
Top-Trumps-Spielen nicht vertraut sind, handelt es sich im Grunde genommen um ein Kartenspiel Und das Kartenspiel ist
thematisch nach allem, was Sie wollen,
wirklich nach dem, was Sie kaufen möchten Du kannst zum Beispiel Drachen mit
mystischen Kreaturen
haben ,
wo es
Zauberer und Könige und Drachen
und solche Dinge gibt Zauberer und Könige und Drachen
und solche Dinge Jede Karte hat einen Charakter, dieser heißt
zum Beispiel Drache Und er hat verschiedene Statistiken
wie Stärke, Fertigkeit, Zauberkraft und Angstfaktor. Wenn du jedoch ein
Deck mit Superhelden kaufst, haben
sie möglicherweise
etwas völlig anderes mit unterschiedlichen
Charakternamen Aber im Allgemeinen ist jedes Kartenspiel
thematisch gestaltet. Wenn Sie Ihre
Version davon in C Sharp erstellen, können
Sie ein
beliebiges Thema wählen. Der Himmel ist die Grenze. Nutze
einfach deine Fantasie, wie das Spiel funktioniert. Nun, ich habe eine
vollständige Spezifikation beigefügt , die erklärt, wie
das Spiel funktioniert, aber auch einige Annahmen, die Sie bei der Entwicklung
dieser Lösung treffen
können. Ich werde
dir jetzt eine Demo zeigen, in der
ungefähr erklärt wird, wie es funktioniert. Also hier ist die
Spezifikation genau hier, keine
Sorge, ich habe sie im Textformat aufgenommen
, also beziehen Sie sich ein paar
Mal
darauf, wenn Sie Ihr Projekt planen und wie Sie das Szenario
angehen werden. Ich gebe eine kurze Beschreibung
dessen, was es ist. Ich habe einige Links bereitgestellt, damit Sie
weitere Nachforschungen anstellen können. Nun, das ist ein Spiel für zwei Spieler. Wir gehen davon aus dass nur zwei
Spieler spielen. Und ich habe eine Liste von
Annahmen zusammengestellt, die Sie
bei der Erstellung dieses Projekts treffen können ,
nur um es viel einfacher zu machen. Ich möchte nicht wirklich, dass du Wochen und Wochen
damit verbringst. Du kannst, wenn du willst,
es ist überhaupt kein Problem. Aber ich denke,
wenn Sie
diese Spezifikation verwenden , wissen Sie,
ein paar Stunden am Tag für eine Woche oder so, ist das eine gute Zeit
, um
Ihr aktuelles Wissen zu trainieren und
eine nette Software
zu entwickeln , mit der Sie Ihren Freunden, Ihrer
Familie oder wem auch immer Sie möchten
, zeigen , Ihrer
Familie oder wem auch immer Sie möchten können,
wie Sie damit umgehen können. Ich zeige Ihnen jetzt meine
Lösung, wie ich das Problem
angegangen bin, damit Sie sich ein Bild davon machen
können, wie es funktioniert. Wenn die Software zum ersten Mal ausgeführt
wird, wir einfach davon aus, dass
Spieler eins zuerst spielt Spieler eins kann die Eingabetaste drücken
, um seinen Zug zu beginnen. Jetzt ist Spieler eins an der Reihe. Spieler eins hat fünf Karten und Spieler zwei hat fünf Karten. Sie haben also jeweils fünf Karten. Damit die Karten zum Beispiel
einen Charakter wie einen
Drachen oder einen König darstellen einen Charakter wie einen
Drachen oder einen König , so
etwas Ähnliches. Hier habe ich völlig
zufällige Charaktere. So
gut ist meine Vorstellungskraft, weißt du. Eine zufällig ausgewählte Karte oder ein Charakter aus
meiner Hand wird gespielt, und das ist der Teddybär Jetzt hat der
Teddybär eine Größe, ein Gewicht, eine magische Kraft
und einen Angstfaktor Weil es ein Teddy ist, ist
er ziemlich klein, nicht sehr schwer, er hat keine magischen Fähigkeiten
und keinen Angstfaktor Also ist es eigentlich
eine sehr schlechte Karte. Die Idee ist, dass ich hier den höchsten Wert
wählen möchte, und ich hoffe, dass mein Gegner einen Wert
hat, der niedriger
ist als meiner. Wenn ich also Höhe wähle, sagen wir 1 Meter 45. Also wähle ich hier einfach die Nummer
eins. Ich drücke Enter. Dann
verteidigt der Spieler,
der andere Spieler , mit Harry
Houdini, der ein Zauberer ist Aber er hat eine Größe von 5,7, der Teddybär ist also nicht Der Teddybär verliert also, weil der Teddybär Aber Harry Houdini ist 57.
Spieler zwei gewinnt Aber weil Spieler zu eins, Spieler zwei die
Teddybär-Karte nimmt, behält
Spieler zwei seine
Harry-Houdini-Karte Und jetzt ist Spieler
zwei an der Reihe. Wenn ich also Anton treffe, kannst du
jetzt sehen, dass
Spieler zwei jetzt
sechs Karten hat , weil er den Teddybären
gewonnen Jetzt ist Spieler zwei an der Reihe. Der zufällig ausgewählte
Charakter ist Picchu. Jetzt hat Picchu eine ziemlich gute
Zauberkraft, ist aber ziemlich kurz. Und es ist auch sehr leicht. Und es gibt nicht
viel Angst. Deshalb möchte ich Magic Power spielen weil sie ziemlich hoch ist und ich hoffe, dass ich die Verteidigungskarte des jetzigen
Spielers schlagen kann. Schauen wir uns das mal an. Der andere Spieler verteidigt
mit Darth Veda. Aber ich entschied mich für magische
Kräfte, die 75 waren. Darth Veda hat jedoch nur eine magische Fähigkeit von zwei. Also habe ich gewonnen Ich habe wieder gewonnen. Jetzt
, da ich wieder gewonnen habe, ich immer noch
dran. Also ist immer noch Spieler zwei dran. Jetzt kannst du sehen, dass ich sieben Karten
habe. Der Gewinner des Spiels ist die Person, die in diesem Beispiel alle zehn
Karten hat, weil es nur zehn Karten gibt. Wenn du 20 Karten erstellst, dann hat
der Gewinner natürlich alle 20 Karten. Nun, hier gibt es eine
Menge Annahmen. Sie können sehen, dass ich
zufällig Charaktere aus
dem Deck auswähle, das
der Spieler hat. Wenn du dieses Spiel jedoch persönlich
spielst, nimmst du den, der sich
oben auf dem Deck befindet. Also, ich verwende viele
Annahmen, nur um die
Lebensdauer dieses Projekts zu verkürzen Also, ich will nicht, ich will nicht
wirklich, dass du 34 Monate
daran arbeitest und dir die Haare
raufst Ich glaube nicht, dass
das ein
lustiges erstes und letztes
Projekt für dich sein wird . Es gibt also eine
Menge Annahmen, weißt
du, es ist nicht
wirklich verpflichtend. Füge deinen eigenen Twist hinzu.
Fügen Sie Ihren eigenen Geschmack hinzu. Es liegt wirklich an
dir, natürlich, ich habe gerade Picature gespielt und Piccature
wurde Sie wissen also, es ist keine
perfekte Anwendung,
also machen Sie sich keine Sorgen, dass
sie Es geht nur darum, dein
Wissen und solche Dinge zu trainieren. Es macht also einfach ein bisschen
Spaß und ich denke, du wirst hier eine gute
Zeit damit haben. Wir haben den Mini-Teufel, wir sind Angstfaktor vier. Wir haben es ziemlich gut.
Wir haben neun Karten jetzt haben wir die magische Kraft von Harry
Houdini Und es sieht so aus, als hätten
wir das Spiel gewonnen. Spieler zwei hat alle zehn Karten komplett zerstört, Spieler eins. Wollen wir
wieder spielen? Ja oder nein? Wenn ich Nein drücke,
danke fürs Spielen. Drücken Sie die Eingabetaste, um den Vorgang zu beenden. Das ist das endgültige Projekt. Auch hier ist es nicht die Lösung, es ist nur eine Lösung. Sie können mit den
Charakteren machen , was Sie
wollen, aber versuchen Sie, viele
der Dinge anzuwenden , die wir im Kurs
behandelt haben. Also hier habe ich, auf der rechten Seite hier, vier
benutzerdefinierte Klassen erstellt. Hier habe ich sie in
ein separates Projekt aufgenommen. Und wenn ich die Hauptmethode
hier in der Programmklasse öffne , können
Sie sehen, dass hier nicht
wirklich viel Code enthalten ist. Das liegt daran, dass wir es in,
Sie wissen schon, logische Container
aufgeteilt haben . Ich habe eine
Gamecontroller-Klasse, die um alles
kümmert, was mit dem Spiel zu tun , mit
den Runden und
so. Ich habe jetzt eine Spielerklasse, die Spieler, sie
modelliert die Spieler. Und ein Spieler hat eine Reihe
von Charakteren oder Karten in der Hand. Und die Charakter
- oder Kartenklasse ist für alle
Charaktere im Spiel
verantwortlich. So kannst du sehen, wie wir das Wissen
nutzen, das
wir angewendet haben. Wo wir einen Kurs besuchen
und dieser Kurs ist für alles
verantwortlich, was mit dem
zu tun hat, was er heißt. Die Charakterklasse
befasst sich also mit Charakteren, der Gamecontroller
damit, wie das Spiel funktioniert usw. So funktioniert es also wirklich. Wir nehmen all
das Wissen, das wir gesammelt haben und wenden es jetzt an. Das ist also im Grunde meine Lösung
für das endgültige Projekt. Du weißt schon, Planet Planet. Benutze ein paar Notizblöcke.
Benutze etwas Papier Benutze einen Stift. Denken Sie gut darüber
nach, wie Sie das Problem angehen werden, wie Sie das Problem
organisieren und welche Techniken
Sie verwenden werden, welche Schleifen, Bedingungen
und ähnliches. Ich wünsche dir viel Spaß damit. Das Abschlussprojekt testet
Ihr Wissen über viele Konzepte der Dinge, die
wir bisher behandelt haben. Also Klassen, Objekte,
Instanziierung,
If-Anweisungen, Switch-Anweisungen,
Bedingungen, boolesche Vier Schleifen, Drahtschleifen,
viele verschiedene Schleifen, Methoden und Methoden Es ist also eine großartige
Möglichkeit, all dieses Wissen auf eine einzige
Software anzuwenden. Wie lange wird das
endgültige Projekt dauern? Nun, wenn dir das Programmieren Spaß macht und du Programmierer werden willst, dann sollte das überhaupt kein Problem
sein, denn Übung ist
immer eine gute Sache Wenn Sie zu Beginn dieses Kurses noch ein absoluter Anfänger
waren, dann verbringen Sie vielleicht eine Woche lang jeden
Tag ein
paar Stunden oder so Wie jede andere Sprache,
Französisch, Deutsch, Spanisch. Sie werden nicht
alle Informationen
in einem Durchgang aufnehmen . Es ist einfach nicht realistisch. Verwenden Sie die Kursmaterialien jedoch
als Referenz für
das endgültige Projekt. Wenn Sie
Ihr Abschlussprojekt entwickeln und sich nicht erinnern können,
wie man
zum Beispiel eine Drahtschleife macht, dann schauen Sie sich
das Wire-Loop-Tutorial
einfach noch einmal an, um eine Auffrischung zu erhalten Sogar professionelle
Computerprogrammierer verwenden Google und verschiedene andere
Websites als Bezugspunkt, und manchmal tun sie Beim täglichen Programmieren geht es
darum, um
die Ecke zu denken und laterales und
logisches Denken
anzuwenden Es geht nicht darum, sich die
Syntax zu merken und die Syntax zu wiederholen, also lassen Sie sich davon überhaupt nicht
abschrecken Ich habe also meine Lösung
für das endgültige Projekt beigefügt, aber ich empfehle
Ihnen dringend, diese einfach nicht Schau es dir nicht an, bis
du deins fertig hast. Dann kannst du es
als Bezugspunkt verwenden um vielleicht, vielleicht, deinen zu verbessern. Oder schauen Sie sich die Unterschiede zwischen meiner
und Ihrer Lösung an. Denken Sie daran, dass es nicht die eine
Lösung für ein Problem gibt. Es kann mehrere Lösungen und alle sind richtig. Verwenden Sie es jedoch nur
als Bezugspunkt , wenn Sie
Ihr letztes Projekt abgeschlossen haben. Schicken Sie es an Ihre Freunde.
Schick es an deine Familie. Laden Sie es zum
Beispiel auf Youtube hoch. Und schick mir den Link. Ich würde mich freuen, Ihre
Abschlussprojekte zu sehen und zu sehen, wie Sie diese
Spezifikation
interpretiert und ihr Ihre eigene Note
gegeben haben. Das Letzte, was ich sagen möchte, ist, viel
Glück mit dem
endgültigen Projekt und viel
Glück für Ihre zukünftigen
Programmierbemühungen Abschließend danke ich Ihnen. Vielen Dank, dass Sie
sich Take Care angesehen haben.
80. 20-2. Kurszusammenfassung (Wo gehe ich von hier aus?): Jetzt
müssen alle guten Dinge ein Ende haben. Aber wenn du es bis hierher geschafft hast, dann danke fürs Zuschauen. Wenn Sie Fragen,
Probleme, Kritikpunkte oder Fragen zu
den Inhalten des gesamten Kurses haben, hinterlassen
Sie bitte eine Nachricht
zum Inhalt selbst oder
senden Sie mir eine Nachricht Gerne
helfe ich Ihnen auch bei
der Überprüfung der zugehörigen
Projektdateien, falls Sie dies noch nicht getan haben den meisten Lektionen in diesem
Kurs gehören
Projektdateien. Sie können diese
gerne erweitern, aus ihnen
lernen, aber auch Ihren eigenen Twist
hinzufügen. Die Grenze liegt in Ihrer Vorstellungskraft. Die große Frage, die sich viele Menschen nach
Abschluss eines Kurses
normalerweise stellen,
ist Wie gehe ich von hier aus weiter? Nun, ich werde
dich nicht hängen lassen. Viele Leute tun das, aber ich
werde dir ein paar Ideen geben. Es hängt davon ab, was
Ihre Ziele sind. Was sind deine Ziele? Diese sind einzigartig für dich, sie sind
persönlich für dich. Vielleicht
suchen Sie zum Beispiel eine Anstellung. Sie möchten bei
jemandem angestellt werden . Oder vielleicht ist es ein Hobby. Vielleicht möchten Sie
eine Telefonanwendung erstellen , um Geld zu verdienen. Oder vielleicht möchtest du Videospiele in
Unity
machen oder einfach nur
eine neue Herausforderung ausprobieren. Etwas völlig Neues.
Es kommt also darauf an. Aber das Geheimnis und die
Gemeinsamkeit all
dieser Dinge ist Übung,
Praxis, Praxis. Sharp C ist
einer echten gesprochenen Sprache wie beispielsweise
Französisch, Deutsch oder
Portugiesisch nicht allzu
unähnlich einer echten gesprochenen Sprache wie beispielsweise Französisch, Deutsch oder
Portugiesisch Je öfter du es benutzt, desto besser wirst du werden Es ist nur natürlich.
Und ebenso gilt Je weniger Sie es benutzen, desto mehr werden Sie vergessen. In Ihrer Freizeit empfehle
ich daher,
kleine
Softwareanwendungen zu erstellen , um
Ihre alltäglichen Probleme zu lösen und
Ihnen das Leben zu erleichtern. Nicht nur das, es
macht auch Spaß. Ich habe viele verschiedene Softwarekomponenten entwickelt,
nur um mir das Leben zu erleichtern. Ich habe zum Beispiel
einen Musik-Renamer gemacht , wenn ich iTunes
habe Manchmal wird der Dateiname
nicht akzeptiert, sondern es wird zum Beispiel ein verstecktes Tag in
MP Three verwendet Also habe ich eine Software entwickelt,
um dieses Tag in
den MP Three einzufügen , sodass mein iTunes wirklich gut aussieht
und alles automatisiert ist Ich muss nicht, weißt du, jeden einzelnen Song
umbenennen, um
ihm den richtigen
Künstler oder Titel zu geben Dies ist zum Beispiel mit
vielen der Tools
und Techniken, die
wir in diesem Kurs behandelt haben,
sehr einfach vielen der Tools
und Techniken, die zu bewerkstelligen. Wenn zum Beispiel kostenlose Artikel auf Craigslist auftauchen
oder ähnliches, kann
ich einen Musiksound abspielen Jedes Mal, wenn jemand
etwas umsonst verschenkt, fängt
mein Laptop an, Musik Und dann weiß ich, dass etwas
Neues im kostenlosen Bereich ist und ich kann sofort den Käufer
kontaktieren und, Sie wissen schon, die
Abholung arrangieren. Weißt du, die Grenze
ist deine Vorstellungskraft. Und zu guter Letzt habe ich
einen YouTube-Bulk-Uploader erstellt. Was passiert, ist, wenn du
vielleicht zehn oder 50 Videos
hast, die du auf Youtube hochladen willst, aber du willst nicht
alle Titel und Beschreibungen
und solche Dinge eintippen alle Titel und Beschreibungen
und solche Dinge Also habe ich eine Anwendung erstellt, mit der ich
zum Beispiel 50 Videos aufnehmen und
sie per Drag & Drop
in die Software ziehen kann . Und es füllt den
Videotitel und die Beschreibung und sogar die Tags aus dem
Namen der Videodatei Und das spart so viele Stunden. Und das ist jetzt tatsächlich eine kommerzielle
Software. Es übt also nicht nur
meine Programmierkenntnisse, sondern verdient auch nebenbei
Geld Es gibt also eine Menge Ideen
, die Sie, wissen Sie, übernehmen und für
Ihre eigenen spezifischen Szenarien anwenden Eine weitere Sache,
die Sie tun können und die wirklich, wirklich gut
ist, ist, Online-Codierungstests zu machen, wie kleine Programmierherausforderungen. Es gibt also zum Beispiel
zwei Websites, die Sie verwenden können. Eine heißt Hacker Rank und eine andere
heißt Lite Code. Die zeige ich dir jetzt. Jetzt hat jeder von ihnen viele verschiedene Programmierherausforderungen, genau wie ich
das endgültige Projekt mit
dem Top-Trump-Simulator vorgestellt habe . Aber normalerweise sind
sie viel einfacher. Zeichnen Sie zum Beispiel eine Pyramide, was wir
in diesem Kurs behandelt haben, oder zeichnen Sie ein Quadrat oder finden Sie die
Königin, solche Dinge. Also schnelle Herausforderungen, die dein Querdenken
, also unkonventionelles Denken
, auf die
Probe stellen. Sie testen also nicht nur Ihr
Wissen über C Sharp und vielleicht Ihr Gedächtnis der
Syntax, sondern, was noch wichtiger ist, Ihre Anwendung eines Sharp Wenn Sie
mit einem Problem konfrontiert werden, wird getestet, wie Ihr Gehirn funktioniert, wie Sie das
Problem verstehen und eine Lösung finden. In der Regel sind diese Herausforderungen sehr einzigartig und sehr spezifisch. Sie können sie zum Beispiel nicht wirklich googeln und eine Lösung
finden. Wenn Sie diese
Programmieraufgaben also
viel üben und Ihre
Fähigkeit, sie zu lösen, unter Ihr Querdenken
verbessern, dann wird Sie das für
potenzielle Arbeitgeber sehr
attraktiv machen . Arbeitgeber
suchen nicht nach Leuten, die und
sich die Syntax
merken können Sie suchen nach Menschen und
fördern Querdenken. Und dafür sind diese
Online-Codierungstests perfekt. Nicht nur das, diese beiden
Websites, die ich vorgeschlagen habe, sie verfolgen auch, welche Übungen
Sie bereits gelöst haben. Und sie erstellen ein Profil
wie eine kleine Bestenliste. Sie wissen, welche
Sie gelöst haben. Und ich sehe kein
Problem darin,
das auszudrucken oder an einen potenziellen Arbeitgeber
zu schicken. Dann können sie tatsächlich sehen,
welche Herausforderungen Sie gemeistert haben. Und sie können sehen, dass
es nicht nur eine Karriere ist, die Sie vielleicht anstreben, oder ein Job, der Ihnen
Spaß macht. Und das ist es, wonach
sie suchen und das ist es, was
dich von anderen Menschen unterscheidet. Und wieder geht es nicht nur
darum, einen Job zu bekommen. Selbst Bastler lieben
diese Programmierherausforderungen. Weißt du, es
funktioniert wirklich mit deinem Gehirn. Es ist eine wirklich gute
Trainingsübung für Ihren Geist, daher kann ich
Online-Codierungstests nur empfehlen. Eine weitere Sache, die Sie tun können, ist Beispielfragen für
Vorstellungsgespräche zu
üben, auch wenn Sie nicht vorhaben, eine Anstellung
zu finden. Weil sie Ihr
Wissen wirklich auf
die Probe stellen und Sie in Verlegenheit bringen, wenn Sie diesen
Kurs
zum Beispiel von Ihrem Laptop nehmen , sagen wir, Sie decken ihn mit Ihrer Hand oder einem Buch ab und fragen sich
dann,
was Polymorphismus ist? Kannst du diese
Frage beantworten, ohne dir
diesen Kurs anzusehen oder ihn zum Beispiel zu googeln?
Ist das möglich? Was wäre, wenn ich dich fragen würde, was
Methodenüberladung ist oder was ich meine, wenn ich abstrakt
oder abstrakte Klasse sage Und was ist Kapselung und wie unterscheidet sie sich von,
Sie wissen schon, Kannst du
diese Fragen ehrlich beantworten? So testest du dich also
wirklich selbst, ob du
die Prinzipien verstehst. Es ist leicht,
jemand anderem zuzusehen , wie er über
etwas spricht und dann sagt, oh, okay, ja, ich verstehe es. Aber wenn du das Material
mit deiner Hand verdeckst und
es vor deinem Blick verbirgst, kannst du dann ehrlich sagen, okay, Polymorphismus ist das Es ist also eine Sache, etwas zu
lesen und es
zu verstehen, aber es ist eine andere Sache,
es mit eigenen Worten zu rezitieren es mit eigenen Worten Und das ist
nicht nur wichtig, um einen Job zu bekommen,
sondern auch, um wirklich
alles zu verstehen , was
in diesem Kurs behandelt Ich kann es daher nur empfehlen
, dies ebenfalls zu tun. Also das Letzte, was
ich
in Bezug auf das, was ich als Nächstes tun
soll, erwähnen , warum Sie diesen Kurs besucht haben. Einige Leute haben
diesen Kurs vielleicht besucht, um zu etwas
anderem überzugehen. Vielleicht wolltest du
Spieleentwicklung in Unity machen. Vielleicht wolltest du Websites
entwickeln, also musstest du das Scharfe kennen. Dann können Sie zum Beispiel das
Spot-Net lernen. Oder vielleicht
möchten Sie Formulare für
eine Desktop-Anwendung oder
eine mobile Anwendung erstellen . Sie können Sharp auf
all diese Szenarien anwenden, aber sie erfordern mehr
Wissen, um die Rolle
oder das, was Sie tun möchten,
erfolgreich zu erfüllen. Aber was das Wissen, das
Verständnis und die
Praxis von Sharp angeht , wird
dieser Kurs für diese Anwendungen sehr
nützlich sein. Ich kann Ihnen zu 100% sagen, dass Sie,
wenn Sie anfangen wollen, Spiele in Unity zu
entwickeln, feststellen werden, dass Sie so ziemlich
alles C-Sharp
kennen werden . Sie müssen wissen oder
zumindest wissen, wie Sie nach neuen Methoden
und Klassen suchen und recherchieren können, die Sie verwenden möchten. Jegliches Wissen, das
für die Entwicklung von Videospielen in Unity erforderlich ist,
hängt
zum Beispiel davon ab, die Unity-Engine zu verstehen und zu erlernen , was ganz anders
ist. Aber was C Sharp angeht, sind
Sie bei der
Erstellung mobiler Anwendungen wieder abgesichert. C Sharp wurde bereits behandelt Vielleicht müssen Sie nur
ein paar grafische oder spezielle Dinge lernen , mit mobilen Anwendungen
zu tun haben. Also noch einmal, dieser
Se-Shop-Kurs ist ein perfekter Ausgangspunkt für alles,
was Sie erreichen möchten Was auch immer Ihr Endziel sein mag. Das Letzte, was
ich sagen werde, ist noch einmal, vielen
Dank fürs Zuschauen. Vergessen Sie nicht, mir
Ihre Abschlussprojekte mitzuteilen mir
Ihre Abschlussprojekte mitzuteilen wenn Sie diese durchführen möchten. Wenn Sie Fragen haben, senden Sie mir eine Nachricht
und hinterlassen Sie einen Kommentar. Und lass mich einfach wissen, wie
der Kurs für dich war. Und vielleicht können Sie mir in fünf
bis zehn Jahren wenn Sie ein professioneller
Softwareentwickler sind, ,
wenn Sie ein professioneller
Softwareentwickler sind,
eine Nachricht schicken
und mir einfach mitteilen,
wie es Ihnen geht, und mir sagen, ob
Ihnen
dieser Kurs
auf lange Sicht geholfen hat. Ich werde weitere Kurse erstellen, also schauen Sie
sich diese gerne zum letzten Mal an. Vielen Dank, dass Sie
sich Take Care angesehen haben.