标签:art 外部 去掉 不能 垃圾 对象 简写 强制 str
1. if 条件必须是bool类型
2. 声明变量的同时必须初始化,否则不可使用。
3.值类型和引用类型 (内存的存储位置不同) 值类型在栈区,引用类型存储在堆区
4.c#的大部分复杂类型,比如class都是引用类型,分配的内存空间是在堆区。所以在生命周期内,可以被不同的函数访问,CLR精心设计了一个算法来周期性追踪这些引用类型是否还被人引用,没有引用的会被垃圾回收。
5. c#data types和.net data types 比如声明了一个 int 变量,实际上是声明了一个.net struct:System.Int32. 这样这些数据类型就可以支持一些特定方法,比如ToSstring();等
这些值类型实际存储的时候是原始的数据类型,并没有其他的性能开销。
6.c#有15个预定义类型,13个值类型,2个(string和object)引用类型。c#的类型的位数跟平台无关。
(c#的byte type和char type 完全不同的类型,这是为了类型安全;同时byte type默认是unsigned,signedtype叫sbyte)
7 C#7提供了一个新特性叫数字分割符,只是为了可读性。
8. 实数类型(decimal type) 提供一个高精确度的浮点数值类型,主要用于金融计算,这个类型有性能影响。
9.string类型 这是一个引用类型,分配在堆区,当你讲一个string变量赋值给另外一个string变量的时候,同个变量指向的是同一个引用,但是和其他的引用类型不同的是,string是不可改变的,如果你修改其中一个string变量,内存会完全重新分配一个空间出来给修改过的这个string。
10. c#注释可以使用三个斜杠开头,然后以XML格式加tag
11. c#也有一些预处理器指令,但是只作用在编译期
12.c#的class和struct的区别。除了内存分配区域不一样之外,struct不能继承或者派生一个struct。
struct的典型应用是存储一些小型的数据,这样可以提升性能,分配在栈区的数据不需要进行垃圾回收(疑问,那栈区的空间是怎么回收的,而且生命周期是怎么样的)。
(You typically use structs for smaller data types for performance reasons. Storing value types on the stack
avoids garbage collection. Another use case of structs are interop with native code; the layout of the struct
can look the same as native data types.)(引用原文struct片段)
13. class的readonly 修饰,这个字段只能在构造函数初始化。对于const修改的变量,在编译器期间,编译器会寻找所有使用这个const变量,然后进行值替换。而readonly修饰的变量是在运行时才知道值的。
14. 对于c#这些简写的语法糖,不必过多担心是否会影响其性能,CLR在转化中间语言时会做优化。
15. readonly的Properties 的实现,只要把set访问器去掉即可,然后在构造的时候初始化。
16. 看到这里才发现c#的field和property的分别存在。
17. 匿名类型,就是new一个没有具体类的一个对象,直接花括号里面加字段及其对应的字段值,如果两个匿名类型的字段值和数据类型一样,可认为两个对象是一样的,可以相互做赋值操作。匿名类型是以为编译器自动构造了一个类型名,且只有编译器自己知道。
18.c#也要注意functions和methods的区别。总之functions包括的范围更广,比如索引器,访问器,操作符,构造,析构,properties等等,同时也包括methods。
19. methods调用的时候可以使用命名参数,如下图所示.。同时也不必担心性能,编译器会删掉参数名字,然后重新对参数进行排序调用。(c#编译器赛高)
20. c#也可以设置可选参数即c++的默认参数,规则也差不多。
21.C#也可以接受客户端参数,是利用数组来接收参数的。如下图所示
22. c#的构造函数,如果没有手动编写,编译器会自动生成一个,同时将引用类型的fields为null,值类型的为0,布尔类型的为false。
23.对于c#的构造函数被设置为private的时候。有两个应用场景,1是指需要使用里面的static方法,而不需要外部实例化,还有一个是单例模式,如下图所示
24,c#的class的构造函数设置为static,这个构造函数只会被执行一次,无论这个class有没有会实例化,主要用于初始化一个static feilds。运行时对于静态构造函数的执行时间是不确定的,所以里面的代码最好不要有依赖。
25. struct的实现方式和class一样(feild,property,method等),但是如果struct是作为其他引用类型的一部分,struct的地址就在堆区。struct不支持继承。如果代码没有显示创建一个构造函数,编译器会默认创造一个,并且给予字段赋值相关类型的默认值。
struct可以使用new 操作符,也可以不用,直接声明一个变量即可使用。
26. ref out in 修饰符
27.c#的nullable类型,可以让值类型赋值为null值,是利用一个布尔变量来控制的。可空值类型转化成值类型的时候需要进行强制转换才能成功,但是这样可能会引发异常。保险的方式是利用hasvalue如:int x5 = x3.HasValue ? x3.Value : -1;
还有一种转化类型如int x6 = x3 ?? -1;
28. c#同样提供枚举类型,并且是值类型。枚举还提供了比较有意思的用法,使用的时候可以深研究。
29. partial classes(局部类型) ,这个是允许class,struct,method,interface分割在几个文件。只需要在前面加一个partial即可。
30.extension methods。对一个class扩展方法,只要在方法的第一个参数加this关键字。这些扩展方法都是static(待验证).虽然是静态方法,但是调用的时候直接用实例化的对象名直接调用,编译器会做替换。
编译器是怎么知道这个扩展方法的呢,首先是this关键字,后面紧跟着class type,然后定义扩展方法的命名空间必须是开放的。
31.所有的class都继承System.object, struct是间接继承,因为它是先继承了System.valueType,System.valueType继承System.object。这样继承的好处是你可以访问定义在object的一些public方法。
32.c#不支持class多继承,但是只是接口多继承。
33.对于interfaces和abstract classes。abstract class可以有实现。但是interfaces只声明接口,相当于是纯虚类。一个接口类没有构造函数,没有字段(fields).也不能有运算符重载。
34.as和is操作符。as是安全的类型转换,成功返回object的引用,失败返回null。is返回值是true或false。
35.new修饰符,除了构建新对象之外;还可以显示的隐藏基类field和method;还可以用作泛型约束。
36. c#的is操作符 ;as操作符,用于安全显示引用类型转换。
37.c#的数组大小是提前预设好的,可以存储基本类型和引用类型。所有的数组都是使用了Array class,对于值类型和引用类型的内存分布图如下
标签:art 外部 去掉 不能 垃圾 对象 简写 强制 str
原文地址:https://www.cnblogs.com/lingqingyu/p/13432917.html