C#: Grundelegende Fragen zu Objekten...

_The_Beginner_

Grünschnabel
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:
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_
 

saftmeister

Nutze den Saft!
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.
 

sheel

I love Asm
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 :( :D
 

_The_Beginner_

Grünschnabel
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? :D Oder wäre das dann keine normale String-Eigenschaft mehr sondern ein spezieller, C#-unabhängiger Datentyp von der CLR?
 

_The_Beginner_

Grünschnabel
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? :(
 

sheel

I love Asm
"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.
 

_The_Beginner_

Grünschnabel
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 :D