C#一路成神

C#一路成神

  • 前言
  • 一、C#基础
    • 访问修饰符
    • 匿名方法
  • 二、C#进阶
    • 泛型
    • 委托(Delegate)
    • 事件
    • 事件和委托的不同点
    • Lambda表达式:
    • 自定义泛型委托
    • 系统泛型委托
  • 三、C#高级
  • 总结


前言

本文介绍了C#基础到高级的全部知识,持续更新中,要看哪部分私信我,我加上去。觉得不完善的地方也烦请私信我补充


一、C#基础

访问修饰符

在C#语言中,共有五种访问修饰符:public、private、protected、internal、protected internal。作用范围如下表:

  • public 公有访问。不受任何限制。
  • private 私有访问。只限于本类成员访问,子类,实例都不能访问。
  • protected 保护访问。只限于本类和子类访问,实例不能访问。
  • internal 内部访问。只限于本项目内访问,其他不能访问。
  • protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问

匿名方法

  • 概念:一个方法没有具体名称,而只有关键字delegate、方法参数、方法体
  • 好处:将具体方法和委托直接关联到一起,如果我们基于委托只需要一个方法的时候,选匿名方法

二、C#进阶

泛型

  1. 泛型定义

    • 泛型:是一种程序特性,定义时不对类型做出明确的规定,使用时规定且不能改变
    • 一般应用:泛型集合、泛型方法、泛型类、泛型委托
    • 泛型方法:方法的返回值类型、参数类型定义成泛型类型
    • 泛型集合:如List、Dictionary ,所在命名空间:System.Collections.Generic
    • 非泛型集合:ArrayList、Hastable,所在命名空间:System.Collections
      非泛型集合ArrayList里面可以添加任意类型,但对于数据本身来说,是非常不安全的,还存在拆装箱问题
      • 装箱:将值类型的元素放到集合中会被转换成object类型
      • 拆箱:将一个集合的元素取出来,但这个元素本身是值类型,必须进行强制类型转换
      • 弊端:如果存储大量的数据,会影响性能
  2. 对于泛型赋值出现问题:

    • default关键字的使用,主要用于直接的赋值,引用类型赋值为null,值类型给值默认值
    • 泛型约束:where T1:class //T1必须是引用类型,where T2:struct //T1必须是值类型,where T3:new()//必须有一个无参构造方法
    • 由于泛型类型是不确定的,所以泛型类型在编译阶段无法直接转换,可采用dynamic类在运行动态解析对象类型,在编译阶段是不解析的,类型转换不对,会在运行时报错

委托(Delegate)

  1. 委托定义
    一种程序特性,用来表示方法,即是方法的代表、指针,把方法当成参数传递

  2. 委托的作用
    使用委托使程序员可以将方法引用封装在委托对象内,然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。我们直接调用不了方法,就可以用委托来进行调用

  3. 委托的使用
    五大步骤:
    1、声明委托(定义方法的原型:方法的返回值类型、方法的参数类型和个数)
    2、根据委托编写方法
    3、创建委托变量
    4、将委托变量和一个或多个符合委托定义的方法关联
    5、通过委托变使用具体的方法(不是直接使用方法) 及委托特有的Invoke();

  4. 委托的妙用
    通过委托变量,可以轻松调用它所关联的具体方法,如果我们给委托变量同时关联多个方法,当我们使用委托变量的时候,方法的执行顺序将会按照你关联的顺序依次执行,即多路委托或多播委托,我们不仅可以动态的增加委托方法的关联,还可以动态的移除方法的关联

  5. 使用委托进行变量传递
    在多窗体通信中的使用:
    在主窗体A中,创建了若干个子窗体B的对象。现在B窗体需要调用A中的一个方法,正常情款况是不行的,但可以通过委托实现

    提示:我们使用委托完成任务时,委托变量在哪里使用就在哪里定义,委托变量和具体方法的关联通常是分开的,一般方法在哪里定义就在哪里关联,委托变量用+=还是=得看委托变量是否是单个对象

    总结:B1->A B2->A B3->A
    扩展:通过委托如何实现消息的广播?
    在哪里接收消息,方法就定义在哪

事件

  1. 事件的定义
    事件是对象对外界信息的刺激,产生的一种消息响应机制,事件是委托的进一步包装

  2. 事件的参与者
    事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型

    • 发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象
    • 订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)
  3. 事件的使用
    五大步骤:
    1、定义委托
    2、定义事件
    3、激发事件(调用委托)
    4、编写事件响应方法
    5、关联事件

事件和委托的不同点

  1. 事件无法直接赋值,比如事件=null,会出现编译错误,而委托可以
    好处:避免用户对事件直接操作,比如Click事件,如果允许Click=null,会把底层代码清除,可以起到保护,委托相对太开放了

  2. event对象没有invock()方法,智能通过括号的方式运行

  3. 委托和事件的选择:

    • 正常解决问题,你使用委托和事件没什么本质区别,所以,建议用委托
    • 如果我们做控件二次开发,扩展控件的事件的时候,必须用事件

Lambda表达式:

在C#3.0出现,使用这种表达式,可以更简练的编写代码块
  1. 在Lambda表达式中参数类型可以使用明确类型,也可以是推断类型
  2. 如果是推断类型,则参数类型可以由编译器根据上下文推断出来
  3. 运算符=>读作goes to,运算符左边的是参数,右边是表达式或语句块
  4. 表达式使用的两种方式
    • (input args)=>表达式
    • (input args)=>{语句1;语句2;语句3…}
  5. Lambda表达式和匿名方法的比较
    • Lambda表达式本身就是匿名方法
    • Lambda表达式允许不指明参数类型,但是匿名方法不许明确
    • Lambda表达式允许单一的表达式或多条表达式组成,而匿名方法不允许单一表达式

自定义泛型委托

形式:public delegate T MyGenericDelegate (T params1,T params2);

  1. 为什么要用泛型委托?
    普通委托在数据类型的限定上非常严格的,有时候我们需求变化,可能适应不了
  2. 泛型委托定义:本质上和泛型方法非常相似,泛型委托关联时,可以是具体方法、匿名方法、Lambda表达式

系统泛型委托

两种:

  1. 有返回值Func
    基本使用了自定义委托一致,不用声明
    高级使用
  2. 没有返回值Action

三、C#高级

待补充


总结

哪里看得不够过瘾的私信我!

你可能感兴趣的:(C#,c#,后端,软件工程)