Diskussion:Sprachelemente von C-Sharp

aus Wikipedia, der freien Enzyklopädie
Letzter Kommentar: vor 9 Jahren von 84.175.94.82 in Abschnitt Warnung vor break!
Zur Navigation springen Zur Suche springen

Der Rest von C#2 und C#3 ?[Quelltext bearbeiten]

Hmm, mal abgesehen von C#4-Features fehlt ja ziemlich viel:

  • parametrische Polymorphie,
  • anonyme Typen,
  • lokale Typinferenz,
  • Lambda-Ausdrücke sind als zu Ausdrucksbäumen konvertierbar, nicht nur zu Delegates,
  • Operator-Überladung,
  • implizite und explizite benutzerdefinierte Typumwandlungen.

Ist das Absicht? --Daniel5Ko 20:27, 5. Mai 2010 (CEST)Beantworten

LINQ[Quelltext bearbeiten]

Okay, verlagern wir das auf die Diskussionsseite, Generalpd. Die Behauptung, der Compiler benutze Erweiterungsmethoden, ist falsch. Auch, dass man ganz bestimmte Assemblies referenzieren muss, ist falsch. Die Übersetzungsregeln sind nahezu rein syntaktisch und untypisiert. Siehe zum Beispiel Bart de Smet: who ever said linq predicates need to be boolean valued? Welche Methoden konkret am Ende benutzt werden, und ob das Erweiterungsmethoden sind, oder nicht, wird auf dem normalen Rest-C#-3-Weg (d.h. C#3 ohne LINQ-Expressions) ermittelt.

In dem Kommentar zu deinem Revert (der die Unwahrheit wiederherstellt), forderst du mich auf, sachlich zu sein. Was ist unsachlich daran, aufzufordern, die entscheidenden Quellen mal zu lesen? Tu' das, und du wirst sehen, dass sie extrem allgemein gehalten sind, und o.g. Behauptungen bestenfalls irreführend sind. (Oder meintest du das "verwirrenden Mist produziert."? -- In dem Fall folgende Klarstellung: ich meinte damit meine sehr unperfekte Verbesserung, die lediglich dadurch besser ist, dass sie nicht aus Einfältigkeit Lügen verbreitet.) --Daniel5Ko 23:20, 4. Mai 2010 (CEST)Beantworten

Ergänzung: Ein paar weitere Links zur Erweiterung des Sichtfelds:
--Daniel5Ko 23:36, 4. Mai 2010 (CEST)Beantworten

Folgende Behauptung ist falsch:[Quelltext bearbeiten]

Konstanten (Schlüsselwort const)

Einem mit const deklarierten Objekt kann nach der Deklaration und Initialisierung kein neuer Inhalt zugewiesen werden. Das Objekt wird dadurch zu einer Konstanten.

Eine Konstante kann dabei sowohl ein Wertetyp sein (also ein einfacher Datentyp) als auch ein Referenztyp. Die Konstantheit stellt dabei nur sicher, dass die Referenz nicht veränderbar ist, schützt aber nicht vor Änderungen am referenzierten Objekt. So kann beispielsweise einer Konstanten die Referenz auf eine Liste zugewiesen werden, Änderungen an der Liste selbst sind weiterhin möglich (z.B. das Hinzufügen oder das Löschen von Listenelementen).

using System;
using System.Collections;

public class ConstBeispiel { public static void Main() { // Neue Konstante erstellen const IList liste = new ArrayList();
// Der Liste zwei Elemente hinzufügen liste.Add("Element 1: string"); liste.Add("Element 2: string");
// FEHLER: Versuch der Variablen liste // eine neue Referenz zuzuweisen liste = new ArrayList(); } }

Konstanten gibt es auch in anderen Sprachen (z.B. C++, Java). In Java werden Konstanten durch das Schlüsselwort final gekennzeichnet, in Fortran durch PARAMETER.

Angeheftete quellcode läst sich entsprechend nicht Compelieren

ebenfalls nicht:

const EventArgs e = EventArgs.Empty;

Grund: Referenctypen sind NICHT constant. bei const werden alle vorkommen durch die Variable durch den Compiler durch den wert der constanten Variablen ersetzt. Da der Compiler den Wert eines Referencetypes zur Compile zeit nicht kennt, kann er ihn auch nicht ersetzen (Er müsste die genaue Addresse im Speicher zur laufzeit kennen)


Werde mir eine veränderung überlegen, nach dem ich den ganzen Artikel gelesen habe.


So hab das mal abgändert, sowie noch weitere "Kleinigkeiten" erweitert. Mir fällt allerdings noch switch/case statement sowie Exceptionhandling. Vielleicht morgen, ich muss ins Bett ;) --Just-Ben 02:41, 17. Okt 2004 (CEST)

Wrapperklassen für int, bool, etc.[Quelltext bearbeiten]

System.Int32 ist KEINE Wrapperklasse für int, sondern int ist ein Alias für System.Int32.

"Man spricht dabei auch von einer Hüllenklasse (engl. wrapper class)." gelöscht. AUch in der MS-Dokumentation steht "aliases of predefined types in the System namespace". --AliM 11:52, 21. Mär 2006 (CET)

Widerspruch im Artikel und allgemein fehlende Info über Verweise[Quelltext bearbeiten]

Im Artiekl stehen folgende, sich widersprechende Aussagen:

Auch bei elementaren Datentypen handelt es sich in C# um Referenztypen,
die von object abgeleitet werden.

und

 //Löst den Compierfehler  CS0077 aus, da int kein Referenzetyp ist 

Weder hieraus, noch aus dem Hauptartikel C-Sharp geht hervor, was von beidem stimmt, und überhaupt fehlt hier in der Wikipedia eine genaue Beschreibung dessen, wie Referenzen bei C# arbeiten (Der Artikel zur Referenz ist eher auf C++ ausgerichtet). Unter Automatische Speicherbereinigung stehen einige alternativen, aber auch dort wird nur wage angedeutet, welche Variante von C# genutzt wird. 194.95.18.105 01:20, 4. Nov 2005 (CET) Brian

Warum steht mal die Beschreibung über dem Codebeispiel und mal darunter? Und was von beiden Möglichkeiten wäre besser?

Warnung vor break![Quelltext bearbeiten]

Habe den Absatz, welcher vor der Benutzung von break und goto warnt geändert. Die Warnung vor dem Schlüsselwort break ist IMHO nicht haltbar da dies durchaus auch in objektorientiertem Code anerkannt ist und die Begründungen zur nicht-verwendung von goto waren zu schwammig formuliert. High-Fish 00:57, 28. Nov 2005 (CET)

goto funktioniert nicht, jedenfalls nicht so oder zumindest nicht bei mir, im allgemeinen dachte ich sowieso das seit Pascal und Turbo goto gestorben sei. Oder liege ich da falsch? 84.227.196.148 20:42, 4. Mär. 2007 (CET)Beantworten
Hin und wieder ist ein Goto nützlich und auch verständlicher, etwa wenn man z.B. aus tief verschachtelten Blöcken herausspringen will/muss. Dieses Goto müsste sonst durch entsprechend viele break-Anweisungen oder durch komplettes Umstellen des Codes ersetzt werden, was den Programmcode dann sehr unübersichtlich machen würde. --RokerHRO 22:59, 18. Aug. 2007 (CEST)Beantworten
Ad goto: Stellen Sie sich einfach zwei verschachtelte For-Schleifen vor. Sie wollen dann aus der inneren Schleife heraus beide Schleifen verlassen. Das geht mit goto sehr einfach und elegant. Eine andere Möglichkeit wäre auch eine Hilfsvariable einzuführen und anhand dieser zu entscheiden, ob die innere Schleife normal beendet wurde oder nicht. Dies würde aber zwangsläufig zu mehr meta-Code führen, daher ist goto in so einem (gar nicht mal so unüblichen) Fall schon sehr nützlich. --84.175.94.82 18:33, 10. Feb. 2015 (CET)Beantworten

"Attribut": Begriffsverwirrung[Quelltext bearbeiten]

Momentan vermischt der Artikel verschiedene Bedeutungen des Begriffs "Attribut". Im mehreren Abschnitten (z.B. in "Objekte und Klassen") sind Attribute das, was sonst "Variable", "Datenelement" oder (Sonderfall) "Eigenschaft" genannt wird, also die Datenelemente (im Gegensatz zu den Methoden) einer Klasse. Weiter unten ist dann auf einmal von Attributen im Sinne von Metadaten die Rede. --Neitram 13:02, 28. Mär 2006 (CEST)

struct kein "Wertetyp" in C++?[Quelltext bearbeiten]

Was genau ist damit gemeint? Es werden in C++ per se alle Objekte als Wertetyp angelegt, oder habe ich "Wertetyp" nicht richtig verstanden? --RokerHRO 18:59, 5. Jul 2006 (CEST)

Für Laien schwer Verständlich[Quelltext bearbeiten]

wie mir aufgefallen ist, versteht diesen Artikel wohl nur jemand, der mit Programmiersprache wie C, C++ oder Java einigermaßen bewandet ist. Zwar geht aus den meißten Texten der Sinn des Codes hervor, aber ein bisschen Text wäre doch auch ganz schön. --Neutralstandpunkt 10:55, 27. Mai 2007 (CEST)Beantworten

decimal ist kein Gleitkommatyp[Quelltext bearbeiten]

Hallo! Wollte mal kurz anmerken das der Datentyp decimal kein Gleitkommadatentyp wie float oder double ist. Hab nicht so viel Zeit das dementsprechend in den Artikel einzubauen. Wenn sich jemand die Zeit dafür nehmen könnte ... hier noch ein paar Referenzen:

Bin mir nicht ganz sicher, ich denke solche Datentypen gehören zu einer eigenen Datentypklasse, d.h. es sind weder Gleitkomma noch Integer noch Festkommazahlen ... Viele Grüße -- Meph666 → post 16:13, 1. Jun. 2007 (CEST)Beantworten

Falsche Behauptungen über Java-Interfasces[Quelltext bearbeiten]

Aus dem Artikel:

Schnittstellen in C# ähneln den Schnittstellen der Programmiersprache Java. Anders als in Java, dürfen Schnittstellen in C# keine Konstanten oder Konstruktoren enthalten und auch keine Zugriffsmodifizierer bei der Definition einer Methode vereinbaren.

Aber:

In Java können Interfaces keine Konstruktoren haben.

Alle Methoden in Java-Interfaces haben die Sichtbarkeit public. Man hat lediglich die Wahl, ob man dieses public hinschreibt oder nicht. Alle anderen Sichtbarkeiten sind jedoch für Interfaces verboten.

Datentyp bool 1 Bit Speicherbedarf?[Quelltext bearbeiten]

Ist das verfiziert das eine Variable vom bool-Typ tatsächlich nur ein Bit belegt? Kann das nur schwer glauben, da in der Regel ein Byte die kleinste addressierbare Einheit ist. Was passiert mit den restlichen 7 Bits des dafür reservierten Bytes? - Leber

Meiner bescheidenen Meinung nach hat System.Boolean (Bool) 8 Bit. Unabhängig von dem OS. Qelle ISBN 3-8158-2206-8 1. Auflage 2003 S.54 Mr.bloom
System.Boolean (bool) belegt 1 Byte (sizeof (C# Reference)). Allerdings ist die CLR so "schlau" mehrere Booleans speicheroptimiert zusammenzufassen.

switch-case[Quelltext bearbeiten]

String cmd;
...
switch (cmd)
{
  "run":
    Anweisungen;
    break;
  "save":
    Anweisungen;
    break;
  default:
    Anweisungen;
    break;
}

Das gezeigte Beispiel (ist aus dem Artikel) funktioniert so nicht, da die case-Schlüsselwörter fehlen. Oder funktioniert das nur unter VC# 2005 nicht? --Fr4nZ 19:24, 21. Feb. 2008 (CET)Beantworten

Konstruktoren (und Destruktoren)[Quelltext bearbeiten]

Dieser Aspekt sollte vielleicht noch etwas besser herausgestellt werden, finde ich als (gezwungener C#-Anfänger). BTW: Gibt es eigentlich auch Destruktoren in dieser Sprache? --Robb der Physiker 10:45, 2. Okt. 2008 (CEST)Beantworten

In C# gibt es keine Destruktoren, wie man sie aus C++ kennt. Wegen der dynamischen Speicherverwaltung und dem Garbage Collector ist das auch nicht notwendig. Nicht mehr referenziere Objekte werden automatisch "weggeräumt". Es gibt aber Finalisierer, die dazu gedacht sind, nicht verwaltete Ressourcen freizugeben, die ein Objekt verwendet.
Das macht ein Destruktor in C++ auch. Speicher ist ja nur eine der möglichen Ressourcen, die es aufzuräumen gilt (oder eben auch nicht, wenn das automatisch geschieht, was im Übrigen auch in C++ möglich ist). --RokerHRO 00:02, 23. Nov. 2008 (CET)Beantworten
Eventuell habe ich mich missverständlich ausgedrückt. Es gibt in .NET einen Unterschied zwischen verwalteten und nicht verwalteten Ressourcen. Um erstere kümmert sich der Garbage Collector, darum müss man sich nicht kümmern, darum gibt es (hierfür) keinen Destruktor. Nur wenn ein Objekt selber nicht-verwaltete Ressourcen allokiert, muss sich das Objekt selber um deren Freigabe kümmern, hierzu dient der Finalisierer (Finalizer). 11:32, 23. Nov. 2008 (CET)
Destruktoren werden mit Tilde voran gekennzeichnet, und ja es gibt Destruktoren --Bitsandbytes 11:49, 23. Nov. 2008 (CET)Beantworten

Versionsunterschiede[Quelltext bearbeiten]

Hallo, war gerade etwas "entäuscht" das der Artikel leider noch überhaupt keine Infos bzgl. der Versionsunterschiede enthält. Soweit ich das jetzt aus dem Kopf weiß ist bisher mit jeder Framework Version auch C# als Sprache erweitert worden (bei 1.0 auf 1.1 bin ich mir da im Moment nicht sicher). Vorallem der Schritt 2.0 auf 3.0 auf 3.5 sorgt immer wieder für Verwirrung - jedenfalls bei mir selbst manchmal (wenn ich anfange genau darüber nachzudenken).

Damit meine ich z.B.: Welche Sprachkonstukte wurden mit welcher Version eingeführt ? In wieweit sind die unterschiedlichen Versionen kompatibel ? Werden auch in der Zukunft alle Versionen weiterhin unterstützt werden ? Gibt es Konstrukte deren Verwendung zu empfehlen ist bzw. von denen dringend abgeraten werden sollte (z.b. weil jetzt schon absehbar das künftig Inkompatibilitäten auftreten werden) ? Auf welche Konstukte sollte ich verzichten, oder auf was ist generell zu achten, um den Code zu einem späteren Zeitpunkt möglichst leicht oder problemlos migrieren zu können (Schnittstellen, Codestruktur, ...)?

Das sind jetzt nur ganz spontan einige Fragen die ich mir so oder so ähnlich schon mal selbst gestellt habe. Ob z.B. auch in Zukunft alle Versionen weiterhin unterstützt werden wird kaum zu beantworten sein, bzw. beantwortet sich bei genauerem hinsehen (nachdenken) bereits von selbst. Weiß natürlich jetzt auch nicht aus dem Stehgreif wo diese Infos am besten zu plazieren wären, ob also wirklich in diesem Artikel oder z.b. unter C# Sprache oder evtl. im Artikel zum .NET Framework.

Jedenfalls war ich erstaunt das die fortschreitende Erweiterung der Sprache überhaupt nicht angesprochen, ja noch nicht einmal erwähnt wird. Würde auch selbst helfen den Artikel diesbezüglich zu verbessern, habe jedoch leider nicht die Zeit um das alleine zu bewerkstelligen. Biete meine Hilfe aber gerne an um z.B. in einem kleinen Team die Sache anzugehen.

Generics[Quelltext bearbeiten]

Mir fehlen irgendwie generischen Klassen & Co. Sind die bewusst nicht erwaehnt, wurden vergessen, oder mangelt es an Relevanz? --Feuermonster 23:24, 26. Mar. 2009 (CET)

Leider gehört .NET zu den Themen die in der WP eher stiefmütterlich behandelt werden. Ich denke aber es fehlt einfach an aktiven Autoren. (nicht signierter Beitrag von 84.130.159.68 (Diskussion | Beiträge) 16:25, 21. Mai 2009 (CEST)) Beantworten

Link auf Englische Seite[Quelltext bearbeiten]

Ich frage mich gerade, warum auf den englischen Artikel C# programming language und nicht auf den besser passenden C# syntax? Der erstgenannte engl. Artikel verweist nämlich auch nicht zurück, sondern auf C#. (nicht signierter Beitrag von 84.130.155.1 (Diskussion | Beiträge) 13:26, 22. Mai 2009 (CEST)) Beantworten

else if[Quelltext bearbeiten]

Meiner Meinung nach sollte man den else-if Block streichen, da er leicht missverstanden wird. Rein Syntaktisch ist es bloss ein verschachteltes if im gegensatz zum elseif in php (siehe http://php.net/manual/de/control-structures.elseif.php ). Anstatt den else-if Block zu erwaehnen, sollte man folgende Punkte klarmachen:

  1. Dass man an beliebigen Stellen geschweifte Klammern verwenden kann (und sollte) um einen Gueltigkeitsbereich abzugrenzen. (Zum Beispiel um Zwischenergebnisse nicht ewig im Speicher zu behalten.)
  2. Dass solch ein Scope von einer if Bedingung wie eine einzige Anweisung behandelt wird.
  3. Und, dass ein if Block selbst auch eine Anweisung ist.

Demzufolge koennte sich jeder selber herleiten, dass ein

if ( foo )
{}
else if ( !foo && bar )
{}
else
{}

nichts weiter ist, als ein

if ( foo )
{}
else{

if ( !foo && bar )
{}
else
{}

}

in dem in der alternativen Anweisung fuer die erste Bedingung eine weitere Verzweigung eingebaut wurde. (nicht signierter Beitrag von 62.112.72.133 (Diskussion) 13:10, 12. Apr. 2011 (CEST)) Beantworten

Name der Interfaces[Quelltext bearbeiten]

Es gilt als guter Programmierstil, Interfaces immer mit einem großen I beginnen zu lassen.

 „Schnittstellen werden per Konvention mit einem führenden „I“ (für Interface) benannt.“

Im Artikel werden aber die Interfaces A und B deklariert. Müssten die nicht eigentlich IA und IB heißen?

--*Bene* (Diskussion) 09:55, 8. Aug. 2012 (CEST)Beantworten

Überarbeiten-Baustein[Quelltext bearbeiten]

Folgendes ist bemängelt (vgl. auch vorhergehende Diskussionen)

  • Während klassische Elemente zu viel Platz einnehmen, werden neuere Konzepte nur sehr rudimitär beschrieben. So werden Schleifen und Bedingte Ausführungen sehr detailliert beschrieben, LINQ dagegen kurz abgehandelt.
  • Vieles auf dieser Seite ist nicht C#-spezifisch (höchstens die Syntax), sondern eher .NET-spezifisch. Würde man Sprachelemente von Visual Basic.NET anlegen, dürfte ein grosser Teil bis auf die Codebeispiele redunant aussehen. .NET-Sprachelemente wie using, LINQ, Genrics, Enum, Attribute, try/catch und vieles weiteres sollten also in einer separaten Seite aufgeführt werden und nicht als "C#"-Spezialität "verkauft" werden.
  • Es fehlen Wikilinks zu den Elementen. Wer nicht weiss, was eine Schleife ist, kann mit den Beispielen auch nichts anfangen.
  • Es wird vieles mit C und C++ verglichen. Warum kaum mit Java? Oder bei den gemeinsamen .NET-Eigenheiten mit anderen .NET-Sprachen? Das erklärt der Artikel nicht.
  • Vieles ist redundant. So gibt es Artikel zu LINQ usw., wo auch Beispiele gezeigt werden. Warum nicht daraufhin verweisen (bzw. umgekehrt), statt alles zu wiederholen? --Filzstift  12:31, 28. Mai 2014 (CEST)Beantworten

Was sind Assemblies?[Quelltext bearbeiten]

Es ist nur ein Link vorhanden in dem das Wort einmal vorkommt: Der .NET Platform Standard ist ein Standard, der bestimmte Assemblys definiert, die von denjenigen Plattformen – zum Beispiel .NET Framework und .NET Core – erfüllt werden müssen, die dem Standard entsprechend implementiert sind.