C#基础

1、c#是一种高级编程语言,高级编程语言都具有一个特性:面向对象。

    OO:object-oriented
    OOP:面向对象编程
    OOD:面向对象设计

面向对象:是一种分析问题的方式,指的是编程的方式跟我们生活中思维的方式是一样的。

面向过程:是把一个任务分解成有顺序的几个步骤,然后按步骤一步步去执行,注重方法,没有类和对象的概念。

2、面向对象的两个主要元素:类和对象

什么是类:

——书面定义:是一种数据类型(存储数据)
——生活中的定义:对一堆个体进行提炼和总结出一些共同特征,然后起个名,这个名就是类,具体的个体就是一个对象,先有的对象再有类,类是抽象的提炼和总结。对象是一个个体。

3、如何表示类的特征:字段(特性、特征)、方法(行为)

4、如何创建类:先分析这个系统都要处理哪些对象,然后分析这些对象的特征,然后在创建类。

类 对象=new 类();

5、创建类:

    ——构造函数:访问修饰符 类名(){},如果不手动添加构造函数,那么会自动生成一个无参的构造函数。

 ——如果手写了构造函数,会把默认的无参的构造函数覆盖掉。
 ——声明对象就是把数据放到这个对象里边。

6、程序集和命名空间

 程序集(物理):就是平常所说的DLL,exe文件,一些相关的类的物理存储文件(介质)。
 命名空间(逻辑上的):在逻辑上分成一些单元,每个单元起个名字,这个名字就是命名空间的名字,是类的逻辑组织方式
 访问类:
        1. 在同一程序集下边
        (1)通过完全限定名:命名空间.类名
        (2)通过using引用命名空间
        2. 不在同一程序集下边,要首先引用包含该类的程序集

7、变量作用域

 类的成员变量可以不用初始化就可以使用,因为他们都会有一个默认值。int默认值为0,
 string或者引用类型默认值为null,
 bool默认值为false
 局部变量必须初始化后才能使用。

8、面向对象三大特性:封装、继承、多态

——封装:对象就是一堆数据的封装

 例子:(1)属性就是字段的封装,属性的作用就是保证数据的合法性
      (2)方法是对代码块的封装
      (3)程序集是对类的封装

——继承:不劳而获,指的是类之间的关系

(1)即是抽象的继承更抽象的

(2)继承的合理性:a继承b,如果a是b成立,就说明继承是合理的
 a叫做子类或者派生类,b一般叫做父类或者基类,b一定比a要更抽象

(3)作用:代码重用;多态

(4)所有的类都回继承object类,一个子类只能继承一个父类。

 两个特征:传递性、单跟性

(5)里氏替换原则(LSP):一个子类对象可以赋给父类(父类的父类),只针对的有继承关系的类(父子类)。

(6)构造函数是不能继承的。

——多态:

(1)is:判断对象是否是某个类型,如果是返回true,否则返回false。
(2)类型转换:隐式转换、显示转换
——隐式转换:直接把子类赋给父类(继承链的上边的类)
——显式转换:继承链上边的类转换成下边的类。

  —下边的类 :变量=(下边的类)对象
  as转换:转换失败会返回null,尽量用as 进行显示转换,一般as转换完之后要判断是否为null

(3)多态的实现——1前提必须继承

A、虚方法:关键字:virtual,override重写父类的方法。

B、多态本质:表面上执行的父类的方法,实际上执行的是子类的方法,用抽象来封装变化,减少if else,switch等代码

C、类型信息表:类名、方法表、父类名(指针,指向父类的类型信息表)

每个类型都有自己的类型信息表

方法表:按顺序进行存储的,父类的虚方法,自己的虚方法,自己的构造函数,类的静态方法,自己的实例方法,存的只是方法名,

方法槽表:方法的具体实现。

注意:(1)如果调用的是非虚方法,最终调用声明对象类型的方法表,如果调用的是虚方法,那么调用对象的类型指针对应的类型信息表里的方法表。

当调用非虚方法时会调用声明类型的方法表(person方法表)
当调用虚方法时调用的是实例对象内部类型指针指向的类型的方法表

(2)多态本质:实际上调用的方法表不一样。

   引用类型的变量分布在栈和(gc)堆上,堆上存的是具体的值,栈上寸的是堆的一个地址。

值类型变量存在声明它的地方。(有可能存在栈上,也有可能存在堆上)。

栈存的大小固定数据。

线程:一个代码的执行流,一个线程会对应一个方法,方法执行完之后,线程的生命周期也就结束了。

——2、抽象类

(1)class前加abstract关键字,就是抽象类

(2)父类里边声明抽象方法,子类进行override进行实现。

(3)子类必须实现父类的抽象成员。

(4)抽象成员光说不做。

(5)不能进行实例化对象,只能用来被继承。

多态的本质

——3、接口

1、以大写 “I开头+动词+able” 来命名,顾名思义:具有什么行为的能力

2、接口成员不能加访问修饰符,默认访问修饰符:public

3、接口成员(方法、属性、索引器)编译之后都是方法。

4、方法是不能实现的。

5、方法经过编译之后本质上是一个抽象方法(虚方法)。

6、定义了一组没有实现的方法。

 7、就是用来被实现的(光说不做)。

8、应该说类实现了某个接口,不能说继承了某个接口,但本质上还是继承。

9、只要类实现了某个接口,就必须实现接口里边全部的方法。

10、接口就相当于一个规范,实现了接口就相当于你要遵守这个规范,你就具有了某种能力。

11、一个类即继承父类又实现接口,父类要写在前边,接口要写在后边

12、一个类只能继承一个父类,但是可以实现多个接口。

13、实现接口的合理性:类继承其实是 is a的关系,接口 can do 能实现这个行为吗?

14、使用场景

    //案例1、:麻雀、鸵鸟、企鹅、鹦鹉(可以抽象出一个父类来,类之间有关系的)

    //共同点:翅膀(属性)、颜色(属性)、叫(方法)
    //不同点:会飞的(麻雀、鹦鹉),不会飞(鸵鸟、企鹅)


    //案例2、鱼、船(类之间没有关系,但是具有某些共同的行为)
    //共同点:都可以在水里“行走”


15、继承是单根性,接口可以实现多个接口,解决了单继承的问题。


16、接口和抽象类有什么区别:
(1)、抽象类适用于同一系列的类(也就是有继承关系的),并且有需要继承的成员。

(2)、接口适用于不同系列的类但具有相同的动作(行为)。

(3)、接口还解决了类单继承的问题。

9、.NET的编译过程

 源代码——第一次编译之后生成——IL中间语言(dll、exe)——第二次编码——机器码(二进制代码(cpu))

CLR(共同语言运行时)来运行我们的.NET程序(IL),把IL语言编译成机器语言(汇编语言-黑客)(第二次编译),cpu直接执行汇编语言(mov )

CLR将内存分成:线程栈、堆(GC堆,大对象堆,加载堆)

  GC堆(小对象堆):存储小于8500000字节的对象。GC:垃圾回收器,如果对象没有了引用(Person p=new Person(); p=null; ),GC就会回收对象。

大对象堆:存储大于8500000字节的对象。

10、访问修饰符

 public:任何地方
 private:当前类内部
 internal:当前程序集内
 protected:当前类以及子类内部
 protected internal:当前程序集内 或者当前类以及子类内部。

类的默认修饰符是:internal
类成员默认访问修饰符是:private
子类的访问级别不能高于父类的访问级别。

11、值传递和引用传递
值传递:copy了一份栈内存储的值给形参。

声明一个引用类型的变量,首先在栈上开辟一个内存

引用传递:传递的是栈的地址, ref、out

 out:意义在于使方法拥有多个返回值。传递之前可以不用赋值,必须在方法内部必须进行赋值和初始化。
 ref:首先传递之前必须得赋值,主要是为了修改。

值传递和引用传递

posted on 2017-07-26 14:30  Grant-fu  阅读(94)  评论(0编辑  收藏  举报

导航