Ich hatte es nur mit Saiten zu tun, und ich ärgere mich, dass Saiten NULL-fähig sein können. Also muss ich
haben %Vor%überall. Würde String? waren so schwer für die NULL-Zulässigkeit in den relativ wenigen Fällen, in denen es benötigt wird (dbs, idiot Benutzereingaben, etc.). Ich bin auch irritiert darüber, dass ich in den Fällen, in denen ich irgendeine Art von korrekter Korrektheit möchte, nur lesbare Interfaces exportieren muss. Also, was C # Sprache Konstrukt / Entscheidung nervt dich?
EDIT: Danke für die isnullemptype Funktion, die ich vorher nicht gesehen habe! Immer noch nicht mein Ärger darüber, dass es Nullable sein kann: D
Eine Zeichenkette zu einem Referenztyp zu machen, erscheint mir völlig vernünftig.
Es ist eine Schande, dass man einen Variablen / Parameter / Rückgabetyp nicht als nicht-nullable deklarieren kann - z. B.
%Vor%Code Contracts in .NET 4.0 werden dabei helfen, glaube ich - aber es ist ein bisschen zu spät, um es durchdringend zu machen.
Vor einiger Zeit schrieb ich ein Blogeintrag über die Fehler von C # . Um diesen Beitrag zusammenzufassen:
C # 1:
C # 2:
System.Nullable
-Klasse (nicht Nullable<T>
- das ist in Ordnung!) C # 3:
Das Testen von Strings für Null oder Empty erfolgt am besten mit:
%Vor%Wahrscheinlich ist das größte grelle Loch in C # für mich enums.
Java-Enums sind typsichere Klassen, denen Sie Verhalten geben, Schnittstellen implementieren können und so weiter.
C # /. Net Enums sind nur verherrlichtes Ints mit all den Problemen, die int Konstanten zurück zu C und C ++ hatten.
Erweitern sich auf Mitchs Antwort.
Das ist eigentlich eine CLR Entscheidung, keine C # one. C # hat keine Kontrolle über die Implementierungsdetails der System.String-Klasse des BCL.
Wahres C # könnte spezielle verkleinerte Zeichenfolgen im Compiler haben und sagte, dass wir spezielle Null-Prüfungen durchführen würden, aber das hätte IMHO, war eine schlechte Entscheidung. String.IsNullOrEmpty ist ein akzeptabler Kompromiss.
Durchsetzung der Unterbrechung in einem nicht leeren Fall.
Ausführlichkeit von enums, besonders in case-Anweisungen. Wenn ich switch (expr) und expr eine Enumeration habe, sollte ich nicht gezwungen sein, jede enum in jedem Fall vollständig zu qualifizieren, es sei denn, es gibt einen Namenskonflikt.
Überprüfte Ausnahmen wären großartig gewesen. Ich weiß, dass viele Leute sie von Java hassen, aber ich denke, es werden immer Sicherheitsüberprüfungen durchgeführt, besonders bei I / O. Ich mag die meisten Dinge, die C # geändert und / oder hinzugefügt hat, im Vergleich zu Java, aber ich hätte wirklich gerne, dass sie überprüfte Ausnahmen übernommen haben. Es ist jetzt zu spät (das .NET-Framework wird geändert, damit es praktisch jedes Programm außer Betrieb setzt), aber ich denke, es wäre besser gewesen, sie zu haben.
Wie muss ich Eigenschaften von einer Schnittstelle in c # implementieren 3.0 obwohl sie genau das gleiche wie die Schnittstelle sind, wenn ich das Standardverhalten der automatischen Eigenschaften nicht verändere.
z.B.
%Vor%EDIT: Um einige der Kommentare zu diesem Thema zu adressieren. Ich ändere kein Standardverhalten meines Getters. Ich verstehe den Unterschied zwischen Klasse und Schnittstelle Dankeschön, mein Punkt ist, dass ich es mit der Schnittstelle markieren muss, dass ich diese Eigenschaft nicht in jeder implementierenden Klasse haben muss, außer wenn ich das Standardverhalten des Getter oder Setter ändern möchte. Stellen Sie sich vor, 500 Klassen implementieren diese Schnittstelle?
Auch das Fehlen von Mixins ..
Ich hasse es, IEnumerable<MyType>
überall eingeben zu müssen. Es ist so schwer zu lesen. Ich würde eine kurze Hand bevorzugen, um meinen Code sauberer zu machen.
Dies SO post fasst es gut zusammen .
Ich finde es enorm irritierend, dass so viele Kernmethoden statisch sind, besonders bei häufig verwendeten Dingen wie Strings und Arrays.
Warum:
%Vor%anstelle von:
%Vor%Ich sage nicht, dass es keine guten Gründe dafür gibt und es keine große Sache ist, aber wenn JS es schaffen kann, warum kann C # nicht? *
Auch die switch Implementierung. Ich denke wirklich, dass sie uns mit Fallthrough vertraut haben sollten.
* Kommen Sie dazu, dass ich auch JS's Closure-Syntax vermisse.
Ich mag IDisposable / Dispose nicht. Aus C ++ kommend ist es sehr ärgerlich, dass man sich Gedanken über die Speicherverwaltung in C # machen muss. Die using-Anweisung ist in Ordnung, wenn das verfügbare Objekt nur in einer Funktion verwendet wird. Wenn es herumgereicht werden muss, müssen Sie manuell auf count verweisen oder etwas anderes tun, um zu wissen, wann Sie das Objekt entsorgen können.
Tags und Links c#