This is part 3 in a series about state and function pointers; part 1 is here.
Last time, we saw that it is impossible to bundle context along with a function pointer in C.
In C#, it is possible to fully achieve my standard example. In order to explain how this works behind the scenes, I will limit this post to C# 1.0 and not use a lambda expression. This also means no LINQ, generics, or extension methods, so I will, once again, need to write the filter method myself.
delegate bool IntFilter(int num); static ArrayList Filter(IEnumerable source, IntFilter filter) { ArrayList retVal = new ArrayList(); foreach(int i in source) if (filter(i)) retVal.Add(i); return retVal; } class GreaterThan { public GreaterThan(int b) { this.bound = b; } int bound; public bool Passes(int num) { return num > bound; } } int x = 2; int[] numbers = { 1, 2, 3, 4 }; Filter(numbers, new IntFilter(new GreaterThan(x).Passes));
Please excuse the ugly code; in order to be true to C# 1.0, I can’t just write an iterator, and I can’t implicitly create the delegate.
This code creates a class called GreaterThan
that holds the Passes
method and the state used by the method. I create a delegate to pass to Filter
out of the Passes
method for an instance of the GreaterThan
class from the local variable.
To understand how this works, we need to delve further into delegates. .Net delegates are more than just type-safe function pointers. Unlike the function pointers we've looked at, delegates include state – the Target
property. This property stores the object to pass as the hidden this
parameter to the method (It's actually somewhat more complicated than that; I will describe open and closed delegates at a later date). My example creates a delegate instance in which the Target
property points to the GreaterThan
instance. When I call the delegate, the Passes
method is called on the correct instance from the Target
property, so it can read the bound
field.
Next time, we'll see how the C# 2.0+ compilers generate all this boilerplate for you using anonymous methods and lambda expressions.
4 comments:
Thanks for your sharing. Hope you can contribute more quality posts to this page. Thank you!
nodejs quiz
This curiosity you describe is fantastic Rita
The above article is nice and interesting, thank you willing to share! Greetings success of admin Percetakan Murah Rawamangun Jakarta Timur wish you deign to visit my website, thank you :)
I advise you to check https://writemyessay4me.org/blog/computer-science-career out if you want to know more about computer science career. It will help you to achieve success
Post a Comment