20170102
明天期末考试,半年一晃又过去了,时间就像沙子,抓着漏着。
今天学到一半心情焦躁的不行,哦多Kie
20161112
1、为什么要使用委托
将一个方法作为参数传递给另一个方法。
参数都是有类型的,现在方法作为参数的时候类型是委托类型。
下面我们写了3个方法很相似,我们想简化,怎么办?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1为什么使用委托
{
class Program
{
static void Main(string[] args)
{
//不使用委托
//三个需求
//将一个字符串数组中的每个元素都转换成大写
//将一个字符串数组中的每个元素都转换成小写
//将一个字符串数组中的每个元素每个元素两边都加上双引号
string[] names = { "aCJHKbd", "JdcKlndla", "sHKssa" };
//方法的调用语法:
// 类名.方法名([参数]);
//***在某些情况下,类名是可以省略的,如果你写的方法跟Main()函数同在一个类中,这个时候,类名可以省略。
//ProStrToUpper(names);
//ProStrToLower(names);
ProStrToSXH(names);
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
public static void ProStrToUpper (string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToUpper();
}
}
public static void ProStrToLower(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToLower();
}
}
public static void ProStrToSXH(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = "\"" + name[i] + "\"";
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1为什么使用委托
{
class Program
{
static void Main(string[] args)
{
//不使用委托
//三个需求
//将一个字符串数组中的每个元素都转换成大写
//将一个字符串数组中的每个元素都转换成小写
//将一个字符串数组中的每个元素每个元素两边都加上双引号
string[] names = { "aCJHKbd", "JdcKlndla", "sHKssa" };
//方法的调用语法:
// 类名.方法名([参数]);
//***在某些情况下,类名是可以省略的,如果你写的方法跟Main()函数同在一个类中,这个时候,类名可以省略。
//ProStrToUpper(names);
//ProStrToLower(names);
ProStrToSXH(names);
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
public static void ProStrToUpper (string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToUpper();
}
}
public static void ProStrToLower(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = name[i].ToLower();
}
}
public static void ProStrToSXH(string[] name)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = "\"" + name[i] + "\"";
}
}
}
}
}
使用委托
namespace 委托学习20170102
{
public delegate string DelProStr(string name);
class Program
{
static void Main(string[] args)
{
string[] names = { "aCJHKbd", "JdcKlndla", "sHKssa" };
ProStr(names, delegate (string name)
{
return name.ToUpper();
});
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
{
public delegate string DelProStr(string name);
class Program
{
static void Main(string[] args)
{
string[] names = { "aCJHKbd", "JdcKlndla", "sHKssa" };
ProStr(names, delegate (string name)
{
return name.ToUpper();
});
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
public static void ProStr(string[] name, DelProStr del)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = del(name[i]);
}
}
}
}
public static void ProStr(string[] name, DelProStr del)
{
for (int i = 0; i < name.Length; i++)
{
name[i] = del(name[i]);
}
}
}
}
2、委托的概念,语法
声明一个委托类型
委托所指向的函数必须跟委托有同样的签名(同样的函数类型,同样的参数)。
3、匿名函数
匿名函数本质上还是一个函数。
同样有参数和方法体,但是没有名字,名字用delegate(声明委托的关键字)代替。
什么时候使用呢?
当这个方法只使用一次的时候考虑实用匿名函数。
4、练习:使用委托求数组最大值
5、泛型委托
6、多播委托
7、lamda表达式
8、使用委托实现窗体传值
C#中委托如何使用?
C#中委托如何使用?
谢谢大家
详细一点
由于上述几个函数涉及多线程调用,本人对此不甚了解,不再赘述。
相对于这些原理性的东西,相信大家更加关心的是委托的用法,
5.对于委托的用法,我还要补充两点。一是匿名方法,一是Lamda表达式。
由于一些方法很少被调用委托之外的任何程序调用,从
生产效率
的角度来说,手工定义一个由委托对象调用的方法有点繁琐。为解决这一情况,可以在事件注册时直接将一个委托与一段代码相关联,这种代码的正式名称是匿名方法。
6.如下例:
已经定义了public delegate int IntCalc(int x,int y)
我们可以这样进行注册
IntCalc cal =new IntCalc( delegate(int x , int y){ return x + y};);
匿名方法可以使我们访问定义它们的方法的局部变量,这些局部变量称为匿名方法的外部变量。
如
int t;
IntCalc cal = delegate(int x , int y){ return x * y*t};
Lamda表达式提供了更为简单的匿名方法注册方式,彻底简化了对.NET委托类型的使用。
Lamda表达式是这样编写的,首先定义一个参数列表,“=>”标记紧随其后,然后就是表达式。表达式可以理解为:ArgumentToProcess => StatesToProcessThem.
上述委托注册可以写为
IntCalc cal =new IntCalc( ( x, y)=>(x+y));
7.委托可以在泛型中得到广泛应用,利用委托,我们可以自定义大小比较、匹配等的规则,从而可以很方便的调用List自带函数,免去许多不必要的麻烦,大大提高编程效率。