Frage

Ich habe ein paar Mal durch Aussagen in VB.NET (nicht sicher, ob dieser Effekt existiert in C #) gebissen, die zu sein scheinen sich selbst verweisende, aber wenn sie ausgeführt sind, dass sie nicht wirklich etwas tun weil sie ein Ziel benötigen und man ist nicht vorgesehen. Zum Beispiel:

Dim MyString as string = "String to test"

' Neither of these lines do anything '
MyString.Replace(" ", "-")
MyString.Substring(0,5)

' This will return the original string, because neither statement did anything '
Messagebox.Show(MyString)

In beiden Fällen scheint es nicht zu stören, .NET, dass die Aussage ein Ziel muss das Ergebnis, vergeben und ich ihm nicht eine geben. Gibt es einen Grund, dass die IDE / Compiler mich nicht warnen vor diesem Effekt oder, dass eine Ausnahme „StatementDoesntDoAnything“ nicht geworfen? Da der Code in einer solchen Art und Weise ausgebildet ist, dass sie nie etwas ändern wird, es ist eindeutig falsch eingegeben.

War es hilfreich?

Lösung

Es kann schwer sein zu sagen, dass der Rückgabewert ignorieren ist nicht beabsichtigt, da einige Funktionen einig Nebeneffekte tun und gibt einen Wert zurück.

Funktionen, die „nur“ Rückgabewerte müßten als solche gekennzeichnet sein die Compiler zu haben, sie überprüfen, und das hat nur keine Priorität oder beurteilt genug gewesen, um Return on Investment haben (offensichtlich, sonst würden sie getan haben, es:.)

Andere Tipps

Ja, es wäre toll, wenn Methoden, die keine Nebenwirkungen haben könnte mit irgendeiner Art von [NoSideEffectsAttribute ()] markiert werden, so dass Tools wie Compiler können Sie warnen, aber derzeit nicht so etwas ist mir bekannt.

Aber man kann FxCop versuchen, kann es viel subtiler Programmierfehler auf .NET-Assemblies erkennen.

Es gibt viele Fälle, in denen Methoden Werte zurückgeben, die vom Programmierer optional behandelt werden. Es gibt keine Möglichkeit für den Compiler zu wissen, dass diese spezielle Methode nichts tut. Es könnte eine Nebenwirkung hat und die Tatsache, dass Sie wählen, nichts mit dem Rückgabewert der Methode zu tun hat eine bewusste Entscheidung von Ihrer Seite sein.

Wenn der Compiler Sie jeder Instanz zu warnen wählen, dass dies passiert ist, dann werden Sie zu viele falsche Warnungen erhalten.

Es ist oft schwierig für den Compiler, um zu bestimmen, ob die Funktionen „etwas tun“. Es sei denn, der Compiler tut strenge Inter-Verfahrensanalyse (IPA), kann es nicht, wenn die Funktion bestimmen Anruf hat einen Nebeneffekt.

IPA ist ein langsamer Prozess, der erheblich die Compiler Speicheranforderungen erhöht so standardmäßig die meisten Compiler tun dies nicht aus.

Dieses Verhalten geerbt von C, C ++, und wurde orioginally so getan, dass Sie, ob oder nicht verwenden, um von einer Funktion / Methode den Rückgabewert wählen können ... Wenn schreiben Sie eine Funktion / Methode, die ein paar Sachen tut und gibt dann einen Wert, wenn Sie es nennen, haben Sie die Möglichkeit des Schreibens

variableName = functionName([parameterlist]);  

Wenn Sie den returnb Wert in etwas verwenden möchten, oder einfach nur

functionName([parameterlist]);  

Wenn Sie dies nicht tun.

Für die Funktions Methoden, die keine Nebenwirkungen haben (wie die, die Sie erwähnen), wie Sie erwähnt, ist dies nicht ganz sinnvoll, aber es für neue Sprachen zu ändern würde der langen Geschichte von vielen, vielen anderen Sprachen ausführen, die konform diese Norm ...

Ich bin nicht sicher, ob noch ein weiteres Schlüsselwort mit zu zwingen oder nicht dem Rückgabewert setzt in eine Variable wäre eine gute Idee für verschiedenen Grund sein

1) Angenommen, Sie ein Schlüsselwort hinzufügen, wenn der Rückgabewert optinal ist (daher impliziert es ist in der Regel vorgeschrieben) würde dazu führen, viele Code kompilieren zu stoppen oder ausgegebene Tonnen Warnung

2) Angenommen, Sie das Gegenteil tun, das Hinzufügen eines Schlüsselwort, wenn der Rückgabewert gezwungen wird, einfach einige Leute Dummy-Variablen verwenden würden, um sie zu speichern und halten sie den Weg mit Ther verwendet.

3) Ich glaube nicht, viele Menschen tatsächlich die Zeit, darüber nachzudenken, nehmen würde, ob der Rückgabewert optional ist oder nicht. In einigen Fällen habe ich es gegeben zugeben, aber nicht immer.

Betrachten wir die Methode Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value): es überprüft, ob der Schlüssel im Wörterbuch enthalten ist, und wenn es ist, setzt es den Wert in die out Parameter. Der Rückgabewert ist ein bool der angibt, ob die Operation erfolgreich war. Manchmal kümmern Sie; manchmal nicht. Ich denke, dass dies ein ziemlich akzeptierter Ansatz ist für Methoden wie diese; wenn der Compiler Sie gezwungen, den Rückgabewert einer Variablen zugewiesen werden, würden die Leute wie diese eine Menge Code haben:

int someValue = 0;
bool discard = IntDictionary.TryGetValue("key", out someValue);

// I don't even care if discard is true or false;
// someValue will be 0 if it wasn't in IntDictionary
  

Ich habe ein paar Mal durch

gebissen

Springen zu Schlussfolgerungen, die nicht durch

  

Aussagen in VB.NET ... dass ... nicht wirklich etwas tun

aber die eigentlich sehr gut dokumentiert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top