张磊(Avraber)

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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;
        }

posted on 2012-07-08 14:46  张磊(Avraber)  阅读(152)  评论(0编辑  收藏  举报