数据格式
uint ulong ushort 特点:正数
数字后面需要带后缀 ulong=100UL
逐字指定字符串,即两个双引号之间的所有字符都包含在字符串中,包括行末字符和需要转义的字符。
写路径时经常用到
stringmyString ="C:\\Temp\\MyDir";
stringmyString2 =@"C:\Temp\MyDir";
namespace相当于java里面的package
using相当于java里面的importing
goto语句
用法: goto <label>
checkedunchecked
用于类型转换时的溢出检查
可以在设置里面要求全文自动做溢出检查
enum枚举类型
struct类型
二维数组
int[ , ]不同于java,c#中间用,表示
string padleftpadright方法:
参数数组:
ref关键词修饰
作用:通过引用来传递参数,使传过来的参数在函数内被修改后,反映到原参数的变化上
在调用函数时必须使用ref关键词修饰
const关键词修饰
用于修饰常量,初始化之后不可改变
out关键词修饰
指定一个参数为输出参数注意:这个参数在函数运行时会被初始化原有值会丢失
在调用函数时必须使用out关键词修饰
main函数可以返回int一般用于错误提示
c# struct在java中不存在:
你可以把Java的类理解成C里面的结构体再加上带一个this参数的方法指针。其实Java的类就是那么回事。在内存里走的就是struct+带this的方法指针.
delegate 委托
【注:EventHandler是一个声明委托的微软C#的命名标准上图中未使用需要改进】
委托参考:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1703368.html
sealed 密封的不能被继承
接口及基类写法
如果有基类,则必须紧跟在”:"之后,然后再写接口
gettype方法 获取参数类型
typeof方法 把类名转换为system.type对象
联合使用可以判断一个参数是不是某类的一个实例
virtual 修饰方法 虚拟的
Virtual方法(虚方法)
virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
如果特意要隐藏继承于基类的成员定义 使用new修饰就行
partial 修饰
作用:把一个类的内容分开写在不同的地方(部分类),或者方法在这里不实现,在其他地方实现(部分方法),这样的方法必须是私有的,且没有返回值
浅复制,深复制:
关于对象克隆的所设计到知识点
浅拷贝:是指将对象中的所有字段逐字复杂到一个新对象
对值类型字段只是简单的拷贝一个副本到目标对象,改变目标对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本
对引用型字段则是指拷贝他的一个引用到目标对象。改变目标对象中引用类型字段的值它将反映到原始对象中,因为拷贝的是指向堆是上的一个地址
深拷贝:深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新对象中这个字段的时候是不会影响到原始对象中对应字段的内容。
浅复制: 实现浅复制需要使用Object类的MemberwiseClone方法用于创建一个浅表副本
深复制: 须实现 ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable]特性
运算符重载
operator + 运算符
注意:必须是静态方法 赋值运算符不能重载
23.explicit 和 implicit 的含义?
答:
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换
explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)
implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)
隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用implicit 运算符。不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用explicit 运算符,以便在编译期就能警告客户调用端
可空类型
基本类型+null
写法:int?nullableInt;
协变和抗变
我们知道 父类对象时可以指向子类引用的
比如: class Animal{} class Cow : Animal{}
可以写成Animal a = new Cow();
但是这不适用于泛型类。。
比如我写了一个泛型类Farm<T>(泛型接口也行)
那么就不能写成Farm<Animal> f = new Farm<Cow>();了
如果想实现这种多态 定义泛型类的时候 写成Farm<out T> 这叫协变。。
抗变就比较神奇了
按照上面例子 可以写成这样的形式
Farm<Cow> f = new Farm<Animal>();
想实现这样的效果 声明泛型类或泛型接口的时候 用 Farm<in T>就行了。。