Welche Sprachwahl in C # nervt dich? [geschlossen]

7

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

    
Steve 13.03.2009, 14:50
quelle

13 Antworten

21

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:

  • Fehlender separater Getter / Setter-Zugriff für Eigenschaften.
  • Mangel an Generika. Das Leben wäre von Anfang an mit Generika viel süßer gewesen.
  • Klassen werden standardmäßig nicht versiegelt.
  • Enums werden nur als Nummern bezeichnet.
  • Die Zeichenfolge "\ x".
  • Verschiedene Dinge über die switch-Anweisung:)
  • Einige ungerade Überladungsauflösungsregeln
  • Das Schlüsselwort "lock" anstelle von "using" mit einem Lock-tocken.

C # 2:

  • Mangel an Teilmethoden (kam in C # 3)
  • Mangel an generischer Varianz (kommt in C # 4)
  • Die System.Nullable -Klasse (nicht Nullable<T> - das ist in Ordnung!)
  • InternalsVisibleTo erfordert den gesamten öffentlichen Schlüssel für stark signierte Assemblys anstelle des öffentlichen Schlüsseltokens.

C # 3:

  • Fehlende Unterstützung für die Unveränderbarkeit - viele Änderungen haben die Möglichkeiten für mutierende Typen verbessert (automatische Eigenschaften, Objekt- und Auflistungsinitialisierer), aber keine davon funktioniert wirklich für veränderbare Typen
  • Erkennung der Erweiterungsmethode
Jon Skeet 13.03.2009, 14:59
quelle
28

Das Testen von Strings für Null oder Empty erfolgt am besten mit:

%Vor%     
Mitch Wheat 13.03.2009 14:53
quelle
6

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.

    
cletus 13.03.2009 22:03
quelle
5

out- und ref-Parameter

    
Michael Larionov 13.03.2009 14:55
quelle
1

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.

    
JaredPar 13.03.2009 14:55
quelle
1

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.

    
plinth 30.04.2009 15:59
quelle
1

Ü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.

    
Kevin Anderson 30.04.2009 16:18
quelle
0

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 ..

    
Rob Stevenson-Leggett 13.03.2009 14:54
quelle
0

Die Änderung von Co- / Contravarianz- oder Zugriffsrechten beim Überschreiben der Basisklasse oder beim Implementieren von Schnittstellenmethoden wird nicht zugelassen:

%Vor%     
thecoop 30.04.2009 16:09
quelle
0

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 .

    
Brian Genisio 30.04.2009 16:28
quelle
0

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.

    
annakata 30.04.2009 16:32
quelle
0

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.

    
Steven 30.04.2009 16:34
quelle
0

Ich möchte Klassenobjekte als erstklassige Objekte in der Sprache sehen.

Damit können Sie statische Methoden überschreiben und sie in Schnittstellen deklarieren.

    
pgb 30.04.2009 16:51
quelle

Tags und Links