Delegates in VB.NET
Delegates are similar to function pointers in C, C++. Now, you would be wondering what a pointer is, if you do not know C, C++, or Java. Here, below is a simple example:
Public Class ShabsSampleClass
Sub DoSomeWork(ByVal strWork As String)
Console.Write(strWork)
End Sub
Sub Main()
Dim strDiggingWork As String
strDiggingWork = "Start Digging the Ground"
DoSomeWork(strDiggingWork)
End SubEnd Class
Great, now, think of passing a function as a parameter. What did I say? Some function as parameter. What does that mean? It means there would be some function like GetSomeWork
which will accept function as a parameter, and you will pass DoSomeWork
as a parameter to this function. Yes, you can do this in .NET. If you didn't know this, it would be a wow for you. It happens to me too.
When you are passing Function as parameter, it is known as Delegate
All the events like mouseclick, keypress, ApplicationStart (in ASP.NET), etc., handle some delegate in .NET. You won’t be knowing it, but VS IDE (Visual Studio Integrated Development Environment) does it for you.
A few things you should know about a Delegate
- Declaration Delegate is like a normal Procedure/Method in VB.NET which accepts
a parameter but doesn’t return Sub in case of a Sub method and type in case of
a Function.
- Delegate does not return any type value. Technically, a Sub delegate returns
a Sub pointer but for now, keep in mind, they do not return any value.
- Delegates have only declaration, they do not have any body.
Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)
- To use a Delegate, you need to attach some function to it. Delegates on
their own do not do anything.
Here is an example of how to use a Delegate:
Public Class ShabsSampleClass
Sub DoSomeWork(ByVal strWork As String)
Console.Write(strWork)
End Sub
Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)
Public Sub GetSomeWork(ByVal someDelegateFunc As SomeWorkDelegate)
someDelegateFunc("Here is the work")
End Sub
Sub Main()
Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)
GetSomeWork(myWorkDel)
End Sub
End Class
What the hell is this, I can’t understand a thing! Don’t sweat, I will explain it to you below. To understand this, let us go line by line:
- First line
Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)
Here, in the line, you have declared a Delegate which will accept a String
as parameter. Now it will in future point to some function which would accept just one
String
as parameter. What if I have some function which has as input
two String
parameters? Sorry, folks, can’t use this delegate to point to your function, you need to declare another Delegate which has
as input two String
parameters.
- First function
Public Sub GetSomeWork(ByVal someDelegateFunc As SomeWorkDelegate)
someDelegateFunc("Here is the work")
End Sub
Here we have declared some function which would accept another function as parameter. It’s like I will accept some function as parameter which has only one parameter as string.
(ByVal someDelegateFunc As SomeWorkDelegate)
This parameter tells VB.NET that it is expecting some function as parameter which
has the same signature as the Delegate SomeWorkDelegate
i.e., only
one parameter as input, and that too, need to be String
. This means, I can pass all functions in the world to this function which have one
String
parameter. Well, there is some requirement, and I need to use this delegate function in my Function and hence I am using it. So now this function works only when I pass some parameter as
String
. E.g., someDelegateFunc("Here is the work")
.
What in this world, I need to do something like this. Well, if your world is some College Project or some novice Project, you don’t need to do this. This is because; you know all the function, which are there in your Project. You would directly use that, instead of doing this circus of declaring the delegate and using it.
But, you would some really Big project, like .NET framework itself, where there are 5000 classes and millions of function, and need to obey OOPS principle, and there are some 500 peoples working on this project, all across the Globe, i.e. there is some teams in US, India, Brazil, Canada, and so on! Here, you don’t know all the functions and need to add flexibility and scalability to you class you design.
But, even, in college Project, it good to use it, as who know, the code which you have written would change the world, and puffs, you few lines project will grow to millions lines code, and your core class will be use by all other people.
If you have use delegates, you don’t need to rewrite you core class again to adapt to other classes which depend on your Class.
I know, this is getting bit stretchy, and it long, for you to read, so I need to wind up here.
-
Main Function
Sub Main()
Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)
GetSomeWork(myWorkDel)
End Sub
Here, in main function is where, we are going to put every thing together.
Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)
Here, in your main function, you are declaring delegate which is private variable. And to this variable, you are attaching the ‘DoSomeWork’ function to this delegate. Why?
Because, down the in this function, you are going to use this delegate.
Since, I know ‘SomeWorkDelegate’ has one parameter, that too string, and there is another function ‘DoSomeWork’ which too has just one parameter, and too string. I am attaching this function to this delegate.
GetSomeWork(myWorkDel)
Here, I want to use function GetSomeWork, which take Delegate ‘SomeWorkDelegate’ as parameter, hence, I would use this function with the ‘myWorkDel’ as parameter. ‘myWorkDel’ is just the private delegate you have declare in above line and attach ‘DoSomeWork’ it
So, what would happen in GetSomeWork.
This function will receive ‘myWorkDel’ as parameter, which will point to ‘DoSomeWork’ method. Hence, it would actual work it does is, this line below in GetSomeWork,
someDelegateFunc("Here is the work")
to compiler will look like
DoSomeWork("Here is the work")
And rest you know. There is even more in to this event and delegate, I would refer in other, let say Part II post! For you.
Here, in this function DoSomeWork
, we have pass the String parameter. Now, you would be telling, what new in this, I already knew this. I know, even more, like you can pass class, object, multiple parameters and even param Arrays as parameter. So, what new in that!