Ich weiß, dass der Titel der Frage sehr subjektiv ist, aber ich wurde ??
von meinen Kollegen mit der Verwendung von Operatoren konfrontiert , wobei ich gleichzeitig nicht sehr zufrieden mit der Anwendung var
von neuem Code war.
Das Argument für die Verwendung von ??
operator war, dass es die Lesbarkeit im Code beeinträchtigt.
Meine Frage ist, passiert nicht dasselbe, wenn Sie anfangen zu benutzen var
?
c#
coding-style
readability
Numan
quelle
quelle
??
Null-Coalesce-Operator nicht verstehen kann, nachdem er erklärt wurde, sollte er nicht in der Nähe von Produktionscode zugelassen werden.Antworten:
Null-Koaleszenzoperator (??)
Persönlich sehe ich keine Nachteile bei der Verwendung dieses Operators. Betrachten Sie die folgenden drei Codebeispiele, von "einfachen" bis "komplexen" neuen Operatoren.
Ohne Magie:
Ternärer Operator:
Null-Koaleszenz:
Der Grund, warum diese Operatoren erfunden wurden, ist, dass sie sehr häufige Programmiervorgänge darstellen . Sie nicht benutzen zu wollen, weil Sie nicht an sie gewöhnt sind, ist nur hartnäckig . Sprachen entwickeln sich, Funktionen entwickeln sich, lernen, sie zu benutzen!
var Schlüsselwort
Ich habe eine etwas andere Meinung über das Schlüsselwort var. Der Typ einer Variablen enthält häufig zusätzliche Informationen zu Ihrem Code. Wenn ich den Typ mit dem Schlüsselwort var verstecke, ist der Code manchmal weniger lesbar. Sie wissen weniger, was Sie erwarten können, wenn Sie die automatische Vervollständigung nicht verwenden oder den Mauszeiger über die Bezeichner halten, um zu sehen, was diese tatsächlich sind. Meiner Meinung nach führt dies zu Code, der langsamer zu lesen / schreiben ist.
Ich verwende das Schlüsselwort, wenn ich feststelle, dass der Typ nicht viele zusätzliche Informationen enthält.
Als Beispiel für die letzte Aussage:
quelle
Factory.CreateSomeType
kehrt zurückIEnumerable<SomeType>
. Eines Tages, aus welchem Grund auch immer, ändert es sich, um zurückzukehrenSomeType[]
. Wenn Sie var verwendet haben, handelt es sich nur um eine Neukompilierung.Factory.CreateSomeType()
Änderungen zurückgegeben werdenISomeType
?null
. Je mehr ich nach Alternativen suchenull
, desto mehr wird mir klar, dass die Verwendungnull
manchmal die sauberste Lösung ist. Mein gegebenes Beispiel ist meiner Meinung nach gar nicht so schlecht, und ich finde es eine angemessene Verwendung von nullbaren Typen.var erlaubt weniger ausführlichen Code, was die Lesbarkeit erhöht. Meiner Meinung nach sollte die Lesbarkeit nicht daran gemessen werden, wie viele Details Sie sehen, sondern wie viele Details sich auf den ersten Blick verbergen. Neben Linq-Beispielen ermöglicht var die Eingabe von Enten auf Quellcode-Ebene, anhand des folgenden Beispiels:
Wen kümmert es, welche Art von Beschriftung es gibt, solange sie die Eigenschaft Text enthält?
quelle
Ich habe keine ernsthaften Kommentare zum
??
Operator, da ich noch nie eine Sprache mit einem solchen Operator verwendet habe. Was das betrifftvar
, programmieren die Leute in Sprachen wie Ruby, Python, Perl und PHP, die die ganze Zeit implizites Tippen haben. Muttersprachen dieser Sprachen erkennen, dass der formale Typ einer Variablen normalerweise irrelevantes Rauschen ist. Sie sind mehr daran interessiert, was die Variable kann tun , also seine strukturellen / Ente - Schnittstelle.Ebenso programmiere ich meistens in D. D ist statisch getippt, hat aber das
auto
Schlüsselwort, was äquivalent zu istvar
. Es wird als idiomatisch angesehen, es überall zu verwenden, es sei denn, Sie sehen eine spezielle Notwendigkeit, die Art von etwas entweder für den Leser oder (durch implizite Konvertierung) für den Compiler hervorzuheben. Außer gelegentlich bei der Verwendung als Funktionsrückgabetyp (dies ist in D zulässig) habe ich nie festgestellt, dass dies die Lesbarkeit beeinträchtigt, da ich beim Programmieren hauptsächlich an Struktur- / Enten-Schnittstellen denke, nicht an formale / nominative Typen.Darüber hinaus ist die Verwendung von IMHO
var
überall möglich ein gutes Beispiel für DRY. Der Typ von etwas sollte an einer und nur einer Stelle angegeben werden und dann automatisch weitergegeben werden, wann immer es weitergegeben werden muss. Wenn Sie verwendenvar
und sich der formale Typ der Variablen irgendwann ändern muss, werden die erforderlichen Änderungen vom Compiler automatisch überall dort weitergegeben, wo sie erforderlich sind, solange das Programm noch typenrichtig ist, anstatt dass der Programmierer jede Instanz manuell ändern muss . Dies ist eine gute Sache (TM).quelle
Ich denke, das ist am Ende eine Frage für das Team. Wenn es für niemanden in meinem Team lesbar ist, werde ich es nicht verwenden, obwohl ich einige Male versuchen könnte, sie mit Beispielen zu überzeugen, oder indem ich auf ana- loge Abkürzungen (wie + =) hinweise, die sie besser lesbar finden.
Wenn ich aber alleine arbeite dann finde ich ?? und uneingeschränkt lesbar. Sogar
ist für mich ziemlich eindeutig.
Ternäre Operatoren und
dynamic
sind natürlich eine andere Sache.quelle
var a = b ?? c ?? d ?? e ?? String.Empty ?? "";
String.Empty
jemals zurückkehrtnull
, werden wir verdammt viele kaputte Codes finden.Wenn ich kurz darüber nachdenke, sagt mir dieser Kommentar, dass die Person, die den Kommentar abgibt, ihn nicht so gut versteht, wie er / sie es sollte. Es ist höchstwahrscheinlich in bestimmten Situationen der Fall, aber im Großen und Ganzen schätze ich etwas nicht ein, das das C # -Team offensichtlich aufgrund der "Lesbarkeit" für wichtig genug hielt, um es hinzuzufügen. Ich habe dies in der gleichen Kategorie von
if(boolean_object)
vsif(boolean_object == true)
. Einige Leute argumentieren , dass die zweite besser lesbar ist, aber in Wirklichkeit ist es nur das Hinzufügen zusätzlichen Code für jemanden / Art zu lesen, und in manchen Situationen können mehr verwirrend (denkenif(boolean_object != false)
)Das C # -Team hat Ihnen erlaubt, nichts zu definieren, von dem Sie wissen, was es sein wird. Sofern ich nicht unbedingt definieren muss, was eine Variable sein soll (entweder ist es absolut wichtig, dass ein zurückgegebenes Objekt vom Typ x ist, oder es ist wirklich nicht lesbar), verwende ich
var
.var x = "MY_STRING";
Ich weiß, dass es eine Saite ist, wenn ich sie mir ansehe. In Wahrheit ist es mir egal, dass es eine Saite ist, solange sie das tut, wofür ich sie brauche. Das Definieren des Variablentyps ist zu meinem Vorteil und nicht zum Vorteil des Compilers. Wenn etwas nicht stimmt, teilt der Compiler mir mit, wann es ausgeführt wird, wenn ich den falschen Variablentyp habe.quelle
Das
var
Schlüsselwort wird meiner Meinung nach am besten in den Situationen verwendet, für die es ursprünglich eingeführt wurde - LINQ-Abfragen. In diesen Abfragen hat der Typ des zurückgegebenen Ergebnisses häufig einen großen verschlungenen Namen, der schwer im Voraus zu bestimmen ist und dem Leser nicht hilft, die Funktionsweise Ihres Codes zu verstehen.Allerdings
var text = "Some text " + variableName + "some more text."
ist das nur faul.BEARBEITEN: @Jorg Sie haben auf eine gezielt vereinfachte Antwort gesprungen, aber nichts zur Diskussion hinzugefügt. OK, wie wäre es damit für ein besseres Beispiel:
var items = doc.DocumentElement.FirstChild.ChildNodes;
Wenn Sie den Typ daraus herausfinden können, gebe ich Ihnen einen Keks.quelle
"Some text "
es sich um ein handeltstring
, haben Sie viel größere Probleme als die Anzahl dervar
s in Ihrem Code.var
; Das Problem ist der beschissene Variablenname "items". Wenn Sie einen guten Variablennamen verwenden, ist nichts falsch daranvar
.Ich habe ein grundlegendes Problem mit der Verwendung von var.
In diesem Beispiel ist alles Seite an Seite, aber das Problem sind wirklich große Lösungen mit gemeinsam genutzten Bibliotheken oder Projekten.
Bedenken Sie:
Was passiert, wenn GetMeAnObject von einer anderen Person geändert wird, um es ihren Bedürfnissen anzupassen?
Die MainProgram-Methode hat einen großen roten Fehler bei .PerformOperation (). Was ist passiert? PerformOperation hat vorher einwandfrei funktioniert. Wir sehen uns die Methoden in theObject an und sie sind einfach spurlos verschwunden. Es war das letzte Mal dort und wir brauchen diese Methode. Sie könnten eine lange Zeit damit verbringen, Ihren Schwanz zu jagen und herauszufinden, warum MyFirstObject, wenn es eine Methode namens PerformOperation hat, jetzt nicht mehr sichtbar ist. Jeder "weiß", dass GetMeAnObject ein MyFirstObject zurückgibt. Es macht also keinen Sinn, das zu überprüfen.
Wenn Sie theObject explizit eingegeben hätten, würde in der Zeile, die GetMeAnObject aufruft, ein ungültiger Besetzungsfehler auftreten, und es wäre verblüffend, dass GetMeAnObject einen Typ zurückgibt, der nicht Ihren Erwartungen entspricht.
Kurz gesagt bedeutet explizite Deklaration, dass Sie wissen, was die Fehler bedeuten. Eine ungültige Umwandlung bedeutet, dass Sie einen Typ erwartet haben und ein anderer Typ zurückgegeben wurde. Ein nicht erkanntes Mitglied bedeutet, dass das Mitglied nicht erkannt wurde.
quelle
var
? Von der Sprache kann nicht erwartet werden, dass sie vor solchen Verhaltensweisen schützt. Was wäre, wenn sie MyFirstObject direkt geändert hätte? Es wäre immer noch kaputt gegangen, aber keine Syntax hätte Sie davon abhalten können. Ich würde dies sogar als Stärke betrachtenvar
: Was wäre, wenn Sie statt MySecondObject jetzt stattdessen IMyFirstObject zurückgeben würden?