Ich möchte benutzerdefinierte Lazy<T>
Klasse implementieren, nur um es zu implementieren. Interessant ist, dass wenn ich die Funktion an den Konstruktor übergebe, kann ich im Debugger bereits sehen, dass das Objekt innerhalb der Funktion erstellt wurde, obwohl der eigentliche Aufruf innerhalb von Value
liegt. Ist das, weil Debugger die _func
selbst auswertet oder verstehe ich einfach nicht, wie Func<>
funktioniert?Visual Studio wertet func im Debugger aus, bevor es aufgerufen wird
class Program
{
static void Main(string[] args)
{
var lazyObj = new LazyTest<Entity>(() => new Entity { Foo = 5 }); // Debugger shows that Entity is already created here and Foo = 5.
var entity = lazyObj.Value; // Creation of Entity should happen here.
Console.WriteLine(entity.Foo);
Console.Read();
}
}
public class Entity
{
public int Foo { get; set; }
}
public class LazyTest<T>
{
private T _value;
public T Value
{
get
{
if (_value == null)
_value = _func();
return _value;
}
}
private Func<T> _func { get; set; }
public LazyTest(Func<T> func)
{
_func = func;
}
Ich fand, dass Lazy<T>
intern verwendet Eigenschaft internal T ValueForDebugDisplay
, aber ich bin nicht 100% sicher, ob dies eine Antwort auf meine Frage.
Erstellt aber meine aktuelle Implementierung das Objekt oder erstellt der Debugger es, um es anzuzeigen? Wann wird der Speicher für das Objekt zugewiesen? Bevor "Value" oder danach aufgerufen wird? – FCin
Der Debugger erstellt es, um es Ihnen im Fenster Lokal anzuzeigen. Es passiert, wenn der Debugger den Haltepunkt erreicht, habe ich einige Möglichkeiten hinzugefügt, dieses Problem oben zu nähern, viel Glück :) –
Eigentlich haben Sie Recht. Ich habe eine 'Console.WriteLine' eingefügt, um zu sehen, wann sie gedruckt wird und sich herausstellt, dass sie ausgedruckt wird, wenn ich' Value' aufruft oder im Debugger nach 'Value' suche. – FCin