C#高级编程----小结
2015-07-20 22:19
656 查看
总结
概括
委托是寻址方法的.NET版本,类似于C++中的指针.委托可以理解为指向函数的指针,它是类型安全的,定义了具体的参数和返回值.
定义一个委托,实际上是定义一个类,委托是对方法的引用,如方法Func,把功能交给委托的类来实现.
委托的作用:结合泛型,可以实现功能上的扩展(如针对整型的函数,可以通过委托指向多种函数,实现类中某个属性的比较).Lambda表达式需要使用委托定义.事件需要使用到委托.
Lambda表达式与委托直接相关.Lambda表达式可以理解成一个简单的方法定义(包括参数,返回值),表达式由委托来指向.
Lambda表达式的作用,减少代码量
事件,基于委托,为委托提供了一种发布/订阅机制.最直接的就是Button的Click事件.
委托案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
//定义一个委托
public delegate double DoubleOp(double x);
//定义委托的函数
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
static void Main(string[] args)
{
DoubleOp[] operations = { MultiplyByTwo, Square };
Console.WriteLine(operations[0](2));
Console.WriteLine(operations[1](2));
Console.ReadKey();
}
}
}
Action<T>委托和Func<T>委托
Action为返回值void的委托,Func为带返回类(最后一个参数为返回类型).
//DoubleOp[] operations = { MultiplyByTwo, Square };
Func<double, double>[] operations = { MultiplyByTwo,Square};
//上例中的这两句话可以互换
委托更多的拥簇是作为寒素的参数,可以把符合一定要求(参数,返回值一致)的函数作为参数传入其他函数(是不是和类似指针)
Lambda表达式
案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace zongjie
{
class Program
{
static void Main(string[] args)
{
string mid = ",2,";
//有花括号(多条语句的情况)的需要return语句
Func<string, string> lambdaTest = param =>
{
param += mid;
param += "3";
return param;
};
Console.WriteLine(lambdaTest("1"));
//没有花括号的会隐式添加一条return语句
Func<string, string> oneParam = s => string.Format("change up{0}",s.ToUpper());
Console.WriteLine(oneParam("test")); ;
Func<double, double, double> twoParams = (x, y) => x * y;
Console.WriteLine(twoParams(3,2));
Func<double, double, double> twoParamsWithTypes = (double x, double y) => x * y;
Console.WriteLine(twoParamsWithTypes(4, 2)); ;
Console.ReadKey();
}
}
}
概括
委托是寻址方法的.NET版本,类似于C++中的指针.委托可以理解为指向函数的指针,它是类型安全的,定义了具体的参数和返回值.
定义一个委托,实际上是定义一个类,委托是对方法的引用,如方法Func,把功能交给委托的类来实现.
委托的作用:结合泛型,可以实现功能上的扩展(如针对整型的函数,可以通过委托指向多种函数,实现类中某个属性的比较).Lambda表达式需要使用委托定义.事件需要使用到委托.
Lambda表达式与委托直接相关.Lambda表达式可以理解成一个简单的方法定义(包括参数,返回值),表达式由委托来指向.
Lambda表达式的作用,减少代码量
事件,基于委托,为委托提供了一种发布/订阅机制.最直接的就是Button的Click事件.
委托案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
//定义一个委托
public delegate double DoubleOp(double x);
//定义委托的函数
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
static void Main(string[] args)
{
DoubleOp[] operations = { MultiplyByTwo, Square };
Console.WriteLine(operations[0](2));
Console.WriteLine(operations[1](2));
Console.ReadKey();
}
}
}
Action<T>委托和Func<T>委托
Action为返回值void的委托,Func为带返回类(最后一个参数为返回类型).
//DoubleOp[] operations = { MultiplyByTwo, Square };
Func<double, double>[] operations = { MultiplyByTwo,Square};
//上例中的这两句话可以互换
委托更多的拥簇是作为寒素的参数,可以把符合一定要求(参数,返回值一致)的函数作为参数传入其他函数(是不是和类似指针)
Lambda表达式
案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace zongjie
{
class Program
{
static void Main(string[] args)
{
string mid = ",2,";
//有花括号(多条语句的情况)的需要return语句
Func<string, string> lambdaTest = param =>
{
param += mid;
param += "3";
return param;
};
Console.WriteLine(lambdaTest("1"));
//没有花括号的会隐式添加一条return语句
Func<string, string> oneParam = s => string.Format("change up{0}",s.ToUpper());
Console.WriteLine(oneParam("test")); ;
Func<double, double, double> twoParams = (x, y) => x * y;
Console.WriteLine(twoParams(3,2));
Func<double, double, double> twoParamsWithTypes = (double x, double y) => x * y;
Console.WriteLine(twoParamsWithTypes(4, 2)); ;
Console.ReadKey();
}
}
}
相关文章推荐
- C#静态构造函数
- C#的变量以及类型转换
- C#软件开发实例.个人定制自己的屏幕抓图工具(八)加入了截图功能键盘
- C# winform窗体实现简单打印
- C#复数类Complex的封装
- C#之Lamba表达式
- C#的开始
- C# DEBUG 调试信息打印及输出详解
- C#产生正态分布、泊松分布、指数分布、负指数分布随机数(原创)
- C#高级编程四十三天----Lambda表达式
- C# 文件操作方法
- BC#45 1004 && HDU 5275【差值方法】
- C#写入对象或集合类型数据到xml文件的方法
- C#反射
- C#简单写入xml文件的方法
- .NET: C#: 获取当前路径
- C#.NET里面抽象类和接口有什么区别?
- C# in depth ( 第三章 用泛型实现参数化类型)
- C#下文件转换到二进制流再到十六进制的转换流程
- 设置c#项目obj路径的方法