ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
815
815
EMPFEHLEN
-
26.11.11 19:27 #1
- Registriert seit
- Nov 2011
- Beiträge
- 5
Hallo!
Also ich bin sehr neu in C# (seit 2 wochen
) aber ich bin sehr intensiv dabei und komme gut voran, da ich vorher auch schon Erfahrungen mit einigen anderen Programmiersprachen hatte. Jetzt bin ich grade beim Thema OOP und da sind für mich einige Sachen in Bezug auf Objekte noch etwas unklar.. Nehmen wir einfach folgendes kleines Codebeispiel:
Code :1 2 3
string zeichenKette = "beliebiger text"; zeichenKette = zeichenKette.ToUpper(); Console.WriteLine(zeichenKette);
1.) Wie ich das verstanden habe ist ja der Datentyp string auch nichts weiter als eine Klasse. Alle Variablen dieses Datentyps sind ja demnach Objekte dieser Klasse. Jetzt frage ich nur, wie dieses Objekt in der Lage ist, einen bestimmten Wert anzunehmen, in diesem Falle eben eine Zeichenkette. Wie kann man so eine Klasse programmieren? Oder nach welchem Prinzip kann man so eine Klasse programmieren? Muss nicht beim Initialisieren von Objekten immer ein Konstruktor benutzt werden? Ist das Programmieren von so einer Klasse überhaupt so ohne weiteres möglich?
2.) Mit der Funktion ToUpper() kann ja eine Zeichenkette in Großbuchstaben konvertiert werden. Jetzt frage ich mich: Wie kann die Methode ToUpper() auf den Wert des entsprechenden Objektes zurückgreifen? (in diesem Fall auf die Zeichenkette "beliebiger text"). Mit this?
3.) Normalerweise hätte ich gedacht, dass in Zeile 2 der Ausdruck zeichenKette.ToUpper(); genug sei. Wie ich aber feststellen musste, zeigte das keine Wirkung. Stattdessen musste ich nocheinmal die Zuweisung vornehmen: zeichenKette = zeichenKette.ToUpper(); .Warum ist das so? Ich dachte bei Objekten reicht ein einmaliger einfacher Aufruf der Methoden...
Ja, das wärs erstmal..
Bin für alle Antworten und Hilfen dankbar
MFG _The_Beginner_
-
26.11.11 19:39 #2
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.519
Ich versuch es mal:
1. Klassen beinhalten neben Funktionen (Methoden) auch Eigenschaften. Die Zeichenkette ist also eine Eigenschaft deines Objektes "zeichenKette" vom Typ String. Eigenschaften sind manchmal öffentlich (public), manchmal geschützt (protected = Nur von der Klasse selbst oder abgeleiteten Klassen ansprechbar) oder privat (private = nur von der Klasse aus ansprechbar).
Bei deinem Beispiel ist kein expliziter Konstruktor notwendig, da die Klasse String einen Operator = implementiert, das entspricht dem Vorgehen
- Allokiere Speicher für eine "Variable" (Objekt) vom Typ String
- Initialisiere das Objekt
- Weise einer privaten Eigenschaft einen Wert zu
2. Wie schon in 1. erwähnt handelt es sich um eine private Eigenschaft, auf die das Objekt natürlich beliebig zugreifen kann. Die Methode verwendet also die private Eigenschaft und arbeitet mit dem darin liegenden Wert.
3. toUpper() ist in diesem Fall keine Methode, die den Wert der privaten Eigenschaft verändert sondern arbeitet wie eine Funktion, in dem der veränderte Wert mittels "return" zurück gegeben wird.Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
Hi
zu 1: Ja, normal müsste das ein Konstruktor hin.
String ist ein (einzelner) Sonderfall.
Kein prozessormäßiger Typ wie int, aber auch nicht wirklich eine Klasse...
String funktioniert deshalb so, wie er ist,
weil er vom Compiler/CLR eine Sonderbehandlung erhält.
So wirklich nachprogrammieren kann man das nicht, jedenfalls nicht komplett gleich
(ohne Eingriffe in die CLR zu machen)...
zu 2:
Wäre string eine normale Klasse, hätte er zB. in der Klasse eine Variable wert,
die mit = gefüllt wird. Jede string-Variable hat dann ihr eigenes wert in sich drin.
toUpper kann dann einfach mit "wert" darauf zugreifen, wie auf eine ganz normale Variable.
"this.wert" wäre auch erlaubt.
zu 3: Theoretisch hast du recht, ein Aufruf von toUpper würde reichen.
toUpper ist aber absichtlich so gemacht, dass es einen neuen String erzeugt,
diesen mit dem großgeschriebenen Originalstring füllt und dann mit return zurückgibt.
edit: Heute immer zu langsam
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
26.11.11 20:02 #4
- Registriert seit
- Nov 2011
- Beiträge
- 5
Danke für eure Antworten! Also 3. hab ich jetzt schon gut verstanden, aber nochmal zu 1 und 2: Ist jetzt in der Klasse "string" tatsächlich eine Eigenschaft vorhanden die eben dann den Wert speichert und für die Methoden (zB. ToUpper()) so abrufbar ist oder ist String einfach ein Sonderfall und ist eben dann nur durch die CLR realisierbar?
PS: Wie könnte eigentlich die Klasse String eine String-Eigenschaft haben?
Oder wäre das dann keine normale String-Eigenschaft mehr sondern ein spezieller, C#-unabhängiger Datentyp von der CLR?
-
26.11.11 20:11 #5
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.519
Upps, ich bin von String (also der Klasse) ausgegangen, nicht von string, dem primitiven Typen.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
26.11.11 20:16 #6
- Registriert seit
- Nov 2011
- Beiträge
- 5
Aber der Typ string repräsentiert doch nur die Klasse System.String, also ist sozusagen nur ein Alias für System.String oder? Oder hab ich da was vollkommen falsch verstanden?
-
"string" ist in Wirklichkeit ein Array aus char (also aus einzelnen Zeichen).
So ist das Speichern von Sätzen etc. auch in der Sprache C realisiert,
in der die gesamte C#-CLR basiert.
Eigentlich spricht ja nichts dagegen, das so auch in C# zu machen (eben ein Array aus char),
aber so eine "Klasse", die ToUpper und viele andere Funktionen anbietet, ist doch angenehmer für den Programmierer...
Dass String eine Klasse ist, wird also nur durch die CLR vorgetäuscht. Nur bei String.
Auf der Ebene könnte man zwar auch eine Klasse machen, die in sich ein char-Array hat
und toUpper etc.anbietet, aber in Wirklichkeit ist es nur das char-Array selber.
Und die Sache mit ="..." ohne Konstruktor macht die Sonderbehandlung vom Compiler.
edit: Prinzipiell sind die Sachen das Gleiche, string tut nur so, als wäre es keine Klasse.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
26.11.11 20:47 #8
- Registriert seit
- Nov 2011
- Beiträge
- 5
Aber wenn string also in Wirklichkeit gar keine Klasse ist sondern nur ein char array, sind dann die string-Funktionen wie zum Beispiel ToUpper() also in der char Klasse definiert?
sry dass ich jetzt so nervig nachfrage aber ich bin jemand, der irgendwie nie zufrieden ist wenn es noch etwas gibt, dass er nicht verstanden hat
-
ToUpper etc. werden dazugetäuscht.
Alles Sonderbehandlung.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
26.11.11 20:57 #10
- Registriert seit
- Nov 2011
- Beiträge
- 5
Ok danke!
-
26.11.11 21:04 #11
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.519
Du hast Recht, string ist ein Alias für String.
Vielleicht hilft es dir, wenn man es visualisiert, was die CLR macht:
Code c#:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class String { // Private Eigenschaft um den Wert zu speichern private System.Char[] value; public String(System.Char[] val) { this.value = val; } public String toUpper() { String a = new String(""); for(int i = 0; i < value.length; i++) a += hier_eine_funktion_die_das_Zeichen_prueft_und_ggf_in_Grossbuchstaben_wandelt(this.value[i]); return a; } Hier_eine_Methode_die_den_Operator_ist_gleich_als_Zuweisung_implementiert.... }
Das ganze wird von der Runtime "simuliert". Der Grund, warum die Methoden alle wiederum Strings zurück geben, basiert darauf, das ein einmal erstelltes String-Objekt nicht mehr verändert werden kann. Zumindest, wenn man der MSDN an diesem Punkt glauben schenken darf.
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
Ja, das ist so.
Werte in einem char-Array ändern wäre zwar kein Problem,
aber bei string ist alles darauf ausgelegt,
dass er einmal befüllt und dann nie wieder geändert wird.
Wenn man ihn ändern will, bekommt man in Wirklichkeit
einen neuen string mit einem neuen char-Array.
Der Alte wird dann vom Garbage Collector entsorgt.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Fragen über Fragen zu After Effekts. Brauche Hilfe
Von Tobsemeini im Forum Videoschnitt, Videotechnik & -produktionAntworten: 3Letzter Beitrag: 23.01.09, 16:17 -
[COM-Objekte / PIAs] Fragen über Fragen
Von Klein0r im Forum .NET CaféAntworten: 1Letzter Beitrag: 04.09.08, 20:34 -
Fragen über Fragen zu einer Grafik
Von Wallgollum im Forum PhotoshopAntworten: 6Letzter Beitrag: 08.03.05, 13:16 -
Photoimpact 6: Fragen über Fragen
Von heroldini im Forum Sonstige Grafik-ProgrammeAntworten: 0Letzter Beitrag: 23.02.05, 19:19 -
Fragen ueber Fragen zu Bindestrich, Gedankenstrich etc.
Von Henning im Forum TypografieAntworten: 4Letzter Beitrag: 06.12.03, 13:44





Zitieren


Login





