Functions and Delegates
Function can be thought of as containing reusable code. Functions also have an advantage of making the code more readable, as you can use them to group related code together.
The Parameter and return value of a function collectively define the signature of a function.
Function overloading is a technique that allows you to provide multiple functions with the same name, but different signatures.
A delegate is a variable type that allowes you to use functions indirectly. The same delegate can be sued to call any function that matches a specific signature, giving you the ability to choose between several functions at runtime.