Fork me on GitHub

C#数据类型知识点

C#数据类型知识点

  1. 浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实际对象)

  2. 深复制:复制一个对象的时候,不仅复制所有非静态类型成员,还要复制所有引用类型成员的实际对象。
    http://www.cnblogs.com/edisonchou/p/4787775.html

  3. string a=“aaa”+"bbb"+"ccc"只在内存分配了一个堆(aaabbbccc)和一个栈(a)。 string a="aaa"; a+="bbb"; a+="ccc";
    该过程会创建多临时变量。 所以尽量使用@或${变量}拼接 ,不要使用“+”来拼接。

  4. 一个公共的静态变量将一直被GC视为一个在使用的根引用。更糟糕的是:当这个对象内部还包含更多的对象引用时,这些对象同样不会被释放。

  5. NET中无论是存储值类型对象的数组还是存储引用类型的数组,数据都会存储在堆上。

  6. Array.ConvertAll()。数组类型转换,不要遍历每个对象依次转换。例:将一个字符串数据转为时间数据。

var strArr = new string[] { "2015-02-03","2015-03-11" }; 
DateTime[] dtArr = Array.ConvertAll(strArr, new Converter<string, DateTime>(p => DateTime.Parse(p)));
  1. 一个泛型参数最多一个主要约束,主要约束可以是一个引用类型、class或者struct。次要约束可以有多个接口。

  2. 对象序列化器 BinaryFormatter 、SoapFormatter、XmlSerializer。Soap是一种引用层网络协议。Web Service就是基于此协议。
    Serializable和NonSerialized特性在XmlSerializer类型对象的操作中完全不起作用。取而代之的是XmlIgnore。

  3. dynamic 是.net4.0的动态类型,在编译时会编译为object类型。是运行时检测类型 所以会绕过IED的错误检测。
    dynamic 不能跨程序集访问,传参:因为匿名类型默认是private 的,所以在B程序集中定义的匿名类型,A程序集是无法直接获取其成员信息的,因而无法输出。使用元组Tuple代替。

            dynamic dy=0;
            dy = dy + 3;//不报错
            object ob = 0;
            ob = ob+3;//报错
  1. 静态方法和非静态方法的区别是什么? 区别就在创建对象的时候,静态方法就一份,而非静态方法每new一个新对象就会把这个实例相关信息在GC Heap上复制一份,同时把new出的新对象放在堆栈上。堆栈指针指的地址是刚刚复制到GC Heap的内存地址。因此在方法调用速度上,静态方法要快一点,因为非静态方法要实例化,分配内存。
    从编程历史上看,早期的结构化编程几乎所有的方法都是静态方法,引入实例化方法是面向对象编程以后的事情了,所以实例化方法不是解决运行效率问题,内存问题。是为了让开发更加模式化,面向对象化。

    从上面的分析就可以得出一个结论:1,静态方法和非静态方法是解决模式的区分。2,如果不考虑继承,多态或如果一个方法和它所在类的对象无关,就应该选择静态方法,比如工具类。  https://www.jianshu.com/p/ca544c926eb2

posted @ 2024-05-10 21:02  Aigu  阅读(26)  评论(0编辑  收藏  举报