I am wondering whether I can use the this
keyword inside a C# lambda, although actually I know that I can but I want to make sure that this isn't a bad thing or will produce subtle issues later on.
Having read the rules on variable scope for lambdas, I can see that:
A variable that is captured will not be garbage-collected until the delegate that references it goes out of scope.
So this leads me to assume that an object instance (this
) will also be captured. To test this I wrote this contrived example which is what I want to approximately aim for in my real code - written in LINQPad, hence why I have the Dump()
method calls:
void Main()
{
Repository repo = new Repository();
Person person = repo.GetPerson(1);
person.ID.Dump("Person ID - Value Assigned");
person.Name.Dump("Person Name - Lazily Created");
}
class Person
{
public Person(Lazy<string> name)
{
this.name = name;
}
public int ID { get; set; }
private Lazy<string> name;
public string Name
{
get { return name.Value; }
}
}
class Repository
{
public Person GetPerson(int id)
{
// Setup person to lazily load a name value
Person person = new Person(
new Lazy<string>(
() => this.GetName() // <--- This I'm not sure on...
)
);
person.ID = id;
return person;
}
public string GetName()
{
return "John Smith";
}
}
This runs and gives me the correct output so accessing this
from within a lambda clearly works. What I am wanting to check though is:
- Does this follow the same variable scope rules as local variables, meaning that the
this
reference is kept in memory until the lambda is not used anymore? It would appear so from my little experiment but if anyone can give further details I'd be interested. - Is this advisable? I do not want to get into the situation later where this pattern could cause problems.