C#面向对象基础

一、面向对象的概念

C#是面向对象的语言,所有面向对象的语言都具有三个基本的特征,它们是:
  封装:把客观事物封装成类,并将类内部实现隐藏,以保证数据的完整性。
  继承:通过继承可以复用父类的代码。
  多态:允许将子对象赋值给父对象的一种能力

1.封装

  封装指的是把类的内部实现隐藏起来,不让对象直接对其进行操作。C#提供了属性机制对内部的状态进行操作。在C#中,封装可以通过public,protected,private,internal来体现。为什么使用封装,因为有的时候,我们把内部的数据定义为public之后,外部对象可以进行任意的操作,很可能导致不符合逻辑规则。面向对象的封装特性,是一种保护状态数据完整性的方法,在面向对象编程中,应更多的定义私有字段,并且使用属性机制来对私有字段进行访问。

2.继承

  在C#中,一个类可以继承另外一个已有的类(密封类除外),被继承的类称为基类(或者父类),继承的类称为派生类,子类将获得基类除构造函数和析构函数以外的所有成员。此外,静态类也不能被继承。例如,牛马羊都是动物,但是它们是不同种类的动物,除了动物的共性外,它们还具有各自的特点,如不同的用途,不同的发声方式等。我们可以把动物定义为牛羊马的父类。通过继承,程序可以实现对父类代码的复用。因为子类可以继承父类的所有成员,父类中定义的代码便不需要在子类中重复定义了。

3.多态

  由于可以继承基类的成员,子类就有了相同的行为,但是有时子类的某些行为需要相互区别。子类需要覆盖父类中的方法来实现子类特有的行为,这就是多态。多态即相同类型的对象调用相同的方法却表现出不同行为的现象

 

二、访问修饰符

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

 

三、值类型与引用类型

 

  值类型:byte,short,int,long,float,enum,double,decimal,char,bool 和 struct

   引用类型:string, object, array, class, interface, delegate。

1.1 内存结构:

1.Stack 栈:线程栈,由操作系统管理,存放值类型、引用类型变量(就是引用对象在托管堆上的地址)。栈是基于线程的,也就是说一个线程会包含一个线程栈,线程栈中的值类型在对象作用域结束后会被清理,效率很高。

2.GC Heap托管堆:进程初始化后在进程地址空间上划分的内存空间,存储.NET运行过程中的对象,所有的引用类型都分配在托管堆上,托管堆上分配的对象是由GC来管理和释放的。托管堆是基于进程的,当然托管堆内部还有其他更为复杂的结构,有兴趣的可以深入了解。

  • 值类型大多分配在栈上,引用类型都分配在堆上;

  • 栈由操作系统管理,栈上的变量在其作用域完成后就被释放,效率较高,但空间有限。堆受CLR的GC控制;

  • 栈是基于线程的,每个线程都有自己的线程栈,初始大小为1M。堆是基于进程的,一个进程分配一个堆,堆的大小由GC根据运行情况动态控制

1.2 值类型和引用类型的区别?

 值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等。

  1、赋值方式:将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对象的引用(即内存地址,类似C++中的指针),而不复制对象本身。

  2、继承:值类型不可能派生出新的类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。

  3、null:与引用类型不同,值类型不可能包含 null 值。然而,可空类型允许将 null 赋给值类型(他其实只是一种语法形式,在clr底层做了特殊处理)。

  4、每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,值类型初始会默认为0,引用类型默认为null。

  5、值类型存储在栈中,引用类型存储在托管堆中。

1.3 结构和类的区别?

 结构体是值类型,类是引用类型,主要区别如题1。其他的区别:

  • 结构不支持无惨构造函数,不支持析构函数,并且不能有protected修饰;
  • 结构常用于数据存储,类class多用于行为;
  • class需要用new关键字实例化对象,struct可以不适用new关键字;
  • class可以为抽象类,struct不支持抽象;

1.4 如何判定值类型和引用类型?

  简单来说,继承自System.ValueType的是值类型,反之是引用类型。

 

 

四、面向对象与面向接口的区别

 

1.成员区别

  1.1 抽象类型:

  • 成员变量:可以有变量,也可以有常量
  • 构造方法:有
  • 成员方法:可以有抽象方法,也可以有非抽象方法

   1.2 接口:

  • 只有常量
  • 构造方法:无
  • 成员方法:可以有抽象,也可以有非抽

2.关系区别

 

  1. 类与类:继承关系,单继承
  2. 类与接口:单继承,单实现和多实现都可以
  3. 接口与接口:继承关系,单继承与多继承

 3.设计理念

  抽象类:被继承体现的是“ is a ” 的关系。抽象类中定义的是盖集成体现的共性功能。

  接口:被实现体现的是“ like a ” 的关系。接口中定义的是该继承体系的扩展功能。

 

 

posted @ 2021-05-20 18:23  李三元  阅读(297)  评论(0)    收藏  举报