C#基础总结

面向对象

对象:特指看得到 摸得着的 具体实体。

:类是模子,确定对象将会拥有的特征(属性)和行为(方法)。

类是对象的模型,类是抽象的概念,仅仅是模板。类不占内存,对象才占内存。

对象是类的实例化,类是对象的高级抽象。

属性:就是对象的特征。

属性值:就是描述这个特征的值

方法:就是对象的行为

类的定义:

[访问修饰符]class 类名

{

   成员

…..

}

类中可以包含变量的定义,也可以包含方法的定义。

类中的成员:(默认private,是私有的)字段  属性 方法。

字段:用public private修饰问题

属性:是为了保护与之相对应的字段的。保证对字段的读取和赋值符合要求。属性可分为读写、只读、只写。允许外部访问的变量一定要声明为属性。通过属性可以给私有字段赋值。

访问修饰符:

Private:私有成员,在类的内部才可以访问。

Protected:保护成员,该类内部和继承类中可以访问。

Public:公共成隐患,完全公开,没有访问限制。

Internal:当前程序集内可以访问。

访问修饰符是private,那么这个字段就是私有的,外边不能直接访问。可以通过属性 在外面或者其他地方进行访问。

**属性和public字段的区别是什么?调用set方法为一个属性值,然后用个体方法读取出来的值一定是set进去的值吗?
属性可以对设值、取值的过程进行非法控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值。极端的例子:Public Age{get{return 100;}set{}}。用reflector反编译可以看出,属性内部本质上就是set_***、get_***方法。

类的实例化:

使用关键字new(在随机数、数组中都用了new)

语法:

类 实例名=new 类()

类的成员访问:

实例名.属性   实例名.方法名()

字段、方法、属性都可以叫做类的成员Member,它们都需要定义访问级别。访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中“封装”的目的。

**在donate中类(class)与结构(struct)的异同:

Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。Int32、Boolean等都属于结构体。

类与成员的修饰符:

类:public internal abstract sealed static

成员(方法):public、private、protected、internal;

protected internal;abstract、virtual、new、override;static

Internal 用于当前程序集;new 隐藏的

类型转换

使用 is和as。

Type A Is type B  仅判断

Type A as Type B 先判断 再转换

is子类可以隐式的转换成父类:

as转换:as也是转换, 但是 如果转换不了的 不报异常 返回来的是null。

is转换 返回的是bool值 true就是能转换  false就是不能转换;使用is比较保险。

 

 

继承:

Public class 子类(派生类):父类(基类)。

在C#中,所有的类都直接或间接的继承了object类。当我们定义一个类的时候,如果没有写:继承一个类,那么这个类就继承了object类。

显示调用父类的构造函数:

实例化子类时调用了父类的构造方法(子类会调用父类默认无参的)。

利用构造方法设置公共属性,也就是说若父类的构造方法有参数,显示调用父类的构造方法,关键字:base。

子类中如果有有参数的构造函数 会默认的调用父类中的无参数的构造函数。若调用有参的,需要使用set---this.调用。这与上面的base调用是不一样的。

 

多态:

抽象方法与抽象类:

抽象类与抽象方法由abstract修饰。Abstract的使用注意:

抽象方法没有方法体、抽象方法必须在抽象类中(抽象成员只能存在与抽象类中)、抽象类可以有非抽象成员、抽象类的派生类必须实现抽象方法体、抽象类只能做基类,无法实例化(父类是基类,子类继承了这个类,必须把抽象类中的抽象方法重写。

接口:

定义:interface关键字 接口中可以有属性、方法(未实现)。接口的名称通常以“I”开头,如IList。

如果一个类既继承了类,又实现了接口,那么类必须写在前面。一个类只能继承一个父类,但可以实现多个接口。接口就是用来实现的。完全抽象的一种约定。

语法:

[访问修饰符]interface接口名

{

   接口成员定义

}

Eg:Interface IFliy

{

     Void IFly

}

接口只用于方法、属性、索引和事件的声明。

C#中的类和接口有什么异同?

不同点:

不能直接实例化接口;接口不包含方法的实现;接口可以多继承,类只能单继承;类定义可在不同的源文件之间进行拆分

相同点:

接口、类和结构都可以从多个接口继承;接口类似于抽象基类,继承接口的任何非抽象类型都必须实现接口的所有成员;接口和类都可以包含事件、索引器、方法和属性。

**C#支持多重继承吗?

类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。类是爹,接口是能力,能有多个能力,但不能有多个爹。

建立多态的方式:

A、用父类实现多态

B、用抽象类实现多态

C、用接口实现多态

 


构造函数

构造函数:是用来创建对象的特殊方法,方法名和类名一样,没有返回值,也不需要void。利用构造函数给里面的字段赋值,构造方法用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数可以有参数,new对象的时候传递函数参数即可。

 

构造函数可以重载,也就是有多个参数不同的构造函数。

使用构造函数能解决:

1、在赋初值时,重复的书写对象名。

2、假如我们有一个属性,不允许用户随意改动,我们一般把这个属性定义为只读类型的属性。那么这个只读类型的属性就不能再在实例化后对他赋值了,这时我们可以通过构造方法来进行初始化。


结构体和类的区别

类当中默认的有一个无参的构造函数。写一个类,如果没有写任何的构造函数,那么这个类有一个默认的无参构造函数。如果自己定义了构造函数,就有了有参的构造函数,不再有默认的那个无参的构造函数了。如果想要使用那个默认的无参的构造函数,还需要自己重新定义。类中写构造函数参数列表中参数个数可以不确定。

结构体:在结构中默认的也有一个无参的构造函数。当在结构中写一个有参的构造函数 默认的无参的构造函数还有 没被干掉。在结构中写构造函数 要把所有的字段都要完全赋值。


堆和栈的区别

栈是编译期间就分配好的内存空间,因此自己的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。

 


值类型和引用类型的区别

1、将一个值类型变量赋值给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不赋值对象本身。

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

3、值类型不可能包含null值。

4、每种值类型均有一个隐士的默认构造函数来初始化该类型的默认值。

.net中哪些是值类型,哪些是引用类型

感谢您的浏览,希望对您有所帮助,欢迎在评论区留言!

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值