C# -委託、泛型委託、匿名方法、Lambda表示式
阿新 • • 發佈:2019-01-12
前言 |
這幾天一直在回顧之前的知識,不是常用的都已經忘記了,俗話說得好,書到用時方恨少。之前對於委託一直都是雲裡霧裡的,在此總結一下,以便日後檢視!
委託 |
- 委託(delegate):委託是一種資料型別,像類一樣,可以宣告委託型別的變數,它可以將方法當做另一個方法來進行傳遞。
- 委託(delegate)至少0個引數,至多32個引數,可以無返回值,也可以指定返回值型別。
例項 |
namespace 委託 { class Program { static void Main(string[] args) { MyDelegate md = new MyDelegate(M1); //呼叫md委託的時候就相當於呼叫的M1方法 md(); Console.ReadLine(); } static void M1() { Console.WriteLine("我是一個沒有返回值沒有引數的方法"); } } //定義了一個名字叫MyDelegate的型別,並且這個型別是個委託,而且只能儲存沒有返回值,沒有引數的方法 public delegate void MyDelegate(); }
很好理解的一個例項,當然委託的用處不僅於此!
匿名方法 |
匿名方法:不能直接在類中定義,而是在給委託變數賦值的時候,需要賦值一個方法,此時可以“現做現賣”,定義一個匿名方法傳給委託。這個匿名方法我們要熟悉他的語法,後面我會介紹lambda表示式。
例項 |
namespace 匿名方法 { class Program { static void Main(string[] args) { Mydelegate md = delegate () { Console.WriteLine("我是一個現做現賣的匿名方法"); }; md(); Console.Read(); } } public delegate void Mydelegate(); }
lambda表示式 |
lambda表示式就是對匿名方法的一個升級,變得更方便了,語法如下。
namespace 匿名函式
{
class Program
{
static void Main(string[] args)
{
//無引數用小括號代表
MyDelegate md = () => { Console.WriteLine("lambda表示式!"); };
//有引數直接傳引數,不用傳遞資料型別,委託已經限定資料型別
MyDelegate1 md1 = m => { Console.WriteLine(m); };
md();
md1("大家好");
Console.ReadLine();
}
}
//有引數的委託
delegate void MyDelegate1(string msg);
//無引數的委託
delegate void MyDelegate();
}
泛型委託 |
說到泛型委託,首先要明白為什麼要有泛型委託,如果我們有三個方法,這三個方法的引數的資料型別都不同。這時我們就要定義三個委託,程式猿是聰明的,泛型委託解決了這一問題。
例項 |
namespace 泛型委託
{
class Program
{
static void Main(string[] args)
{
//泛型委託
MyGenericDelegate<string> md = M1;
md("我是引數為string型別的方法");
MyGenericDelegate< int > md1 = M1;
md1(250);
Console.Read();
}
static void M1(int j)
{
Console.WriteLine(j);
}
static void M1(string msg)
{
Console.WriteLine(msg);
}
}
//泛型委託
public delegate void MyGenericDelegate<T>(T args);
}
微軟也是很愛程式猿的,編譯器自帶了一個泛型的委託Action,它有16個過載,用起來非常的方便**
namespace 泛型委託
{
class Program
{
static void Main(string[] args)
{
Action action1 = new Action(M1);
action1();
Action<string> al = M1;
al("我是引數為string型別的方法");
Action<int> al1 = M1;
al1(250);
}
static void M1()
{
Console.WriteLine("我是一個無引數的方法");
}
static void M1(int j)
{
Console.WriteLine(j);
}
static void M1(string msg)
{
Console.WriteLine(msg);
}
}
}
說到這裡,可能會有大佬想到這些都是無返回值的,如果我的方法是有返回值的怎麼辦,這時候不要慌,我都說了微軟是愛程式猿的,Func解決了這個問題,和Action的使用方式一樣它只是帶返回值的。
namespace 泛型委託
{
class Program
{
static void Main(string[] args)
{
//第四個int表示返回值的資料型別
Func<int, int, int, int> fun =(M1);
int result= fun(1, 2, 4);
Console.WriteLine(result);
Console.Read();
}
static int M1(int n1, int n2, int n3)
{
return n1 + n2 + n3;
}
}
}
總結 |
委託真的好強大,以後也會經常遇到,希望這篇部落格對您有幫助。做了固然重要,知道為什麼要這樣做更重要。如有大佬發現問題,我們一起交流學習!