首先是关于这个keyword
delegates
delegates我的理解是一个指向函数的指针,我们要预先声明这个指针可以指向的函数的签名。代码如下
delegate int Sample( int x, int y );
这里声明了一个sample是有两个参数的函数的指针
class Class2 { public int method( int x, int y ) { return x*y; } } class Class1 { static void Main(string[] args) { Class2 instance = new Class2(); Sample mySample = new Sample(instance.method); int result = mySample( 2, 3 ); Console.WriteLine( result ); } }
然后我们在使用的时候可以如上,mysample就是一个指向class2中method的函数,当然对应的是实例化后的Class2也就是instance的指针
那么既然已经有了一个函数名我们为什么要多此一举再造一个委托(其实我觉得这个翻译还不如直接说函数指针来的明白)呢?
来说一下这个委托有哪些妙用吧
我们来看下面这个例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { delegate void Sample(int x,int y); class sizeyunsuan { public void mult(int x,int y) { Console.WriteLine("相乘的结果是{0}", x * y); } public void plus(int x,int y) { Console.WriteLine("相加的结果是{0}", x + y); } public void minus(int x, int y) { Console.WriteLine("相减的结果是{0}", x - y); } public void divide(int x, int y) { if ( y == 0 ) { Console.WriteLine("0不能当做除数"); return; } int p = gcd(x, y); x = x / p; y = y / p; if (y != 1) Console.WriteLine("相除的结果是{0}/{1}", x , y); else Console.WriteLine("相除的结果是{0}", x); } private int gcd(int x, int y) { if (x == 0) return y; return gcd(y % x, x); } } class Program { static void Main(string[] args) { sizeyunsuan test = new sizeyunsuan(); Sample nowSample; nowSample = test.plus; nowSample += test.minus; nowSample += test.mult; nowSample += test.divide; nowSample(8, 3); nowSample(8, 4); Console.ReadLine(); } } }
这里面我们的nowSample就是一个函数指针,对应四则运算
先贴结果
这里我们完成了多个函数的大一统哈哈哈哈哈哈
其实就是我们对于同类的函数,都要调用的话,可以把它们一个一个的加入到这个指针上面,只要是同类(签名一样)
比如这里我的四则运算就是对于给定的xy都要进行加减乘除运算,那么我们就可以这样写,当然在我这个例子里面还体现不出来,但是真的写应用的时候很多时候我们很多东西要做的都是一样的工作,而把多个类似的函数进行一个一个调用至少我们也要把每个函数签名写一遍不是,而这样加到这个指针后面就只要一遍以后再用的时候就可以直接用啦
之后还提及了async和await关键字的使用,示例
public async Task<int> ExampleMethodAsync() { var httpClient = new HttpClient(); int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length; ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n"; return exampleInt; }
因为我并没有太明白如何使用之后查阅了一些网上的文章,大概了解了async可以将程序变为异步执行,而await则可以让单线程的某处堵塞如果停住了不用所有的都等待这一步的堵塞,可以异步的就不再等待(不知道对不对
https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
这里有详细的介绍,看了一遍大概理解了一点,准备下次上课之前再看一遍(留做记录)