Diskussion:Arbeiten mit .NET: Materialien/ Programmierkurs C-Sharp: Konstanten

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Beispiel fehlerhaft und lässt sich nicht kompilieren.


Hallo Ben! Du hast (sinngemäß) geschrieben: "Grund dafür ist, dass der Kompiler alle Verwendungen zum Zeitpunkt des Kompilierens ersetzt. Bei Referenzedatentypen müsste er dort bereits die Speicheraddresse zur Laufzeit wissen."
Das kann aber nicht der Grund dafür sein, dass Referenzdatentypen nicht konstant sein dürfen, denn das ist quasi immer (!) so. Ein Kompiler kennt zur Kompilationszeit nicht alle Adressen, die zur Laufzeit eingesetzt werden. Das kann folglich nicht der Grund dafür sein, dass Referenztypen nicht konstant sein dürfen.

Ich ändere die Passage dahingehend ab!

Doch das ist der Grund, wenn Referenzedatentypen normal verwendet werden, liegt in der Variablen ja erst die Speicheraddresse, dies kann bei jedem Öffnen des Programms eine andere sein, diese wird "praktisch" beim new object() erst erzeugt, und dem Zeiger zugewiesen. Den zeiger kann ich dann Kopieren. Wertdatentypen benutzen ja keine Zeiger, man kann sich hier vorstellen das der Compiler überall wo die Variable verwendet wird, einfach der Wert direkt hingeschrieben wird. Wenn ich also
const int i = 5;
int a = i+1;
schreibe macht der compiler folgendes daraus und kompeliert erst dann:
int a = 5+1;
Dies ist auch der grund warum Konstanten auch keine klassenmember sein können. In C# gibt es dafür ein zweites schlüsselwort (readonly). Wahr ist, das der Artikel noch überarbeitet werden muss, allerdings möchte ich am liebsten von "Vorne" mich bis nach hinten durchbeißen ;)

Hm, kennst du die Programmiersprache C? Dort kann man sowas machen:

void Funktion(const int a)
{
  /* welchen Wert a hat, kann von Aufruf zu Aufruf der Funktion verschieden sein! */
}

Obwohl also der Compiler den Wert von a nicht kennt, ist a eine Konstante. Oder noch krasser ausgedrück: Obwohl sich a ständig ändert, ist es eine Konstante! :-)

Ja kenne C, wuste nicht das dies so in C geht (bin kein C Crack). But C# aint C. Und das ist auch gut so.
Warum meinst du dass das gut so ist? Welchen Vorteil hat es, wenn man im obigen Beispiel nicht const int deklarieren darf?
Was soll es bringen einen übergabe bei Call bei Value const zu machen? Ein zuweisen bringt doch beim aufrufer keine änderung, sondern nur innerhalb meiner funktion. Wenn ich es innerhalb meiner funktion nicht ändern will, dann ändere ich es nicht? was soll const hier aussagen? das es sich nicht ändert? müsste jetzt mal schaun was const in C macht. In c# ist es "Praktisch" das, was in C ein #define "variablenname" wert ist, was benutzt wird, weil ein wert schon zur Kompilezeit feststeht und man eine zentrale Änderungstelle will, und es das Programm effizienter macht als wenn man eine globale variable deklariert die zur laufzeit immer ausgelesen wird. Mit C# aint C meine ich das C keine echte teilmenge von C# ist, wie es noch bei C++ der Fall war.
Die Syntax ist zwar ähnlich, die umsetzungen aber anders. Hab das Beispiel versucht in C# zu kompelieren, gleich 2 Kompilerfehler, erstens const ist kein Type, 2tens constante Variable hat keinen Wert bekommen. Things Change ;) Man kann in C# auch kein:
int = 1;
if(i)
{ 
}
Schreiben, die if Bedinungen geht nur noch über Boolean. Zeigeroperationen (zeiger incrementerien), nope. Außer man makiert den Code Unsafe, und damit als so gut wie unbrauchbar (da auf den meisten Plattformen nicht ausführbar). lg --Just-Ben 09:03, 5. Nov 2004 (UTC)