Jedes Produkt oder Framework entwickelt sich weiter. Dies geschieht hauptsächlich, um die Bedürfnisse der Benutzer zu befriedigen, neue Rechenkapazitäten zu nutzen und einfach besser zu machen. Manchmal ändert sich auch das primäre Designziel mit dem Produkt. C # - oder .net-Framework ist keine Ausnahme. Wie wir sehen, unterscheidet sich die heutige 4. Version stark von der ersten. Aber es ist eine Barrikade für diese evolutionäre Abwärtskompatibilität.
In den meisten Frameworks / Produkten gibt es Funktionen, die abgeschnitten worden wären, wenn die Abwärtskompatibilität nicht unterstützt werden müsste. Was sind Ihrer Meinung nach diese Funktionen in C # /. Net?
Bitte erwähnen Sie eine Funktion pro Antwort.
c#
.net
features
backward-compatibility
Gulshan
quelle
quelle
Antworten:
Anonyme Methoden . Ich denke, alle sind sich einig, dass die für C # 2.0 gewählte anonyme Methodensyntax im Vergleich zu der Lambda-Syntax, die wir zu C # 3.0 hinzugefügt haben, klobig und klobig ist. Es ist sehr bedauerlich, zwei fast identische Syntaxen zu haben, um dasselbe zu tun.
quelle
Ich würde die nicht-generischen Sammlungen loswerden. Sie sind ein Gräuel ... und es gibt zu viele Fälle, in denen ich Linq benutze und so etwas tun muss
Jedes Mal, wenn ich das tun muss, stirbt ein kleiner Teil meiner Seele.
quelle
als Typ ungültig . Warum um alles in der Welt ist "void" ein Typ? Es hat keine Instanzen, es hat keine Werte, Sie können es nicht als generisches Typargument, formaler Parametertyp, lokaler Typ, Feldtyp oder Eigenschaftstyp verwenden. Es hat als Typ keine Bedeutung; Vielmehr geht es darum, welche Auswirkung ein Methodenaufruf auf den Stapel der virtuellen Maschine hat. Aber die virtuelle Maschine ist genau das: eine virtuelle Maschine. Die reale Maschine schreibt den zurückgegebenen Wert in ein Register (normalerweise EAX bei x86) und beeinflusst den Stack überhaupt nicht! Void als Typ ist einfach eine schlechte Idee.
Schlimmer noch: Wenn in einem Zeigertyp wie in
void*
diesem verwendet, bedeutet dies etwas völlig anderes als das, was es bedeutet, wenn es als Rückgabetyp verwendet wird. Jetzt bedeutet es "ein Zeiger auf einen Speicherort unbekannten Typs", der in keiner Weise mit seiner Bedeutung als "eine Methode, die keinen Wert zurückgibt" zu tun hat.Wir können
void*
als Zeigertyp mit ersetzenIntPtr
. (Undvoid**
mitIntPtr*
und so weiter.) Wir können void als Rückgabetyp durch "Unit" ersetzen, einen Typ mit einem einzelnen Wert, nämlich null. Eine Implementierung der CLR könnte dann entscheiden, dass ein Unit-typisierter Funktionsaufruf die Verwendung von Registern oder Stapeln entsprechend optimieren kann, da bekannt ist, dass die "zurückgegebene" Null sicher ignoriert werden kann.In einer solchen Welt braucht man keine getrennten
Func<A, R>
undAction<T>
delegierten mehr.Action<T>
ist einfachFunc<T, Unit>
.quelle
Task
ist nur einTask<Unit>
. Das erneute Implementieren der Bibliotheks-Bits des asynchronen CTP ließ mich dies wirklich wünschen ...Die leere Aussage
;
. Fehleranfällig, fast immer ein Tippfehler, und gibt Ihnen keine zusätzliche Bedeutung, die nicht bereits von ausgedrückt wird{}
.quelle
Unsichere Kovarianz bei Arrays des Referenztyps . Mit aktivierter typsicherer Kovarianz
IEnumerable<T>
ist zumindest ein Teil des Bedarfs an Array-Kovarianz weggefallen . (Wenn wir eine kovariante schreibgeschützte Listenschnittstelle hätten, würden wir sie überhaupt nicht brauchen.)quelle
IList<T>
geerbt vonIReadableList<out T>
und nicht generisch istIPemutable
, kann es Dinge wie Sortieren unterstützen, aber Arrays können es einfacher unterstützen.Der unäre Plus-Operator . Am wenigsten nützlicher Operator aller Zeiten. Wenn wir es nicht für Rückwärtskompatibilität aufbewahren müssten, würde ich es sofort herausnehmen. Wer benutzt dieses Ding?
(Erläuterung: Der unäre Plus-Operator
+x
ist nicht der Vorinkrementierungsoperator++x
, nicht der Nachinkrementierungsoperatorx++
und nicht der Binäradditionsoperatorx+y
.)quelle
+1 == 1
. Es ist verdammt nah an einem No-Op.if(a == +1 || a == -1){...}
.Standardmäßig numerische Literale bis
double
Für die meisten Unternehmen Anwendungen,
decimal
besser geeignet ist sowieso ... oder vielleicht wäre es besser, nur zu entfernen , die Idee einer Standard und Kraft - Entwickler , um tatsächlich die Wahl zu treffen.(Das „entfernen Sie die default“ würde für einige andere Dinge, auch geeignet sein. Zum Beispiel, ich habe es aufgegeben, alle davon zu überzeugen , dass Klassen standardmäßig abgedichtet werden sollte, aber ich vermute , dass es einfacher ist , die Menschen davon zu überzeugen , daß sie denken über ob ihre neue Klasse besiegelt werden soll oder nicht, und machen Sie es explizit.)
quelle
Dies ist eher ein Leitfaden als ein Feature, aber ich denke, es ist wichtig, weil es den Menschen als die kanonische und beste Lösung bereits zu sehr einfällt:
Das offizielle zu implementierende Muster
IDisposable
.Es ist umständlich und es gibt bessere Wege .
quelle
Ich weiß, dass es große Unterschiede zwischen den verschiedenen Timer-Klassen gibt. Aber konnten wir nicht trotzdem einen oder zwei von ihnen loswerden?
quelle
Methoden und Arten von
Array
undList<T>
die mit Linq überholt wurden, zum Beispiel:Array.TrueForAll
kann durch ersetzt werdenEnumerable.All
Array.FindAll
kann durch ersetzt werdenEnumerable.Where
List<T>.ConvertAll
kann durch ersetzt werdenEnumerable.Select
Predicate<T>
kann durch ersetzt werdenFunc<T, bool>
Converter<T,R>
kann durch ersetzt werdenFunc<T, R>
IComparer<T>
sollte wirklich ein Delegierter seinFunc<T, T, int>
quelle
Predicate<T>
weil es die Absicht aufnimmt, wie die Funktion verwendet wird, und ein wenig Tipparbeit spart.Nicht generische Delegaten Wie nicht generische Auflistungen sind auch nicht generische Delegaten nutzlos, da wir über die Funktions- und Aktionsserien verfügen. Und ich hätte die Varianten bei drei Parametern abgeschnitten. Wenn Sie mehr als drei Parameter haben, erstellen Sie eine Struktur und verwenden Sie diese als einzigen Parameter. Das Deklarieren eines bestimmten Delegaten für die Ereignisbehandlung ist nicht sehr TROCKEN.
quelle
asmx Web Services
Ich denke, sie sind heutzutage mit WCF ziemlich veraltet.
quelle
Winforms
Es wäre schön, nicht zwischen zwei Desktop-Plattformen navigieren zu müssen. WPF ist genau das Richtige für Sie. Es ist daher frustrierend, über eine vollständige Redundanz auf Plattformebene zu verfügen.
quelle