Python for the .NET Developer Transcripts
Chapter: The Python Language
Lecture: C# closures
0:00 I want to talk about another function feature of C# that's pretty interesting. I suspect it's not used that often.
0:15 So the idea of a closure is I've got some function going to pass some data to it. And then that functions going to create another function here.
0:27 And that other function is going to capture or get the closure of these variables that were ambient to it.
0:35 Kind of like globals but only within this function which was only defined temporarily. Then when you execute that function later
0:43 we're going to return it. When we execute it later its actually going to remember these. It's just like we went and created a counter
0:50 little method does counting. We created a counter object a Counter class and gave it two member variables. Where does it start? Actually 3.
0:58 What is its start value and its counter ID. And then each time you call execute or something on it it can work with those values.
1:05 Same thing here except for not creating a class. It's just a function. So notice this delegate that we're creating has it's void, it has no arguments.
1:14 And yet it's working with start which is defined right here. So we're working with counter idea which is defined there. And its working with starterVal
1:22 which comes in here like this. So we're going to call this CreateCounter. It's going to describe what it's doing creating counter with this.
1:29 Create a function that does not execute. We're just handing it back. But it's now captured that state that is erased when the function returns.
1:36 So it hangs on to it really funky. So we're going to call CreateCounter with 7 and then an id of 1 and CreateCounter with -100 and an id of 2.
1:46 We call counter1() it goes and increments 7 to 8. And we call it again down here it goes 8 to 9, 9 to 10. But this one called with different values
1:56 actually has different like state captured in it. It's different closures. So it'll be like -100 to -99 and so on.
2:03 So let's just run this and see what we get. Check this out this is crazy. I called a function pass it some arguments
2:09 and then I called it again and again each time being void and yet it remembers that it's id was 1 it's start value was 7 and it's current value is 10.
2:18 First 8, 9, and then 10 it holds on to this. It's a really interesting idea of how to pass additional data.
2:25 It might seem crazy like why would I ever use this. Well, imagine you have a lambda expression and your trying to do a sort and you need to use data.
2:32 Its ambient to the current scope but there's no way within that lambda function to pass it over like your passing it through the list
2:40 and the list only passes what it passes. So you can use closure or this capture stuff to actually get additional information or values
2:48 into these lambda expressions. Alright, really really cool stuff. This is how you do it in C#. All you do is you have a function
2:57 a delegate in this case could be a lambda expression as well. And all you have to do is just use the values
3:03 here with you know that come from the outside use them inside and now their captured and held onto forever.
3:09 And they can even you saw they can be changed right? Like the start keeps getting changed and changed and changed to remembered between calls
3:19 up here. So that's closure in C#