zoukankan      html  css  js  c++  java
  • 那些年,我还在学习C#

    那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的。C#是一门面向对象的语言,具有面向对象的基本特征,抽象、封装、继承、多态等性质。学习C#除了一些基本的语法,还得学习一些新的特性,比如说:泛型、多线程、集合、反射等,下面就选其中一些来学习吧!

    一、C#中的各种器

           A、 C#构造器-构造函数

           如下:

        

      //构造器1
    
            public Products(int id)
    
            {
    
                _Id = id;
    
            }
    
            //构造器2,使用this来调用构造器1
    
            public Products(int id, string Name, string Band)
    
                : this(id)
    
            {
    
                _ProductName = Name;
    
                _ProductBand = Band;
    
            }

    静态构造器-用来对类进行初始化信息,它不是显示调用的,在首次访问类时将自动调用,用来初始化类的一些基本信息而不是对象,但最好不要使用静态的构造器,代码如下:

       

     static Products() { }//静态构造器
    
        public Products() { }

          B、初化器-在没有带参数的构造器时,我们可以用初始化器对对象的共公属性进行初始化

      如下:

         

     //产品的集合List
    
                List<Products> ListProduct = new List<Products>()
    
                {
    
                    new Products() { _Id = 1, _ProductName = "whc" },//使用{}是调有用初始化器,对属性进行初始化
    
                    new Products() { _Id = 1, _ProductName = "whc1", _ProductBand = "ctbu" },
    
                    new Products() { _Id = 1, _ProductName = "whc2", _ProductBand = "ctbu" }
    
                };

        C、终结器

       终结器是在一次对象最后一次活动之后,并在程序终止之前执行。拉圾回收器会在回收过程中,找到带有终结器的对象,然后加入到终结队列,线程遍历完了,就调用终结队列上对象的终结器来回收资源

    二、C#中那些重要的知识

      A、委托与事件

        委托

       C#中将一个方法作为一个参数传递给其它方法使用,实现这样功能的模式叫做委托

       1、委托的类型:是强类型,因为在声明委托方法时,指定的参数,在调用这个委托时必须传递相同类型的参数与参数个数

       2、委托的内部机制:C#中所有的委托都继承自System.Delegate,但是我们不能继承它来实现自定义的委托,可以使用delegate关键字来定义

       3、委托的定义:使用delegate关键字来使用

       4、委托的实例化:定义一个与委托相同类型的函数,作为委托的参数传递,不需要用new关键字进行实例化,它可以通过委托推断,在C#1.0中,在传递方法时,需要用new delegate(Method)

       5、委托的使用:

       

     class DelegateClass
    
        {
    
            //一个泛型的委托,可以不同类型的参数进行处理
    
            public delegate void AlculateMethod<T>(T first, T second);
    
        }
    
         class MehtodConllection
    
        {
    
            public void AlculateAdd<T>(T first, T second)
    
            {
    
                string third = first.ToString() + second.ToString();
    
                System.Console.WriteLine(third);
    
            }
    
            public void AlculateDelete(int first, int second)
    
            {
    
                System.Console.WriteLine(first - second);
    
            }
    
            public void AlculateAddOther<T>(T first, T second)
    
            {
    
                string third = first.ToString() + "Hello Word" + second.ToString();
    
                System.Console.WriteLine(third);
    
            }
    
        }
    
          private static void _Demo4()
    
            {
    
                //方法的集合
    
                MehtodConllection mc = new MehtodConllection();
    
                //泛型的委托声明
    
                DelegateClass.AlculateMethod<string> Demo = null;
    
                //添加委托方法
    
                Demo += mc.AlculateAdd<string>;
    
                //
    
                Demo += mc.AlculateAddOther<string>;
    
                //调用方法,所有在委托中的方法都能被执行
    
                Demo("str", "sterte");
    
            }

    事件

        事件是一种特殊的委托,在声明委托时,添加一个event关键字

        步骤:

         1、定义委托的类型,相当于一个类,如:  public delegate void ActionMethod();

         2、定义事件委托变量,用1、中的委托类型定义,如: public event ActionMethod amd;

         3、调用定义的事件,触发器,如:

         

      class Cat
    
        {
    
            //定义委托方法
    
            public delegate void ActionMethod();
    
            //声明事件委托
    
            public event ActionMethod amd;
    
            //触发事件
    
            public void CatShout()
    
            {
    
                System.Console.WriteLine("猫叫了,事件触发了!!!");
    
                amd();
    
            }
    
        }

         4、向事件中添加方法,将方法与事件绑定在一起,以便在触发时一起执行,如:

          

      private static void _Demo15() {
    
                Cat cat = new Cat();
    
                HostPerson hp = new HostPerson();
    
                Mouse mouse = new Mouse();
    
               
    
                cat.amd += mouse.runing;
    
                cat.amd += hp.WeekUp;
    
                cat.CatShout();       
    
            }

          5、最后触发事件

    B、反射与特性

      反射

       1、反射的作用:

         (1)、访问程序集中的元数据,比如说,方法属性修鉓符

         (2)、使用元数据,在运行时动态的调用元数据的成员与属性等,而不是在编译时进行绑定

       2、反射是择指对一个程序集中的元数据进行检查的过程,并且可以列举程序集的类型与属性,以及使用一些特定的对象调用上面的成员

       3、使用System.Type访问元数据

         类型的元数据System.Type是一个实例,这个实例提供了一些方法,这些方法可以列举元数据的成员,主要方法有以下几种:

         Type.Name、Type.IsPublic、Type.BaseType、Type.GetInterface()、Type.Assemble、Type.GetProperties()、Type.GetMethod()、Type.GetField()、Type.GetCustomAttributes()等属性

         (1)、使用GetType()得到元数据的类型对象(System.Type)

           例:

    类一:     

     

    class CustomClass
    
        {
    
            private string Name = "Test";
    
            public string _Name = "Demo";
    
            private int index { get; set; }
    
            public int _index { get; set; }
    
            private void GetName()
    
            {
    
            }
    
            public void Get_Name()
    
            {
    
            }
    
        }

    类二:同时使用了typeof与GetType()来得到类型对象

         

     public void Exec()
    
            {
    
                CustomClass cc = new CustomClass();
    
                //得到当前类型的实例对象
    
                Type type = cc.GetType();           
    
                  //得到当前类型的实例对象使用typeof
    
                //Type type = typeof(CustomClass);           
    
                //遍历public的属性,而不是字段,使用GetProperties()
    
                foreach (PropertyInfo property in type.GetProperties())
    
                {
    
                    //得到属性名
    
                    System.Console.WriteLine(property.Name);
    
                    //得到属性的类型
    
                    System.Console.WriteLine(property.PropertyType);
    
                    //得到反射的类型,就是反射对象的类名
    
                    System.Console.WriteLine(property.ReflectedType);
    
                    //得到成员类型,是属性还是方法
    
                    System.Console.WriteLine(property.MemberType);
    
                }
    
                System.Console.WriteLine("------------------------------------------");
    
                //得到当前对象的公共方法,包含公共属性的方法get,set
    
                foreach (System.Reflection.MethodInfo method in type.GetMethods())
    
                {
    
                    //方法名
    
                    System.Console.WriteLine(method.Name);
    
                    //成员的类型
    
                    System.Console.WriteLine(method.MemberType);
    
                }
    
            }

    结果:

      (2)、得到与设置属性的值

                    

       //设置属性的值
    
                    property.SetValue(cc, 45, null);
    
                    //得到属性的值
    
                    System.Console.WriteLine(property.GetValue(cc, null).ToString());

      (3)、调用方法Invoke()函数

            

     MethodInfo demo = type.GetMethod("Get_Name");
    
                demo.Invoke(cc, null);

           得到一个无参的方法Get_Name,若有参null应为参数的数组

            如:    //调用有参的

             

       MethodInfo test = type.GetMethod("GetName");
    
                string[] param = { "12" };
    
                test.Invoke(cc, param);

    特性 (attribute)

       1、特性是用来描述或修饰元数据的额外的信息,比如说:类、属性、程序集等

       2、自定义特性,继承自Attribute类

          如下:

           

    class CustomAttribute : Attribute
    
        {
    
            public CustomAttribute();
    
            public CustomAttribute(AttributeTargets validOn);
    
            public bool AllowMultiple { get; set; }
    
            public bool Inherited { get; set; }
    
            public AttributeTargets ValidOn { get; }
    
        }

        使用:

        

      [CustomAttribute(AttributeTargets.All)]
    
        class CustomClass
    
        {
    
            [CustomAttribute(AllowMultiple = true)]
    
            [Custom(Inherited = true)]
    
            private string Name = "Test";
    
            public string _Name = "Demo";
    
            private int index { get; set; }
    
            public int _index { get; set; }
    
         }

    C、扩展方法的使用与Lambda表达式

      扩展方法

        当你不能修改一个类的时候,扩展方法是一个方便给这个类添加其它方法的方式

        1、扩展方法的定义:扩展方法使用this这个关键字,将一个方法绑定到this所指向的类型(如:类)的成员中对,从而就可以通过这个类的对象来调用这个方法,在MVC中,扩展,HtmlHelper类是很有用的,如下代码:

         

     public static class PersonExtension
    
        {
    
            public static void Extension(this PersonSingle ps, string name)
    
            {
    
                System.Console.WriteLine("Name is " + name);
    
            }
    
        }

         将Extension(string name)这方法添加到PersonSingle中去,然后就可以通过对象调用这个方法

    PersonSingle类:

        

     public class PersonSingle
    
        {
    
            public void Show()
    
            {
    
                System.Console.WriteLine("PersonSingle Method!!!");
    
            }
    
        }

    测试:

         

    private static void _Demo16()
    
            {
    
                PersonSingle ps = new PersonSingle();
    
                ps.Show();
    
                ps.Extension("whc");
    
            }

       2、扩展方法的访问权限要与所扩展的类的方法一致,这里都是public

        3、扩展方法是写在一个静态类中的静态方法

    Lambda表达式

       Lambda表达式是一种比匿名方法更加简洁的一种匿名函数语法,其主要分为二类:一是语句lambda,二是表达式lambda

      1、语句Lambda:是一种匿名方法的简化语法,其中不包含delegate关键字,只需要使用lambda运算符=>,是一个语句块

        例:

           

    Demo += (string first, string second) =>
    
                {
    
                    System.Console.WriteLine();
    
                };

      2、表达式Lambda:是一个表达式,而不是一个语句块

        例:

         

      Demo = (first, second) => first.ToString();

    3、Lambda表达式中能使用外部的变量

    总结

     那些年学习C#,作了一些笔记,此文大都直接从笔记中拷贝,当然还有很多没有提到,将在下次追加一些;此文以回忆那些年学习的日子。

  • 相关阅读:
    从菜鸟腾飞至专家(我的心得)
    SQL 绕圈算法???
    asp access 时间段
    SQL 绕圈算法2???
    月薪三万的一道面试题
    Java方法参数是引用调用还是值调用?——值调用
    简述一个大型交易网站的发展旅程
    Java分布式应用学习笔记04JDK的并发包的集合总结
    ORACLE 执行计划中cost cardinality bytes cpu_cost io_cost解释
    剖析float型的内存存储和精度丢失问题
  • 原文地址:https://www.cnblogs.com/xin_ny/p/2377193.html
Copyright © 2011-2022 走看看