C#4

接口特点总结:(没有构造函数所以没有字段)
1.接口是一种规范。为了多态。
2.接口不能被实例化
3.接口中的成员不能加“访问修饰符”,接口中的成员的冯文修饰符为public,不能修改(默认为public)。
4.接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。
5.接口中只能有方法、属性、索引器、事件不能有“字段”。
6.接口一接口之间可以继承,并且可以多继承。
7.实现接口的子类必须实现该接口的全部成员。
8.一个类可以同时继承一个类并且实现多个接口,如果一个子类公式继承了父类A,并且是吸纳了接口IA,那么在语法上A必须写在IA的前面。class MyClass:A,IA{},因为类是单继承的。
9.当一个抽象类是实现接口的时候,如果不想把接口中的成员实现,可以把成员实现为abstract(抽象类也能实现接口,用bastract标记)
10.“现实实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。

抽象类:(有构造函数所以有实例成员包括字段)
1.不能被实例化,需要被继承。多态。
2.子类必须重写父类中的所有抽象成员,除非:子类也是个抽象类。
3.抽象成员在父类中不能有任何实现。
4.抽象类中可以有实例成员。
5.抽象成员的访问修饰符不能是private
6.抽象成员只能写在抽象类中。
7.abstract

定义接口与的语法(interface)
1.接口中只能包含方法、属性、索引器、事件。不能包含字段。
2.接口中的成员不能有任何实现
3.接口中的成员不能写范文修饰符。

使用接口的语法
1.一个类可以实现多个接口
2.实现接口的类,必须把接口中的所有成员都实现。
3.子类实现接口中的成员时候,不能写成员的访问修饰符、参数列表、方法名等。(与方法重写一样)???

抽象类和接口的适用区别?:
1.抽象类适用于同一系类,并且需要继承的成员。
2.接口适用于不同系列的类具有相同的动作(行为、动作、方式)。
3.对于不是相同的系列,但具有相同的行为,这个就考虑适用接口。
4.接口解决了类不能多继承问题。

===============================================================================================================
由于字符串的不可变性,所以无法直接修改字符串中的内容(在字符串的索引器中实现的时候也是只实现了一个制度索引器。)

ToCharArray(string a),把字符串变成一个char数组。new string(char[] a )把char数组转换为字符串。
调用==判断字符串是否相同其实内部也是调用了Equals方法,是==实现了一个运算符重载,内部return了Equals()方法。
================================================================================================================

枚举:用enum代替class关键字,枚举成员用逗号隔开。
1.普通枚举中每个值都是互斥的。
2.枚举中的每个值都有一个对应的数值。
2.1.默认数值是整型int,从0开始依次递增。
2.2.可以手动设置每个枚举对应的整数,后头数字以此为基准依次递增。
3.枚举在编译完城后就已经用对应的数字常量了。

枚举和字符串转换:枚举类型.枚举成员.ToString()是枚举转字符串。(枚举类型)Enum.Parse(typeof(枚举类型),字符串)是把字符串转换为枚举类型。

默认枚举都是使用int来替代的,但是也可以指定具体的数据类型。如说:public enum 枚举类型:具体类型(如byte)这样就限制了枚举中的数字类型只能为byte。

标志枚举:加个特性[Flags]然后给枚举成员赋值为2的次方值,这样枚举变量.ToString(),返回值就是对应的枚举成员而不是数字。
给标志枚举赋值可以通过或|的方式来赋值。用枚举变量&枚举成员==这个枚举成员,来判断有没有包含某个枚举成员。

结构体:用struct代替class修饰结构名。结构体成员用后要用分号。声明结构的时候可以new也可以不new。结构与类的最大区别是:结构式值类型,类是引用类型!!!!结构不能继承,但结构可以实现接口。

类型转换:类型.parse(string n)可以把字符串转换为任意类型。convert.To类型(值)可以把任意类型转换为为任意类型。

值类型:int、char、double、float、long、short、byte、bool、enum、struct、decimal
引用类型:string、数组、类、接口、委托。

参数值传递值类型和引用类型传递的都是栈值:
1.引用类型作为参数传递的时候赋值的不是值(堆值)而是堆地址(对地址存在栈中)即复制的时候是栈值。
2.而值类型本身就是存在栈里头的所以复制的也是栈值
3.也就是说参数传递传递的都是栈值,值类型栈值是其本身,引用类型栈值存的是堆的地址。

参数引用传递值类型和引用类型传递的都是栈地址。

异常:在运行时发生的错误,叫异常。异常一般会导致程序崩溃。。
异常用try{} catch{}finally{}捕获异常并处理如果catch中有return着return在finally执行后在执行。
catch和catch(Excaption)可以捕获所有异常,如果是catch(具体异常)那么只能捕获具体的异常,一个try可以跟多个catholic来捕获不同的异常。

可变参数:返回值类型 方法名(papams 数据类型[] 变量名)
可变参数可以传1个参数,也可以穿多个参数,也可以不传参数。如果不为可变参数传值,则可变参数的数组是一个长度为0的数组,但是不是null。
当一个方法中有多个参数时,并且还包含可变参数时,可变参数只能放在参数列表的最后。
可变参数也可以传一个数组进来。

使用ref标记的时候写方法和用方法的时候都得标记上。由于在这些方法中一开始就有可能使用参数s,所以在参数s传递进来之前必须声明并赋值。

当一个方法同时要返回两个值的时候可以考虑用out关键字标记,和ref一样在写方法和用方法都得标记上。由于out参数在方法中肯定被赋值了(即out参数在方法体中必须赋值才能使用。),所以,传进来之前可以不用赋值。

原文地址:https://www.cnblogs.com/holong2003/p/3265713.html