笔记03-.NET高级技术

第一章:各种知识点(新版)

3.索引器

索引器允许数字索引,和字符串,可以多个参数,索引器本质是方法

   static void Main(string[] args)
        {
            Person p1 = new Person();
            p1[3, 5] = "hello";//set,输出x=3,y=5
            string s = p1[1, 2];//get
            Console.WriteLine(s);//输出12

            Dog d = new Dog();
            d["hello"]=9;//输出s的值是hello
            Console.WriteLine(d["hello"]);// 输出888
            int i = d["yyyy"];
            Console.WriteLine(i);// 输出888

            Console.ReadKey();
        }
        class Person
        {
            public string this[int x, int y]
            {
                get { return "" + x + y; }
                set { Console.WriteLine("x=" + x + ",y=" + y); }
            }
        }
        class Dog
        {
            public int this[string s]
            {
                get { return 888; }
                set { Console.WriteLine("s的值是" + s); }
            }
        }
View Code

 4.密闭类和静态类及扩展方法

sealed密封类  不能被继承

static静态类类   不能new,不能被继承,只能声明static成员

c#3.0特性:扩展方法

//扩展方法所在的类必须是static类
//扩展方法的第一个参数类型是被扩展的类型,类型前面标注this
//使用扩展方法的代码必须添加对扩展方法所在类的namespace的using

  class Program
    {
        static void Main(string[] args)
        {
            string e = "dsa@163.com";
            bool b = Dog.IsEmail(e);
            Console.WriteLine(b);
            b = Dog.IsEmail2(e);
            Console.WriteLine(b);

            //扩展方法
            //扩展方法所在的类必须是static类
            //扩展方法的第一个参数类型是被扩展的类型,类型前面标注this
            //使用扩展方法的代码必须添加对扩展方法所在类的namespace的using
            b = e.IsEmail2();
            Console.WriteLine(b);

            string s1 = "abcd";
            Console.WriteLine(s1.Repeat(3));
            Console.ReadKey();
        }

    }
    static class Dog
    {
        //扩展方法
        public static bool IsEmail2(this string s)
        {
            return s.Contains("@");
        }
        public static string Repeat(this string s, int cout)
        {
            string result = "";
            for (int i = 0; i < cout; i++)
            {
                result = result + s;
            }
            return result;
        }
        public static bool IsEmail(string s)
        {
            return s.Contains("@");
        }
    }
View Code

 5.深拷贝浅拷贝

    class Program
    {
        static void Main(string[] args)
        {
            //浅拷贝
            Person p1 = new Person();
            p1.name = "小a";
            p1.age = 18;
            Person p2 = p1;
            p1.age = 99;
            Console.WriteLine(p2.age);//输出99
            //深拷贝
            Person p3 = new Person();
            p3.name = p1.name;
            p3.age = p1.age;
            p1.age = 199;
            Console.WriteLine(p3.age);//输出99
            Console.ReadKey();
        }
    }
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
View Code

 6.结构体及值类型引用类型

引用类型,方法调用后,一起改变

    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            p.name = "555";
            ss(p);
            Console.WriteLine(p.name);//输出666
            Console.ReadKey();    
        }
        public static void ss(Person s)
        {
            s.name= "666";
        }
    }
    class Person
    {
        public string name { get; set; }
    }
View Code

 结构体,是复制拷贝一份,值类型

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.name = "555";
            p1.age = 1;
            Person p2 = p1;
            p1.age = 666;
            Console.WriteLine(p2.age);//输出666

            Dog d1 = new Dog();
            d1.name = "555";
            d1.age = 1;
            Dog d2 = d1;
            d1.age = 666;
            Console.WriteLine(d2.age);//输出1
            Console.ReadKey();    
        }
       
    }
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
    struct Dog
    {
        public string name { get; set; }
        public int age { get; set; }
    }
View Code

 什么是引用类型:引用类型派生自System.Object

什么是值类型:值类型均隐式派生自System.ValueType(ValueType其实也是继承自Object,不过是独立独行的一个分支)

值类型:数值类型,bool,结构,枚举

引用类型:字符串,数组,类,接口

引用类型变量的赋值只复制对对象的引用:引用类型在堆内存

值类型变量赋值会拷贝一个副本:值类型在栈内存:值类型一定是sealed

7.CTS.CLS.CLR

通用类型系统 CTS,Common Type System

通用语言规范 CLS, Common Language Specification

公共语言运行时 CLR, Common Language Runtime 

垃圾回收 GC, Garbage Collection

8.拆箱装箱box,unbox

拆箱装箱会发生内存变化

建议用Convert

1. 装箱在值类型向引用类型转换时发生

2. 拆箱在引用类型向值类型转换时发生

装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。

9.关于相等

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.name = "dadada";
            p1.age = 10;
            Person p2 = p1;

            Person p3 = new Person();
            p3.name = "dadada";
            p3.age = 10;

            Console.WriteLine(object.ReferenceEquals(p1, p2));//true
            Console.WriteLine(object.ReferenceEquals(p1, p3));//false
            Console.WriteLine(p1 == p2);//true
            Console.WriteLine(p1 == p3);//false

            //object的Equals方法的默认实现是比较2个变量是否同一个对象

            String s1 = "abc";
            string s2 = s1;
            string s3 = new String(new char[] { 'a', 'b', 'c' });//new 一下就会产生一个新对象
            Console.WriteLine(object.ReferenceEquals(s1, s2));//true
            Console.WriteLine(object.ReferenceEquals(s1, s3));//false

            Console.WriteLine(s1 == s2);//true
            Console.WriteLine(s1 == s3);//true  字符串由于override了Equals方法,内部进行内容比较,所以对于字符串来讲==就是比较内容


            Console.ReadKey();
        }
    }
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
View Code

 10.字符串缓冲池

 11.ref和out

    class Program
    {
        static void Main(string[] args)
        {
            //1.作用
            //ref 方法内部修改外部变量的指向
            //out 方法多个返回值

            //2.变量是否传入方法前赋值
            //ref必须
            //out不用,赋值也没用

            //3.是否必须在方法中赋值
            //ref 不必须
            //out 必须
            Person p = new Person();
            p.name = "aaa";
            int i = 5;
            Test(p, i);
            Console.WriteLine(p.name);//bbb
            Console.WriteLine(i);//5
            Console.ReadKey();
        }
        static void Test(Person p, int i)
        {
            p.name = "bbb";
            i = 666;
        }
    }
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
View Code
   class Program
    {
        static void Main(string[] args)
        {
            //1.作用
            //ref 方法内部修改外部变量的指向
            //out 方法多个返回值

            //2.变量是否传入方法前赋值
            //ref必须
            //out不用,赋值也没用

            //3.是否必须在方法中赋值
            //ref 不必须
            //out 必须
            Person p = new Person();
            p.name = "aaa";
            int i = 5;
            Test(ref p,ref i);
            Console.WriteLine(p.name);//bbb
            Console.WriteLine(i);//666
            Console.ReadKey();
        }
        static void Test(ref Person p,ref int i)
        {

            p = new Person();
            p.name = "bbb";
            i = 666;
        }
    }
    class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
View Code

第二章:委托,lambda,事件(新版)

 1.委托

    class Program
    {
        static void Main(string[] args)
        {
            MyDell m1 = new MyDell(M1);
            MyDell m2 = M1;
            m1(5);
            Console.WriteLine();
            Console.ReadKey();
        }
        static int M1(int a)
        {
            Console.WriteLine("M1"+a);
            return 4;
        }
    }
    delegate int MyDell(int a);
View Code

 2.委托应用GetMax

    class Program
    {
        static void Main(string[] args)
        {
            //int[] nums =new int[] {3,88,9,21 };//int[]无法直接转换为object[]
            //string[] nums =new string[] {"" };//不会变异出错
            object[] nums = new object[] { 3, 88, 9, 21 };//装箱
            //object m = GetMax(nums, CompaerInt);
            object m = GetMax(nums, new CompareFunc(CompaerInt));
            Console.WriteLine(m);

            object[] nums1 = new object[] { 3.14f, 55.6f, 3.5f, 8.8f };//装箱
            object m2 = GetMax(nums1, new CompareFunc(CompaerFloat));
            Console.WriteLine(m2);
            Console.ReadKey();
        }
        //我想实现的功能,如果obj1比obj2大,则返回true,否则返回false
        delegate bool CompareFunc(object obj1, object obj2);
        static bool CompaerInt(object obj1, object obj2)
        {
            int i1 = (int)obj1;
            int i2 = (int)obj2;
            return i1 > i2;

        }
        static bool CompaerFloat(object obj1, object obj2)
        {
            float i1 = (float)obj1;
            float i2 = (float)obj2;
            return i1 > i2;

        }
        //方法只获取最大值,具体怎么比较委托去实现
        //GetMax把不变的算法固定下来
        static object GetMax(object[] nums, CompareFunc func)
        {
            object max = nums[0];
            for (int i = 0; i < nums.Length; i++)
            {
                if (func(nums[i], max))//调用func指向的方法,判断大小
                {
                    max = nums[i];
                }
            }
            return max;
        }
    }
View Code

 泛型委托

    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = new int[] { 3, 88, 9, 21 };
            int m = GetMax<int>(nums, CompaerInt);
            Console.WriteLine(m);
            Console.ReadKey();
        }
        static bool CompaerInt(int i1, int i2)
        {
            return i1 > i2;

        }
        delegate bool CompareFunc<T>(T obj1, T obj2);
        static T GetMax<T>(T[] nums, CompareFunc<T> func)
        {
            T max = nums[0];
            for (int i = 0; i < nums.Length; i++)
            {
                if (func(nums[i], max))//调用func指向的方法,判断大小
                {
                    max = nums[i];
                }
            }
            return max;
        }
    }
View Code

3.内置泛型委托Func,Action

4匿名方法

    class Program
    {
        static void Main(string[] args)
        {
            MyDel d1 = delegate (int i1, string s1)
              {
                  Console.WriteLine("我是匿名方法:"+i1+s1);
                  return true;
              };
            bool b1 = d1(5,"aaaa");
            Console.WriteLine(b1);
            Console.ReadKey();
        }
        static bool F1(int i,string str)
        {
            Console.WriteLine("i="+i+",str="+str);
            return false;
        }
    }
    delegate bool MyDel(int i, string s);
View Code

 5.lambda

        static void Main(string[] args)
        {
            Action<int> a1 = delegate (int i) { Console.WriteLine(i); };
            a1(5);
            //lambda 表达式格式的匿名方法的写法
            Action<int> a2 = (int i) => { Console.WriteLine(i); };
            a2(666);
            Action<int> a3 = (i) => { Console.WriteLine(i); };
            //如果有一个参数,可以不写参数的小括号
            Action<int> a4 = i => { Console.WriteLine(i); };

            Func<string, int, bool> f1 = delegate (string s, int i) { return true; };
            Func<string, int, bool> f2 = (string s, int i) => { return true; };
            Func<string, int, bool> f3 = (s, i) => { return true; };

            //如果委托有返回值,并且方法体只有一行代码,这一行代码还是返回值,那么就可以连方法的大括号和return都省略
            Func<string, int, bool> f4 = (s, i) =>   true;

            Console.ReadKey();
        }
View Code

 7.lambda改造GetMax

    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = new int[] { 3, 88, 6, 9 };
            //int m = GetMax(nums, CompareInt);

            //1.
            //Func<int, int, bool> f = delegate (int i1, int i2) { return i1 > i2; };
            //int m = GetMax(nums, f);

            //2.
            //int m = GetMax(nums, delegate (int i1, int i2) { return i1 > i2; });

            //3.
            //int m = GetMax(nums, (i1, i2) => { return i1 > i2; });

            //4.
            int m = GetMax(nums, (i1, i2) => i1 > i2);

            Console.WriteLine(m);
            Console.ReadKey();
        }

        private static bool CompareInt(int i1, int i2)
        {
            return i1 > i2;
        }

        static T GetMax<T>(T[] objs, Func<T, T, bool> ComareFunc)
        {
            T max = objs[0];
            for (int i = 0; i < objs.Length; i++)
            {
                if (ComareFunc(objs[i], max))
                {
                    max = objs[i];
                }
            }
            return max;
        }
    }
View Code

 8.编写自己的MyWhere

    class Program
    {
        static void Main(string[] args)
        {
            int[] num = new int[] { 3, 5, 9, 12, 38, 9 };
            IEnumerable<int> r1 = num.MyWhere(i => i > 10);
            foreach (int item in r1)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
    static class JiHeExt
    {
        public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)
        {
            //foreach()面试题:什么样的对象可以使用foreach遍历:实现了IEnumerable接口
            //List ,数组 等都实现了IEnumerable
            List<T> resuletList = new List<T>();
            foreach (T item in data)
            {
                if (func(item))//判断遍历到的这条数据是否满足条件func
                {
                    resuletList.Add(item);
                }
            }
            return resuletList;
        }
    }
View Code

 9.集合常用高级扩展方法

        static void Main(string[] args)
        {
            List<int> list = new List<int>();
            list.Add(3);
            list.Add(9);
            list.Add(8);
            list.Add(16);
            list.Add(99);
            IEnumerable<int> data = list.Where(i => i > 10);
            foreach (var item in data)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
View Code
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
            list.Add(3);
            list.Add(9);
            list.Add(8);
            list.Add(16);
            list.Add(99);
            IEnumerable<int> data = list.Select(i => i * 10);
            foreach (var item in data)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }
View Code
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
            list.Add(3);
            list.Add(9);
            list.Add(8);
            list.Add(16);
            list.Add(99);
            IEnumerable<string> data = list.Select(i => "批量添加"+i * 10);
            foreach (var item in data)
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }
View Code
    class Program
    {
        static void Main(string[] args)
        {
            Person[] persons = new Person[] { new Person("baidu", 8), new Person("qq", 18), new Person("sina", 5) };
            int sun1 = persons.Sum(p => p.age);
            Console.WriteLine(sun1);
            Console.ReadKey();
        }
    }
    class Person
    {
        public Person()
        {

        }
        public Person(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public string name { get; set; }
        public int age { get; set; }
    }
View Code

 10.委托的组合

    class Program
    {
        delegate void MyDel(int i);
        static void Main(string[] args)
        {
            MyDel d1 = F1;
            MyDel d2 = F2;
            MyDel d3 = F3;
            MyDel d4 = d1 + d2 + d3;
            MyDel d5 = new MyDel(F1) + new MyDel(F2) + new MyDel(F3);
            d4(9);
            d5(1);
            Console.ReadKey();
        }
        static void F1(int i)
        {
            Console.WriteLine("我是f1:" + i);
        }
        static void F2(int i)
        {
            Console.WriteLine("我是f2:" + i);
        }
        static void F3(int i)
        {
            Console.WriteLine("我是f3:" + i);
        }
    }
View Code

 11.事件入门

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.OnBenMingNian += BMN;//注册一个监听
            p1.OnBenMingNian += BMN2;//注册一个监听
            p1.Age = 24;
            Console.WriteLine(p1.Age);
            Console.ReadKey();
        }
        static void BMN()
        {
            Console.WriteLine("到了本命年了");
        }
        static void BMN2()
        {
            Console.WriteLine("到了本命年了2");
        }
    }
    class Person
    {
        private int age;
        public int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                this.age = value;
                if (value % 12 == 0)
                {
                    if (OnBenMingNian != null)
                    {
                        //触发事件
                        OnBenMingNian();
                    }
                }
            }
        }
        public event Action OnBenMingNian;//event 委托类型 事件的名字
        //public  Action OnBenMingNian; 加event 就是事件,不加event就是委托
        //委托可以p1.OnBenMingNian =null
        //事件不可以p1.OnBenMingNian = null
    }
View Code

 12.事件本质揭秘

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.OnBenMingNian += BMN;//注册一个监听
            p1.OnBenMingNian += BMN2;//注册一个监听
            p1.Age = 24;
            Console.WriteLine(p1.Age);
            Console.ReadKey();
        }
        static void BMN()
        {
            Console.WriteLine("到了本命年了");
        }
        static void BMN2()
        {
            Console.WriteLine("到了本命年了2");
        }
    }
    class Person
    {
        private int age;
        public int Age
        {
            get
            {
                return this.age;
            }
            set
            {
                this.age = value;
                if (value % 12 == 0)
                {
                    if (this._OnBenMingNian != null)
                    {
                        //触发事件
                        this._OnBenMingNian();
                    }
                }
            }
        }
        //public event Action OnBenMingNian;//event 委托类型 事件的名字
        //public  Action OnBenMingNian; //加event 就是事件,不加event就是委托
        //委托可以p1.OnBenMingNian =null
        //事件不可以p1.OnBenMingNian = null
        private Action _OnBenMingNian;
        public event Action OnBenMingNian
        {
            add
            {
                this._OnBenMingNian += value;
            }
            remove
            {
                this._OnBenMingNian -= value;
            }
        }
    }
View Code

 第三章:反射和Attribute(新版)

1.反射入门及Type

namespace 反射
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            Person p2 = new Person();
            Person p3 = new Person();
            Person p4 = new Person();
            //下面有N种获取Person对应的Type对象的方法
            //最终都是获得的同一个对象,因为一个类就对应一个对象
            Type t1 = p1.GetType();
            Type t2 = p2.GetType();
            Type t3 = typeof(Person);
            Type t4 = Type.GetType("反射.Person");
            Console.WriteLine(t1);
            Console.WriteLine(t2);
            Console.WriteLine(t3);
            Console.WriteLine(t4);

            Console.WriteLine(object.ReferenceEquals(t1, t2));
            Console.WriteLine(object.ReferenceEquals(t2, t3));
            Console.WriteLine(object.ReferenceEquals(t3, t4));
            //Activator.CreateInstance(t1)动态创建类,类必须public 且无参的构造函数
            object obj = Activator.CreateInstance(t1);//动态创建t1指向的类的对象.new Person();
            Console.WriteLine(obj);
            Console.ReadKey();
        }
    }
    class Person//一个类对象一个Type对象
    {
        public override string ToString()
        {
            return "我是Person";
        }
    }
}
View Code

 2.this的本质

    class Program
    {
        static void Main(string[] args)
        {
            //this不是代表"当前类",而是代表"当前对象",this看做当前对象的一个特殊的变量
            Child1 c1 = new Child1();
            c1.Hell();//this.Child1
            Child2 c2 = new Child2();
            c2.Hell();//this.Child2
            Person p1 = new Person();
            p1.Hell();//this.Person
            Console.ReadKey();
        }
    }
    class Person
    {
        public void Hell()
        {
            Type type = this.GetType();
            Console.WriteLine(type);
        }

    }
    class Child1 : Person
    {

    }
    class Child2 : Person
    {

    }
View Code
    class Program
    {
        static void Main(string[] args)
        {
            //this不是代表"当前类",而是代表"当前对象",this看做当前对象的一个特殊的变量
            Child1 c1 = new Child1();
            c1.Hell();//this.Child1
            Child2 c2 = new Child2();
            c2.Hell();//this.Child2
            Person p1 = new Person();
            p1.Hell();//this.Person
            Console.ReadKey();
        }
    }
    class Person
    {
        public void Hell()
        {
            this.Test();
        }
        public virtual void Test()
        {
            Console.WriteLine("parent test");
        }

    }
    class Child1 : Person
    {
        public override void Test()
        {
            Console.WriteLine("Child1 test");
        }
    }
    class Child2 : Person
    {
        public override void Test()
        {
            Console.WriteLine("Child2 test");
        }
    }
View Code

 3.Type的常见成员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace type常见成员
{
    class Program
    {
        static void Main(string[] args)
        {
            /* 
            Type t1 = typeof(Person);
            Type t1Type = t1.GetType();
            Console.WriteLine(t1Type);
            Console.WriteLine(t1.Name);
            Console.WriteLine(t1.FullName);//type常见成员.Person
            Console.WriteLine(t1Type.BaseType.BaseType.BaseType);
            int[] nums = new int[] { 3,5,8};
            Type t2 = nums.GetType();
            Console.WriteLine(t2.IsArray);*/
            Type t1 = typeof(Person);
            //获取构造函数
            ConstructorInfo c1 = t1.GetConstructor(new Type[0]);
            ConstructorInfo c2 = t1.GetConstructor(new Type[] { typeof(string) });
            ConstructorInfo c3 = t1.GetConstructor(new Type[] { typeof(int), typeof(string) });
            Console.WriteLine(c1);
            Console.WriteLine(c2);
            Console.WriteLine(c3);

            FieldInfo[] fields = t1.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (FieldInfo field in fields)
            {
                Console.WriteLine(field);
            }
            //方法
            MethodInfo[] methods = t1.GetMethods();
            foreach (var method in methods)
            {
                Console.WriteLine(method);
            }
            MethodInfo m1 = t1.GetMethod("SayHi", new Type[0]);
            Console.WriteLine(m1);
            PropertyInfo []peopers = t1.GetProperties();
            foreach (PropertyInfo prop in peopers)
            {
                Console.WriteLine(prop);
            }
            PropertyInfo peoper = t1.GetProperty("Name");
            Console.WriteLine();
            Console.ReadKey();
        }
    }
    class Person
    {
        public Person()
        {

        }
        public Person(string name)
        {

        }
        public Person(int i, string name)
        {

        }
        public string Name { get; set; }
        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
        public void SayHi(string str)
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
    }
}
View Code

4.MethodInfo,Propert 

5.反射调用示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace type常见成员
{
    class Program
    {
        static void Main(string[] args)
        {

            Type type = typeof(Person);
            object obj = Activator.CreateInstance(type);//new Person
            object obj2 = type.GetConstructor(new Type[0]).Invoke(new object[0]);
            PropertyInfo propName = type.GetProperty("Name");//获取Name属性
            propName.SetValue(obj, "aaa");//相当于obj.Name="aaa";
            PropertyInfo propAge = type.GetProperty("Age");
            propAge.SetValue(obj, 18);//obj.Age=18;

            //获得SayHi()方法
            MethodInfo methodSayHi = type.GetMethod("SayHi", new Type[0]);
            methodSayHi.Invoke(obj, new object[0]);//在obj指向的对象上调用SayHi.相当于obj.SayHi
            Console.ReadKey();
        }
    }
    class Person
    {
        public Person()
        {

        }
        public Person(string name)
        {

        }
        public Person(int i, string name)
        {

        }
        public string Name { get; set; }
        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
        public void SayHi(string str)
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
    }
}
View Code

 6.模拟propertyGrid

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 模拟
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 18;
            p1.Name = "aaa";
            ShowObject(p1);
            Console.ReadKey();
        }
        static void ShowObject(object obj)
        {
            Type type = obj.GetType();
            PropertyInfo[] props = type.GetProperties();
            foreach (PropertyInfo prop in props)
            {
                if (prop.CanRead)
                {
                    string propName = prop.Name;
                    object value = prop.GetValue(obj);//获取obj对象的prop属性的值
                    Console.WriteLine(propName + "=" + value);
                }
            }
        }
    }
    class Person
    {
        public Person()
        {

        }
        public Person(string name)
        {

        }
        public Person(int i, string name)
        {

        }
        public string Name { get; set; }
        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
        public void SayHi(string str)
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
    }
}
View Code

 7.反射案例:对象的拷贝

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace 对象浅拷贝
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 18;
            p1.Name = "aaa";

            Person p3 = (Person)MyClone(p1);
            p3.SayHi();
            Console.WriteLine(object.ReferenceEquals(p1, p3));
            Console.ReadKey();
        }
        //创建obj对象的一份拷贝
        static object MyClone(object obj)
        {
            Type type = obj.GetType();
            Object newObj = Activator.CreateInstance(type);//创建一个拷贝对象
            foreach (var prop in type.GetProperties())
            {
                if (prop.CanRead && prop.CanWrite)//get.set
                {
                    object value = prop.GetValue(obj);//获取obj对象的属性的值
                    prop.SetValue(newObj, value);//把值赋值给newObj对应的属性
                }
            }
            return newObj;
        }
    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
    }
}
View Code

 8.Attribute简介

EF模式就和反射有关

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PropertyGridTest01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Person p1 = new Person();
            p1.Age = 18;
            p1.Name = "aaa";
            propertyGrid1.SelectedObject = p1;
            p1.SayHi();
        }
    }
    class Person
    {
        public Person()
        {

        }
        public Person(string name)
        {

        }
        public Person(int i, string name)
        {

        }
        [ReadOnly(true)]//只读
        [DisplayName("姓名")]//显示名字
        public string Name { get; set; }
        [Browsable(false)]//不显示
        [DisplayName("年龄")]
        public int Age { get; set; }
        [Obsolete]//已过时
        public void SayHi()
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
        public void SayHi(string str)
        {
            Console.WriteLine("大家好,我是" + this.Name + ",我的年龄是" + this.Age);
        }
    }
}
View Code

 第四章:正则、序列化、XML(新版)

1.正则表达式基本概念

.表示除了
以外的任意的单个字符

[0-9]表示的是0到9之间任何一个整数数字;[a-z]任意一个小写字母,[A-Z]任意一个大写字母

d数字,D非数字,s空白,S非空白,w小写字母和数字和汉字,W特殊符号。正则表达式中的是真的。

表示对于.等特殊字符转义

()提升优先级别和提取组

[]代表一个区间中的任意一个[abcd]就代表abc或者数字中的任意一个字符

| 或者

+是出现1次到无限次

*是出现0次到无限次

?是出现0次到1次

{5}出现5次,{1,2}一次或两次,{5,8}为5至8次,{1,}最少一次,{3,}最少3次

^以…开始,$以…结束
View Code

 2.正则表达式匹配案例

1、这样写是有缺陷的Regex.IsMatch("18911111234", @"d{11}")、Regex.IsMatch("3333333333333333", @"d{11}"),应该使用^$改成Regex.IsMatch("18911111234333", @"^d{11}$")

2、手机号:@"^1d{10}$"

3@"^d{5,10}$"匹配QQ号

4、ipv4地址:@"^d{1,3}.d{1,3}.d{1,3}.d{1,3}$"  正则表达式很难“一步到位”。192.168.1.15   

5@"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$" 匹配邮箱

6、[u4e00-u9fa5]  单个汉字      @"^[u4e00-u9fa5]{2,4}$" 长度为2-4的汉字姓名

7、身份证号(15位、18位数字):@"^(d{15})$|^(d{18})$"

8、身份证号(18位,最后一位可能是x)  @"^(d{17})[dxX]$"

8、日期格式:^d{4}-d{1,2}-d{1,2}$
View Code

 3.正则表达式的内容提取

        static void Main(string[] args)
        {
            Console.WriteLine(Regex.IsMatch("6725d", @"^d{4}$"));
            
            Match match = Regex.Match("2016-5-15", @"^(d{4})-(d{1,2})-(d{1,2})$");
            if (match.Success)
            {
                string year = match.Groups[1].Value;//序号从1开始
                string mouth = match.Groups[2].Value;
                string day = match.Groups[3].Value;
                Console.WriteLine(year + "-" + mouth + "-" + day);
            }
            else
            {
                Console.WriteLine("不匹配");
            }
            Console.ReadKey();
        }
View Code

 4.序列化的应用

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace 序列化
{
    class Program
    {
        static void Main(string[] args)
        {
            //序列化
            Person p1 = new Person();
            p1.Name = "tom";
            p1.Age = 18;
            BinaryFormatter binfor = new BinaryFormatter();
            using (FileStream fs = File.OpenWrite(@"C:UserswylDesktop1.data"))
            {
                binfor.Serialize(fs, p1);//把p1指向的对象序列化保存到fs流中
            }

            //反序列化
            BinaryFormatter binfor1 = new BinaryFormatter();
            using (FileStream fs = File.OpenRead(@"C:UserswylDesktop1.data"))
            {
                Person p2 = (Person)binfor1.Deserialize(fs);
            }

            Console.ReadKey();
        }
    }
    [Serializable]
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
View Code

5.

7.XML的读取

XmlDocument doc = new XmlDocument();

doc.Load(@"C:	empa.xml");            

XmlNodeList students = doc.DocumentElement.ChildNodes;//Student节点集合

foreach (XmlNode stu in students)

{

    XmlElement element = (XmlElement)stu;

    string stuId = element.GetAttribute("StuID");

    XmlNode nameNode = element.SelectSingleNode("StuName");//获取Person节点的Name节点

    string name = nameNode.InnerText;

    Console.WriteLine(stuId + "," + name);

}
View Code

 8.XML的生成

class Person

{

    public Person(int id, string name, int age)

    {

        this.Id = id;

        this.Name = name;

        this.Age = age;

    }

    public int Id { set; get; }

    public string Name { set; get; }

    public int Age { set; get; }

}





Person[] persons = { new Person(1, "rupeng", 8), new Person(2, "baidu", 6) };

XmlDocument doc = new XmlDocument();

XmlElement ePersons = doc.CreateElement("Persons");

doc.AppendChild(ePersons);//添加根节点

foreach (Person person in persons)

{

    XmlElement ePerson = doc.CreateElement("Person");

    ePerson.SetAttribute("id", person.Id.ToString());

    XmlElement eName = doc.CreateElement("Name");

    eName.InnerText = person.Name;

    XmlElement eAge = doc.CreateElement("Age");

    eAge.InnerText = person.Age.ToString();

    ePerson.AppendChild(eName);

    ePerson.AppendChild(eAge);

    ePersons.AppendChild(ePerson);

}

doc.Save("d:/temp/1.xml");
View Code
原文地址:https://www.cnblogs.com/wangyinlon/p/6946860.html