diesen Code-Schnipsel Betrachten und versuchen zu erraten, was y1
und y2
zuWarum geben diese beiden Funktionen nicht den gleichen Wert zurück?
static class Extensions
{
public static Func<T> AsDelegate<T>(this T value)
{
return() => value;
}
}
class Program
{
static void Main(string[] args)
{
new Program();
}
Program()
{
double x = Math.PI;
Func<double> ff = x.AsDelegate();
Func<double> fg =() => x;
x = -Math.PI;
double y1 = ff(); // y1 = 3.141..
double y2 = fg(); // y2 = -3.141..
}
}
Man könnte sagen, -Aha- Doppel ist ein Wert, Typ und so der Wert durch die Extension-Methode zurückgegeben wird, ist eine Kopie der Haupt x
. Aber wenn Sie das oben genannte in Delegaten von Klassen ändern, sind die Ergebnisse immer noch anders. Beispiel:
class Foo
{
public double x;
}
Program()
{
Foo foo = new Foo() { x=1.0 };
Func<Foo> ff = foo.AsDelegate();
Func<Foo> fg =() => foo;
foo = new Foo() { x = -1.0 };
double y1 = ff().x; // y1 = 1.0
double y2 = fg().x; // y2 = -1.0
}
Also die beiden Funktionen müssen zwei verschiedene Instanzen der gleichen Klasse zurückgeben. Es ist interessant, zu berücksichtigen, dass ff()
trägt mit ihm einen Verweis auf lokale Variable foo
, aber fg()
nicht und stützt sich auf das, was in ihrem Umfang ist zur Zeit.
Was passiert also, wenn diese beiden Delegaten an andere Teile des Codes weitergegeben werden, die keine Sichtbarkeit für die foo
Instanz haben? Irgendwie wird die Frage, wer welche Information (Daten) besitzt, immer weniger klar, wenn Erweiterungsmethoden mit Delegierten kombiniert werden.
Nod zu dieser Antwort wegen der Kürze + Klarheit + Format. – ja72
Meh ... It a: bindet nicht an einen * Wert * von irgendetwas (außer dem Compiler - erzeugt Capture-Klassen-Instanz), und b: bindet nicht strikt an "x" * überhaupt * - klarer ja, aber ich denke, vielleicht ein bisschen irreführend aufgrund dieser Einfachheit. (Einfachheit ist aber gut) –
@Marc - es ist ein Wurf. Ich dachte mir, dass ich mich darauf konzentrieren sollte, wie es einem Benutzer erscheint, anstatt in die Art und Weise zu tauchen, wie es implementiert wird. – Bevan