zoukankan      html  css  js  c++  java
  • 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,对于值类型和引用类型的内存分布图如下

    38.对于lambda 表达式,如果访问了外部的变量,这个被称作闭包,闭包的实现原理是编译器创建了一个class,这个class的构造函数用来传递访问的外部变量,并且class内部也会存储lambda方法。注意的是访问的外部变量是引用,同时多线程调用可能会出现竞态。

    39.string类型,在重复的对string进行修改时直接使用string是非常的低效的,因为string是一个不可改变的数据类型,在你修改的时候其实是创建了一个新的string,然后在进行内容的拷贝。

       string在创建的时候只会分配足够当前字符串需要的内存,当需要修改的时候重新分配加拷贝,然后再重新引用新的内存地址。

       StringBuilder 类似动态数组,可以提前预留内存,有Length和Capacity两个字段。

       对于string里面的格式输入如前置 “$” 符号后面{变量名}这样的格式,其实是编译器做了处理,转化成使用string.Format这个函数调用了。

      既然是编译器做了转换,那么可以使用如下用法

     40. c#的Collections中Dictionaries中key type,作为key的类型需要实现IEquatable和GetHashCode。对于int作为key值需要继续深究一下。

  • 相关阅读:
    软件架构实现
    UVa644
    如何理解Hibernate中的HibernateSessionFactory类
    在pcDuino上使用蓝牙耳机玩转音乐
    Java Web----Java Web的数据库操作(三)
    Pylons Controller里面Session.commit()总是出现rollback
    ORACLE的SQL JOIN方式小结
    关于数据库学习进阶的一点体悟
    IO is frozen on database xxx, No user action is required
    ORACLE等待事件:enq: TX
  • 原文地址:https://www.cnblogs.com/lingqingyu/p/13432917.html
Copyright © 2011-2022 走看看