Learning hard C#学习笔记

委托:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateUse
{
    // 委托使用演示
    class Program
    {
        // 1. 使用delegate关键字来定义一个委托类型
        delegate void MyDelegate(int para1, int para2);
      
        static void Main(string[] args)
        {
            // 2. 声明委托变量d
            MyDelegate d;
            // 3. 实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
            d = new MyDelegate(new Program().Add);

            // 4. 委托类型作为参数传递给另一个方法
            MyMethod(d);
            Console.Read();
        }

        // 该方法的定义必须与委托定义相同,即返回类型为void, 两个int类型的参数
        void Add(int para1, int para2)
        {
            int sum = para1 + para2;
            Console.WriteLine("两个数的和为:"+sum);
        }

        // 方法的参数是委托类型
        private static void MyMethod(MyDelegate mydelegate)
        {
            // 5.在方法中调用委托
            mydelegate(1,2);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateOrigin
{
    class Program
    {
        static void Main(string[] args)
        {
            // 引入委托之后
            // 初始化对象
            Program p = new Program();
            p.Greeting("李志", p.ChineseGreeting);
            p.Greeting("Tommy Li", p.EnglishGreeting);
            Console.Read();
        }
        #region 引入委托之后
        // 定义委托类型
        public delegate void GreetingDelegate(string name);
        // 有了委托之后,可以像如下实现打招呼方法
        public void Greeting(string name, GreetingDelegate callback)
        {
            // 调用委托
            callback(name);
        }

        // 英国人打招呼方法
        public void EnglishGreeting(string name)
        {
            Console.WriteLine("Hello,  " + name);
        }

        // 中国人打招呼方法
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好, " + name);
        }
        public void JapaneseGreeting(string name)
        {
            Console.WriteLine("こんにちは, "+name);
        }
        #endregion 

        #region 没有委托的情况
         不使用委托实现打招呼方法
        //public void Greeting(string name,string language)
        //{
        //    switch (language)
        //    {
        //        case "zh-cn":
        //            ChineseGreeting(name);
        //            break;
        //        case "en-us":
        //            EnglishGreeting(name);
        //            break;
        //        default:
        //            EnglishGreeting(name);
        //            break;
        //    }
        //}

         英国人打招呼方法
        //public void EnglishGreeting(string name)
        //{
        //    Console.WriteLine("Hello,  "+name);
        //}

         中国人打招呼方法
        //public void ChineseGreeting(string name)
        //{
        //    Console.WriteLine("你好, "+name);
        //}
        #endregion
    } 
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MulticastDelegates
{
    class Program
    {
        // 声明一个委托类型
        public delegate void DelegateTest();
        static void Main(string[] args)
        {
            // 用静态方法来实例化委托
            DelegateTest dtstatic = new DelegateTest(Program.method1);

            DelegateTest dtinstance= new DelegateTest(new Program().method2);
            
            // 定义一个委托对象,一开始初始化为null,就是不代表任何方法(我就是我,我不代表任何人)
            DelegateTest delegatechain = null;

            // 使用+符号链接委托,链接多个委托后就成为委托链了
            delegatechain += dtstatic;
            delegatechain += dtinstance;

            // 使用-运算符把dtstatic委托从委托链中移除
            delegatechain -= dtstatic;

            // 调用委托链
            delegatechain();
            Console.Read();
        }

        // 静态方法
        private static void method1()
        {
            Console.WriteLine( "这是静态方法");
        }

        // 实例方法
        private void method2()
        {
            Console.WriteLine( "这是实例方法");
        }
    }
}

事件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventUse
{
    // 新郎官类,充当事件发布者角色
    public class Bridegroom
    {
        // 自定义委托
        public delegate void MarryHandler(string msg);

        // 使用自定义委托类型定义事件,事件名为BirthdayEvent
        public event MarryHandler MarryEvent;

        // 发出事件
        public void OnBirthdayComing(string msg)
        {
            // 判断是否绑定了事件处理方法
            if (MarryEvent != null)
            {
                // 触发事件
                MarryEvent(msg);
            }
        }

        static void Main(string[] args)
        {
            //初始化新郎官对象
            Bridegroom bridegroom =new Bridegroom();

            // 实例化朋友对象
            Friend friend1 = new Friend("张三");
            Friend friend2= new Friend("李四");
            Friend friend3 = new Friend("王五");

            // 使用+=订阅事件
            bridegroom.MarryEvent+=new MarryHandler(friend1.SendMessage);
            bridegroom.MarryEvent += new MarryHandler(friend2.SendMessage);

            // 发出通知,此时订阅了事件的对象才能收到通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.WriteLine("------------------------------------");

            // 使用-=取消订阅事件,此时李四将收不到通知
            bridegroom.MarryEvent -= new MarryHandler(friend2.SendMessage);

            // 使用+=订阅事件,此时王五可以收到通知
            bridegroom.MarryEvent += new MarryHandler(friend3.SendMessage);

            // 发出通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.Read();
        }
    }

    // 朋友类
    public class Friend
    {
        // 字段
        public string Name;

        // 构造函数
        public Friend(string name)
        {
            Name = name;
        }

        // 事件处理函数,该函数需要符合MarryHandler委托的定义
        public void SendMessage(string mssage)
        {
            // 输出通知信息
            Console.WriteLine(mssage);

            // 对事件做出处理
            Console.WriteLine(this.Name + "收到了,到时候准时参加");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventUseInNET
{
    // 新郎官类,充当事件发布者角色
    public class Bridegroom
    {
        // 使用.NET类库中预定义的委托类型EventHandler来定义事件
        public event EventHandler MarryEvent;

        // 发出事件
        public void OnBirthdayComing(string msg)
        {
            // 判断是否绑定了事件处理方法
            if (MarryEvent != null)
            {
                Console.WriteLine(msg);

                // 触发事件
                MarryEvent(this,new EventArgs());
            }
        }

        static void Main(string[] args)
        {
            //初始化新郎官对象
            Bridegroom bridegroom = new Bridegroom();

            // 实例化朋友对象
            Friend friend1 = new Friend("张三");
            Friend friend2 = new Friend("李四");
            Friend friend3 = new Friend("王五");

            // 使用+=订阅事件
            bridegroom.MarryEvent += new EventHandler(friend1.SendMessage);
            bridegroom.MarryEvent += new EventHandler(friend2.SendMessage);

            // 发出通知,此时订阅了事件的对象才能收到通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.WriteLine("------------------------------------");

            // 使用-=取消订阅事件,此时李四将收不到通知
            bridegroom.MarryEvent -= new EventHandler(friend2.SendMessage);

            // 使用+=订阅事件,此时王五可以收到通知
            bridegroom.MarryEvent += new EventHandler(friend3.SendMessage);

            // 发出通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.Read();
        }
    }

    // 朋友类
    public class Friend
    {
        // 字段
        public string Name;

        // 构造函数
        public Friend(string name)
        {
            Name = name;
        }

        // 事件处理函数,该函数需要符合EventHandler委托的定义
        public void SendMessage(object s, EventArgs e)
        {
            // 对事件做出处理
            Console.WriteLine(this.Name + "收到了,到时候准时参加");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventArgsExt
{
    // 自定义事件类,使其带有事件数据
    public class MarryEventArgs : EventArgs
    {
        public string Message;
        public MarryEventArgs(string msg)
        {
            Message = msg;
        }
    }

    // 新郎官类,充当事件发布者角色
    public class Bridegroom
    {
        // 自定义委托类型,委托具有两个参数
        public delegate void MarryHandler(object sender, MarryEventArgs e);

        // 定义事件
        public event MarryHandler MarryEvent;

        // 发出事件
        public void OnBirthdayComing(string msg)
        {
            // 判断是否绑定了事件处理方法
            if (MarryEvent != null)
            {
                // 触发事件
                MarryEvent(this, new MarryEventArgs(msg));
            }
        }

        static void Main(string[] args)
        {
            //初始化新郎官对象
            Bridegroom bridegroom = new Bridegroom();

            // 实例化朋友对象
            Friend friend1 = new Friend("张三");
            Friend friend2 = new Friend("李四");
            Friend friend3 = new Friend("王五");

            // 使用+=订阅事件
            bridegroom.MarryEvent += new MarryHandler(friend1.SendMessage);
            bridegroom.MarryEvent += new MarryHandler(friend2.SendMessage);

            // 发出通知,此时订阅了事件的对象才能收到通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.WriteLine("------------------------------------");

            // 使用-=取消订阅事件,此时李四将收不到通知
            bridegroom.MarryEvent -= new MarryHandler(friend2.SendMessage);

            // 使用+=订阅事件,此时王五可以收到通知
            bridegroom.MarryEvent += new MarryHandler(friend3.SendMessage);

            // 发出通知
            bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
            Console.Read();
        }
    }

    // 朋友类
    public class Friend
    {
        // 字段
        public string Name;

        // 构造函数
        public Friend(string name)
        {
            Name = name;
        }

        // 事件处理函数,该函数需要符合MarryHandler委托的定义
        public void SendMessage(object s, MarryEventArgs e)
        {
            // 输出通知信息
            Console.WriteLine(e.Message);

            // 对事件做出处理
            Console.WriteLine(this.Name + "收到了,到时候准时参加");
        }
    }
}

泛型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11._3__3
{
    class Program
    {
        static void Main(string[] args)
        {
            // 每个封闭泛型类型都会调用其构造函数
            GenericClass<int>.Print();
            GenericClass<string>.Print();

            // 对于非泛型类型,其构造函数只会调用一次
            NonGenericClass.Print();
            NonGenericClass.Print();
            Console.Read();
        }
    }

    // 泛型类
    public static class GenericClass<T>
    {
        // 静态构造函数
        static GenericClass()
        {
            Console.WriteLine("泛型的静态构造函数被调用了,实际类型为:"+typeof(T));
        }

        // 静态方法
        public static void Print()
        {
        }
    }
    // 非泛型类
    public static class NonGenericClass
    {
        static NonGenericClass()
        {
            Console.WriteLine("非泛型的静态构造函数被调用了");
        }

        public static void Print()
        {
        }
    }
}


可空类型、匿名方法、迭代器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 下面代码也可以这样子定义int? value=1;
            Nullable<int> value = 1;

            Console.WriteLine("可空类型有值的输出情况:");
            Display(value);
            Console.WriteLine();
            Console.WriteLine();

            value = new Nullable<int>();
            Console.WriteLine("可空类型没有值的输出情况:");
            Display(value);
            Console.Read();
        }

        // 输出方法,演示可空类型中的方法和属性的使用
        private static void Display(int? nullable)
        {
            // HasValue 属性代表指示可空对象是否有值
            Console.WriteLine("可空类型是否有值:{0}", nullable.HasValue);
            if (nullable.HasValue)
            {
                Console.WriteLine("值为: {0}", nullable.Value);
            }

            // GetValueOrDefault(代表如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回)相当与下面的语句
            // if (!nullable.HasValue)
            // {
            //    result = d.Value;
            // }

            Console.WriteLine("GetValueorDefault():{0}", nullable.GetValueOrDefault());

            // GetValueOrDefault(T)方法代表如果 HasValue 属性为 true,则为 Value 属性的值;否则为 defaultValue 参数值,即2。
            Console.WriteLine("GetValueorDefalut重载方法使用:{0}", nullable.GetValueOrDefault(2));

            // GetHashCode()代表如果 HasValue 属性为 true,则为 Value 属性返回的对象的哈希代码;如果 HasValue 属性为 false,则为零
            Console.WriteLine("GetHashCode()方法的使用:{0}", nullable.GetHashCode());
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("??运算符的使用如下:");
            NullcoalescingOperator();
            Console.Read();
        }
        // ??运算符的演示
        private static void NullcoalescingOperator()
        {
            int? nullable = null;
            int? nullhasvalue = 1;

            // ??和三目运算符的功能差不多的
            // 所以下面代码等价于:
            // x=nullable.HasValue?b.Value:12;
            int x = nullable ?? 12;

            // 此时nullhasvalue不能null,所以y的值为nullhasvalue.Value,即输出1
            int y = nullhasvalue ?? 123;
            Console.WriteLine("可空类型没有值的情况:{0}", x);
            Console.WriteLine("可空类型有值的情况:{0}", y);

            // 同时??运算符也可以用于引用类型, 下面是引用类型的例子
            Console.WriteLine();
            string stringnotnull = "123";
            string stringisnull = null;

            // 下面的代码等价于:
            // (stringnotnull ==null)? "456" :stringnotnull
            // 也也等价于:
            // if(stringnotnull==null)
            // {
            //      return "456";
            // }
            // else
            // {
            //      return stringnotnull;
            // }

            // 从上面的等价代码可以看出,有了??运算符之后可以省略大量的if—else语句,这样代码少了, 自然可读性就高了
            string result = stringnotnull ?? "456";
            string result2 = stringisnull ?? "12";
            Console.WriteLine("引用类型不为null的情况:{0}", result);
            Console.WriteLine("引用类型为null的情况:{0}", result2);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("可空类型的装箱和拆箱的使用如下:");
            BoxedandUnboxed();
            Console.Read();
        }

        // 可空类型装箱和拆箱的演示
        private static void BoxedandUnboxed()
        {
            // 定义一个可空类型对象nullable
            Nullable<int> nullable = 5;
            int? nullablewithoutvalue = null;
           
            Console.Write(nullablewithoutvalue.Value);
            // 获得可空对象的类型,此时返回的是System.Int32,而不是System.Nullable<System.Int32>,这点大家要特别注意下的
            Console.WriteLine("获取不为null的可空类型的类型为:{0}", nullable.GetType());

            // 对于一个为null的类型调用方法时出现异常,所以一般对于引用类型的调用方法前,最好养成习惯先检测下它是否为null
            //Console.WriteLine("获取为null的可空类型的类型为:{0}", nullablewithoutvalue.GetType());

            // 将可空类型对象赋给引用类型obj,此时会发生装箱操作,大家可以通过IL中的boxed 来证明
            object obj = nullable;

            // 获得装箱后引用类型的类型,此时输出的仍然是System.Int32,而不是System.Nullable<System.Int32>
            Console.WriteLine("获得装箱后obj 的类型:{0}", obj.GetType());

            // 拆箱成非可空变量
            int value = (int)obj;
            Console.WriteLine("拆箱成非可空变量的情况为:{0}", value);

            // 拆箱成可空变量
            nullable = (int?)obj;
            Console.WriteLine("拆箱成可空变量的情况为:{0}", nullable);

            // 装箱一个没有值的可空类型的对象
            obj = nullablewithoutvalue;
            Console.WriteLine("对null的可空类型装箱后obj 是否为null:{0}", obj == null);

            // 拆箱成非可空变量,此时会抛出NullReferenceException异常,因为没有值的可空类型装箱后obj等于null,引用一个空地址
            // 相当于拆箱后把null值赋给一个int 类型的变量,此时当然就会出现错误了
            //value = (int)obj;
            //Console.WriteLine("一个没有值的可空类型装箱后,拆箱成非可空变量的情况为:{0}", value);

            // 拆箱成可空变量
            nullable = (int?)obj;
            Console.WriteLine("一个没有值的可空类型装箱后,拆箱成可空变量是否为null:{0}", nullable == null);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace _12._9
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个对象
            Friends friendcollection = new Friends();
            // Friends实现了IEnumerable所以可以使用foreach语句进行遍历
            foreach (Friend f in friendcollection)
            {
                Console.WriteLine(f.Name);
            }

            Console.Read();
        }

        // 朋友类
        public class Friend
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public Friend(string name)
            {
                this.name = name;
            }
        }

        // 朋友集合
        public class Friends : IEnumerable
        {
            private Friend[] friendarray;

            public Friends()
            {
                friendarray = new Friend[]
            {
                new Friend("张三"),
                new Friend("李四"),
                new Friend("王五")
            };
            }

            // 索引器
            public Friend this[int index]
            {
                get { return friendarray[index]; }
            }

            public int Count
            {
                get { return friendarray.Length; }
            }

            // 实现IEnumerable<T>接口方法
            public IEnumerator GetEnumerator()
            {
                return new FriendIterator(this);
            }
        }

        //  C#1.0中实现迭代器代码——必须实现 IEnumerator接口
        public class FriendIterator : IEnumerator
        {
            private readonly Friends friends;
            private int index;
            private Friend current;
            internal FriendIterator(Friends friendcollection)
            {
                this.friends = friendcollection;
                index = 0;
            }

            // 实现IEnumerator接口中的方法
            public object Current
            {
                get
                {
                    return this.current;
                }
            }

            public bool MoveNext()
            {
                if (index + 1 > friends.Count)
                {
                    return false;
                }
                else
                {
                    this.current = friends[index];
                    index++;
                    return true;
                }
            }

            public void Reset()
            {
                index = 0;
            }
        }
    }
}


Lambda表达式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _14._1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Lambda表达式的演变过程
            // 下面是C# 1中创建委托实例的代码
            Func<string, int> delegatetest1 = new Func<string, int>(Callbackmethod);

            //                                  ↓
            // C# 2中用匿名方法来创建委托实例,此时就不需要额外定义回调方法Callbackmethod
            Func<string, int> delegatetest2 = delegate(string text)
            {
                return text.Length;
            };
            //                      ↓
            // C# 3中使用Lambda表达式来创建委托实例
            Func<string, int> delegatetest3 = (string text) => text.Length;

            //                                  ↓
            // 可以省略参数类型string,把上面代码再简化为:
            Func<string, int> delegatetest4 = (text) => text.Length;

            //                                  ↓
            // 此时可以把圆括号也省略,简化为:
            Func<string, int> delegatetest = text => text.Length;

            // 调用委托
            Console.WriteLine("使用Lambda表达式返回字符串的长度为: " + delegatetest("learning hard"));
            Console.Read();
        }

        // 回调方法
        private static int Callbackmethod(string text)
        {
            return text.Length;
        }
    }
}
using System;
using System.Windows.Forms;

namespace _14._2
{
    class Program
    {
        static void Main(string[] args)
        {
            // 新建一个button实例
            Button button1 = new Button();
            button1.Text = "点击我";

            // C# 2中使用匿名方法来订阅事件
            button1.Click += delegate(object sender, EventArgs e)
            {
                ReportEvent("Click事件", sender, e);
            };
            button1.KeyPress += delegate(object sender, KeyPressEventArgs e)
            {
                ReportEvent("KeyPress事件,即键盘按下事件", sender, e);
            };

            // C# 3之前初始化对象时使用下面代码
            Form form = new Form();
            form.Name = "在控制台中创建的窗体";
            form.AutoSize = true;
            form.Controls.Add(button1);
            // 运行窗体
            Application.Run(form);
        }

        // 记录事件的回调方法
        private static void ReportEvent(string title, object sender, EventArgs e)
        {
            Console.WriteLine("发生的事件为:{0}", title);
            Console.WriteLine("发生事件的对象为:{0}", sender);
            Console.WriteLine("发生事件参数为: {0}", e.GetType());
            Console.WriteLine();
            Console.WriteLine();
        }
    }
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._6
{
    class Program
    {
        // 构造a+b表达式树结构
        static void Main(string[] args)
        {
            // 表达式的参数
            ParameterExpression a = Expression.Parameter(typeof(int), "a");
            ParameterExpression b = Expression.Parameter(typeof(int), "b");
            
            // 表达式树主体部分
            BinaryExpression be = Expression.Add(a, b);

            // 构造表达式树
            Expression<Func<int, int, int>> expressionTree = Expression.Lambda<Func<int, int, int>>(be, a, b);

            // 分析树结构,获取表达式树的主体部分
            BinaryExpression body = (BinaryExpression)expressionTree.Body;

            // 左节点,每个节点本身就是一个表达式对象
            ParameterExpression left = (ParameterExpression)body.Left;

            // 右节点
            ParameterExpression right = (ParameterExpression)body.Right;

            // 输出表达式树结构
            Console.WriteLine("表达式树结构为:"+expressionTree);
            // 输出
            Console.WriteLine("表达式树主体为:");
            Console.WriteLine(expressionTree.Body);
            Console.WriteLine("表达式树左节点为:{0}{4} 节点类型为:{1}{4}{4} 表达式树右节点为:{2}{4} 节点类型为:{3}{4}", left.Name, left.Type, right.Name, right.Type, Environment.NewLine);
            
            Console.Read();
        }
    }
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._4
{
    class Program
    {
        static void Main(string[] args)
        {
            // 将lambda表达式构造成表达式树
            Expression<Func<int, int, int>> expressionTree = (a, b) => a + b;

            // 获得表达式树参数
            Console.WriteLine("参数1:{0},参数2: {1}", expressionTree.Parameters[0], expressionTree.Parameters[1]);
            // 获取表达式树的主体部分
            BinaryExpression body = (BinaryExpression)expressionTree.Body;

            // 左节点,每个节点本身就是一个表达式对象
            ParameterExpression left = (ParameterExpression)body.Left;

            // 右节点
            ParameterExpression right = (ParameterExpression)body.Right;

            Console.WriteLine("表达式树主体为:");
            Console.WriteLine(expressionTree.Body);
            Console.WriteLine("表达式树左节点为:{0}{4} 节点类型为:{1}{4}{4} 表达式树右节点为:{2}{4} 节点类型为:{3}{4}", left.Name, left.Type, right.Name, right.Type, Environment.NewLine);
            Console.Read();
        }
    }
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._5
{
    class Program
    {
        static void Main(string[] args)
        {
            // 将lambda表达式构造成表达式树
            Expression<Func<int, int, int>> expressionTree = (a, b) => a + b;
            // 通过调用Compile方法来生成Lambda表达式的委托
            Func<int,int,int> delinstance =expressionTree.Compile();
            // 调用委托实例获得结果
            int result = delinstance(2, 3);
            Console.WriteLine("2和3的和为:" + result);
            Console.Read();
        }
    }
}

动态类型:

using System;
using System.Dynamic;

namespace _18._1
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic expand = new ExpandoObject();
            // 动态绑定成员
            expand.Name = "Learning Hard";
            expand.Age = 24;
            expand.Addmethod = (Func<int, int>)(x => x + 1);
            // 调用类型成员
            Console.WriteLine("expand类型的姓名为:" + expand.Name + " 年龄为: " + expand.Age);
            Console.WriteLine("调用expand类型的动态绑定的方法:" + expand.Addmethod(5));
            Console.Read();
        }
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值