【C#】20180906关于C#的基础知识点

1、面向对象编程的三大特征:封装、继承、多态

  • 封装:例如类、接口、方法等,让用户只关心对象的用法而不用关心对象的实现
  • 继承:保留原有功能的基础上进行改进的过程,体现在类之间的继承
  • 多态:多重形式,通过类的继承或接口实现,提高程序的复用性和可移植性

2、类的成员:字段、属性、方法

属性和字段的区别:

在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

class MyClass

{
       Private  string  name;

 public string Name

 {

  get {return Name;}

  set {Name=value;}

 }

}

(1)属性可以保证安全,当不在本类中使用时可以保证使用属性名可以避免用字段的名字。
(2)属性的set和get函数可以限制字段的一些功能,以达到某种目的。 如: private int a=0;

public int A
{
     get{return this.a;}
     set
     {
         if(value >= 0 && value <= 100)
              this.a=value;
         else
              throw new Exception("值的范围不合法。");
     }
}

(3)属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。

3、构造方法和析构方法
构造方法是在创建类的对象时执行的,而析构方法则是在垃圾回收、释放资源时使用的。

构造方法:系统自动生成的不包含参数的,与类名称相同的构造方法
析构方法:~类名(),在程序结束后自动被调用的

4、方法的重载:方法名称相同,参数列表不同(主要体现为【参数的个数】或【参数的数据类型】)

5、嵌套类与部分类
嵌套类:将一个类定义在另一个类的内部,即可将在类内部定义的类称为嵌套类,在访问时必须加上外层类的名称
部分类:表示一个类中的一部分,访问修饰符 修饰符 partial class 类名{…},部分类主要用于当一个类中的内容较多时,将相似类中的内容拆分到不同的类中,并且部分类的名称必须相同

6、继承和多态
C#语言仅支持单重继承,主要用于解决代码的重用问题。为了将继承关系灵活运用到程序设计中,在C#语言中提供了接口来解决多重继承的关系

方法隐藏——new关键字
继承中子类中定义的方法与父类同名,调用的是子类中的方法,即常说为将父类中的同名方法隐藏,为明确同名方法,在子类的方法返回值前面加上new关键字
在继承关系中,子类如果需要调用父类中的成员可以借助base关键字来完成

7、抽象方法与虚方法
virtual关键字:虚方法
通常将类中的成员定义成虚拟的,表示这些成员将会在继承后重写其中的内容,不能修饰使用static修饰的成员
子类继承父类后重写父类中的成员,关键字为override

abstract关键字:抽象方法/抽象类
抽象方法是一种不带方法体的方法,仅包含方法的定义,必须定义在抽象类中。
抽象类不能实例化。

在实际应用中,子类仅能重写父类中的虚方法或者抽象方法,【当不需要使用父类中的方法时,将其定义为抽象方法。否则定义为虚方法。】

8、sealed密封类与密封方法
密封方法必须出现在子类中,并且是子类重写的父类方法。即sealed必须与override关键字一起使用。
密封类不能被继承,密封方法不能被重写。

9、使用继承实现多态
实际上是指子类在继承父类后,重写了父类的虚方法或抽象方法。在创建父类的对象指向每一个子类的时候,根据调用的不同子类中重写的方法产生了不同的执行效果。
使用继承实现多态必须满足以下两个条件:
- 子类在继承父类时必须有重写父类的方法
- 在调用重写的方法时,必须创建父类的对象指向子类,即子类转换成父类 //父类 实例名 = new 子类();

C#语言中的多态称为运行时多态,也就是在程序运行时自动让父类的实例调用子类中重写的方法,它并不是在程序编译阶段完成的。

10、接口
在C#语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。
一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。

interface 接口名称 { 接口成员 }

接口成员的要求:

  • 不允许使用public、private、protected、internal访问修饰符
  • 不允许使用static、virtual、abstract、sealed修饰符
  • 不能定义字段
  • 定义的方法不能包含方法体

11、接口的实现
C#语言规定不能直接创建接口的实例,只能通过类实现接口中的方法,即重写接口中的方法
需要注意的是,在类实现一个接口时必须将接口中的所有成员都实现,否则该类必须声明为抽象类,并将接口中未实现的成员以抽象方式实现

隐式实现接口:将接口的所有成员以public访问修饰符修饰
显式实现接口:实现的成员名称前含有接口名作为前缀,不再使用修饰符修饰

在调用显式方式实现的接口成员时,必须使用接口的实例来调用,而不能使用实现类的实例来调用,通常使用隐式实现接口

12、抽象类与接口的区别:

  • 在接口中仅能定义成员,但不能有具体的实现;抽象类除了抽象成员以外,其他成员允许有具体的实现
  • 在接口中不能声明字段,并且不能声明任何私有成员,成员不能包含任何修饰符;在抽象类中能声明任意成员,并能使用任何修饰符来修饰
  • 接口能使用类或者结构体来继承,但抽象类仅能使用类继承
  • 在使用类来实现接口时,必须隐式或显式地实现接口中的所有成员,否则需要将实现类定义为抽象类,并将接口中未实现的成员以抽象的方式实现;在使用类继承抽象类时允许实现全部或部分成员,但仅实现其中的部分成员,其实现类必须也定义为抽象类。
  • 一个接口允许继承多个接口,一个类只能有一个父类

13、接口实现多态
通过多个类继承同一个接口,并实现接口中的成员也能完成多态的表示

需要满足的条件:
- 定义接口并使用类实现了接口中的成员
-创建接口的实例指向不同的实现类对象 //接口名 实例名 = new 继承类();

14、泛型
可空类型、泛型方法、泛型类、泛型集合

15、文件和流#

16、委托和事件

委托:委托某个方法来实现具体的功能。是一种引用类型,定义委托时与方法相似,但不能将其称为方法。
步骤:

  • 定义声明委托
  • 实例化委托
  • 调用委托

委托是C#语言中的一个特色,通常将委托分为:

  • 命名方法委托
  • 多播委托
  • 匿名委托

17、命名方法委托:

  • 修饰符 delegate 返回值类型 委托名(参数列表);
  • 委托名 实例名 = new 委托名(方法名);
  • 实例名(参数列表);

向委托中传递方法名时,根据方法类型不同而不同,如静态方法(类名.方法名),实例方法( new 类名().方法名 )

18、多播委托:
指在一个委托中注册多个方法,在注册方法时可以在委托中使用+/-号来实现添加或撤销方法
在使用时需要注意,在委托中注册的方法参数列表必须与委托定义的参数列表相同,否则不能将方法添加到委托上

class Order
{
    public static void BuyFood()
    {
        Console.WriteLine("买主食");
    }
    public static void BuyDrink()
    {
        Console.WriteLine("买饮料");
    }
    public static void BuyJunkfood()
    {
        Console.WriteLine("买零食");
    }
}

class Program
{
    public delegate void OrderDelegate();    //定义的委托与方法参数列表相同
    static void Main(string[] args)
    {
        OrderDelegate mymymy= new OrderDelegate(Order.BuyFood);   //实例化
        mymymy+=Order.BuyDrink;                       //注册方法
        mymymy+=Order.BuyJunkfood;
        mymymy();                                     //调用委托
    }
}

19、匿名委托:
使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委托的作用。

  • 定义委托:修饰符 delegate 返回值类型 委托名(参数列表);
  • 定义匿名委托:委托名 实例化委托名 = delegate { 代码块 };
  • 调用匿名委托:实例化委托名(参数列表);

在使用匿名委托时并没有定义方法,而是在实例化委托时直接实现了具体的操作。由于不能很好地实现代码的重用,适用于一些仅需要使用一次委托中代码的情况,并且代码较少。

20、事件
事件是一种引用类型,实际上也是一种特殊的委托。
通常,每一个事件的发生都会产生发送发和接收方,事件要与委托一起使用。需要在定义事件前先定义委托,定义事件后还要定义事件所使用的方法,并通过事件来调用委托。

访问修饰符 event 委托名 事件名;

class Program
{
    public delegate void SayDelegate();                       //定义委托
    pubic event SayDelegate SayEvent;                         //定义事件
    public void SayHello()                                    //定义委托中调用的方法
    {
        Console.WriteLine("Hello");
    }
    public void SayEventTrigger()                             //定义触发事件的方法
    {
        SayEvent();                                          //触发事件,必须与事件同名               
    }

    Static void Mainstring[] args)
    {
        Program program=new Program();                        //创建类的实例
        program.SayEvent=new SayDelegate(program.SayHello);   //实例化事件,使用委托指向处理方法
        program.SayEventTrigger();                            //调用触发事件的方法
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值