匿名方法与Lambda表达式,事件,一些应用
2012-07-08 14:46
337 查看
1.匿名方法与Lambda表达式
> 有时考虑方法只用一次的时候考虑使用
<1>匿名方法
-> 定义一个委托
委托类型 变量名 = delegate(参数) {
// 方法体
}
FuncDelegate MyFunc = Func;
FuncDelegate MyFunc = delegate(int i)
{
Console.WriteLine("我是一个匿名方法, 传进来一个参数是{0}", i);
};
<2>Lambda表达式
-> => 运算符
委托类型 变量名 = (参数) => {
// 方法体
}
int num = 1234567;
FuncDelegate MyFunc = (i) =>
{
Console.WriteLine("我是一个Lambda表达式,传入一个参数为{0}", i);
Console.WriteLine(num);
};
//如果Lambda表达式只有一句话,花括号可省略
FuncDelegate MyFunc = (i) => Console.WriteLine(num);
MyFunc(100);
2.事件
事件基于委托,为委托提供了一种 发布/订阅 机制。
// 如果要控制需要在外界添加方法,但是不让在外界调用
// 声明一个私有委托,然后添加一个可以增加方法与移除方法的属性
public delegate void FuncDelegate();
class Program
{
static void Main(string[] args)
{ MyClass m = new MyClass();
m.MyFunc += Func1;
// 即可以再外界(在类MyClass外的其他类中为他添加方法)
// 添加方法的语法(写上事件名 += tab)
m.MyFunc += new FuncDelegate(m_MyFunc);
m.Run();
Console.ReadKey();
}
static void m_MyFunc()
{
Console.WriteLine("tab出来的方法");
}
public static void Func1()
{
Console.WriteLine("哈哈哈");
}
}
class MyClass
{
public event FuncDelegate MyFunc;
public void Run()
{
MyFunc();
}
}
3.一些应用
<1>类型推断
var v = "100";
Console.WriteLine(v); //自动判断类型。
不确定的不能用Var
比如数组
var(int,double)[] v1 = { 1, 2, 3 };
<2> 匿名类型
var person = new
{
Name = "张三",
Age = 19,
Gender = '男'
};
Console.WriteLine(person.Name);
Console.ReadKey();
<3> 初始化器
int[] nums = new int[] { 1, 2, 3 };
List<int> numList = new List<int>() { 11, 22, 33, 44, 55, 66 };
Person p = new Person() { Age = 19, Gender = '男', Name = "张三" };
<4>运算符重载
public static explicit operator int(Person value)
{
// 目标类型 o = new 目标类型();
// 赋值操作,显示转换中可以将赋值操作用checked{...}块包起来,如放不下就异常
return value.Age;
}
public static int operator +(Person p1, Person p2)
{
// 实际运算方式
return p1.Age + p2.Age;
}
> 有时考虑方法只用一次的时候考虑使用
<1>匿名方法
-> 定义一个委托
委托类型 变量名 = delegate(参数) {
// 方法体
}
FuncDelegate MyFunc = Func;
FuncDelegate MyFunc = delegate(int i)
{
Console.WriteLine("我是一个匿名方法, 传进来一个参数是{0}", i);
};
<2>Lambda表达式
-> => 运算符
委托类型 变量名 = (参数) => {
// 方法体
}
int num = 1234567;
FuncDelegate MyFunc = (i) =>
{
Console.WriteLine("我是一个Lambda表达式,传入一个参数为{0}", i);
Console.WriteLine(num);
};
//如果Lambda表达式只有一句话,花括号可省略
FuncDelegate MyFunc = (i) => Console.WriteLine(num);
MyFunc(100);
2.事件
事件基于委托,为委托提供了一种 发布/订阅 机制。
// 如果要控制需要在外界添加方法,但是不让在外界调用
// 声明一个私有委托,然后添加一个可以增加方法与移除方法的属性
public delegate void FuncDelegate();
class Program
{
static void Main(string[] args)
{ MyClass m = new MyClass();
m.MyFunc += Func1;
// 即可以再外界(在类MyClass外的其他类中为他添加方法)
// 添加方法的语法(写上事件名 += tab)
m.MyFunc += new FuncDelegate(m_MyFunc);
m.Run();
Console.ReadKey();
}
static void m_MyFunc()
{
Console.WriteLine("tab出来的方法");
}
public static void Func1()
{
Console.WriteLine("哈哈哈");
}
}
class MyClass
{
public event FuncDelegate MyFunc;
public void Run()
{
MyFunc();
}
}
3.一些应用
<1>类型推断
var v = "100";
Console.WriteLine(v); //自动判断类型。
不确定的不能用Var
比如数组
var(int,double)[] v1 = { 1, 2, 3 };
<2> 匿名类型
var person = new
{
Name = "张三",
Age = 19,
Gender = '男'
};
Console.WriteLine(person.Name);
Console.ReadKey();
<3> 初始化器
int[] nums = new int[] { 1, 2, 3 };
List<int> numList = new List<int>() { 11, 22, 33, 44, 55, 66 };
Person p = new Person() { Age = 19, Gender = '男', Name = "张三" };
<4>运算符重载
public static explicit operator int(Person value)
{
// 目标类型 o = new 目标类型();
// 赋值操作,显示转换中可以将赋值操作用checked{...}块包起来,如放不下就异常
return value.Age;
}
public static int operator +(Person p1, Person p2)
{
// 实际运算方式
return p1.Age + p2.Age;
}
相关文章推荐
- 委托 匿名方法 Lambda表达式 总结(yuananl)
- 匿名方法、Lambda表达式、Func<>委托
- 匿名方法(暨 lambda 表达式)使用指南
- 匿名方法与Lambda表达式
- 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
- 匿名方法与Lambda表达式
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
- C#学习之初步理解委托、事件、匿名方法和Lambda
- 委托,匿名方法,Lambda 表达式 的关系
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 委托、匿名方法、Lambda表达式的演进
- C# Error CS1628: 不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数
- 从委托到匿名方法,再到Lambda表达式
- Lambda表达式_匿名方法_委托
- 匿名方法、委托和Lambda表达式区分演示(图文解释)
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
- 编写高质量代码改善C#程序的157个建议——建议37:使用Lambda表达式代替方法和匿名方法
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
- Lambda表达式和匿名方法中不支持yield return
- 为LINQ服务的C#新特性总结篇---扩展方法,匿名委托,lambda表达式,Action委托,Func委托,Linq中的order by,top和sum函数