c#基础零碎记录 [操作系统入门]

编程

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,对于值类型和引用类型的内存分布图如下

 

c#基础零碎记录

以上是 c#基础零碎记录 [操作系统入门] 的全部内容, 来源链接: utcz.com/z/519300.html

回到顶部