2014-06-24 4 views
6

Für mich bestehende Werte Shadowing wie beschrieben in:Gibt es eine Möglichkeit, Warnungen für die Spiegelung von Werten in F # in Visual Studio zu haben?

Shadowing and Nested function
immutable in F#
f# duplicate definition
FSharp for fun and profit comment

gegen den Begriff Sicherheit der Unveränderlichkeit und die Art zu gehen scheint, das F # so stark macht. Shadowing in F # funktioniert different als in C#. Es dauerte nur einige Zeit, bis ich herausfand, dass ein Fehler in meinem Code auf unbeabsichtigtes Beschatten eines Namens im selben Bereich zurückzuführen war. Gibt es eine Möglichkeit, Compiler-Warnungen zum Spiegeln von Werten in VS zu haben?

Ich weiß, dass es in einigen Fällen nützlich sein kann. zum Beispiel für Checked Aritmetics.

+2

Shadowing ist nützlich, wie hier herausgestellt: http://infsharpmajor.wordpress.com/. Vielleicht möchten Sie erklären, was Sie denken, Shadowing ist, wie es sein kann, dass Ihr Verständnis aus ist, und Clearing das kann Ihre Bedenken lösen. –

+0

@Goswin: Die [F # Power Tools] (http://visualstudiogallery.msdn.microsoft.com/136b942e-9f2c-4c0b-8bac-86d774189cff) werden Referenzen hervorheben, die dabei helfen können, diese Arten von Fehlern zu vermeiden. – Daniel

+0

@JamesBlack Ich habe meine Frage bearbeitet, um klarer zu sein – Goswin

Antwort

3

Shadowing hat Vor- und Nachteile. Ich habe auch Bugs aufgrund von Fett-Fingered Shadowing Bemühungen aufgetreten. Auf der positiven Seite kann es helfen, Ihren variablen Platz sauber zu halten, wie @JoelMueller darauf hingewiesen hat.

Shadowing Bugs unterscheiden sich grundlegend von veränderbaren Bugs. Sie sind von der Tippfehler-Sorte. Sie lassen sich viel einfacher analysieren: Der Verlust historischer Informationen wird im lexikografischen Kontext gegenüber dem Umweltkontext minimiert. Das heißt, mit Shadowing können Sie den Wert einer Bindung durch das mentale Stack-Enrolling immer sauber verfolgen, während variable Mutationen das schaffen, was im Wesentlichen Gotos ist (Sprung zur Adresse).

Praktisch eliminiert Shadowing immer noch ganze Klassen von Fehlern. Sie werden keine "gruseligen Aktionen aus der Ferne" erleben. Es treten nämlich keine Probleme mit Variablen auf, die in Closures oder Variablen erfasst sind, die in verschachtelten Bereichen relativ zum aktuellen Bereich geändert werden.

4

Eine Stelle, die ich Shadowing verwende, ist die Auflösung eines optionalen Parameters auf einen Standardwert, wenn kein Wert angegeben wurde.

member x.Foo(?myFlag: bool) = 
    let myFlag = defaultArg myFlag false 
    ... 

Auch F # Interactive, so, wie es jetzt implementiert ist, würden so ziemlich vollständig nicht-funktionsfähig sein, wenn wir nicht Shadowing haben.

Verwandte Themen