• C#功能派的进阶2类型的那些事


    1装箱是一个什么样的过程?

    1.从托管堆中分配好内存。(包括各个字段和两个额外成员)。

    2.值类型的字段复制到新分配好的托管堆的内存。

    3.返回对象的地址。

    2拆箱的过程呢?

    1.从指针中取值。 

    3实践建议

    1.尽量减少(拆)装箱。

             比如可以使用List<System.ValueType(int,float等)>的时候就不要用List<object>。

     比如:调用参数的时候,如果有值类型的重载版本的话,就使用值类型的。能减少拆装箱的次数。

            3. 对于多次需要装拆箱的一个变量可以做一次装拆箱,之后就可以统一调用拆装箱后的变量。

    4. 重写Tostring()和compare等方法,以减少拆装箱的次数,因为他们是基类的方法,调用基类的方法需要转换成引用类型。

    4使用值类型的

    好处:

    1.不在托管堆上分配。在栈中分配,减少堆的压力。

    2. 没有类型对象指针和同步索引块。

    不好:

    1. 不能使用Monitor和lock做多线程的同步。

    5使用值类型的接口来改变值类型的字段,为什么值没有发生变化?

    执行类装换为接口后把值复制了一遍,改变的是新的字段而不是原来的值。

    6 equal是如何判断相等的?

    1 OBJECT中的EQUAL:   return this==object;

    2 判断的是同一性而不是相等性。

    3 值类型的Equal方法使用反射来判断所有字段的相等。性能不高。

       如果想要更好的控制和更高效的性能。可以重载一系列包括equal,==,!=等等方法。(crazy!----:p   )

     5.6值类型与hashcode 

    1重写hashcode的理由:

    1反射慢 

                    2原来的实现方式只是是将字段 XOR 异或 并不总是最优方案。

    3更有掌控力。

    2不要将hashcode持久化,因为hashcode可能会随着CLR版本升级而改变其算法。

    6类型和成员的种类:

      • 常量 const
      • 字段 fields
      • 实例构造器.ctro()
      • 类型构造器
      • 方法methods
      • 操作符重载operator
      • 转换操作符
      • 属性Properties
      • 事件 Events

     7c#中的类似C++的“友元”?

        类型的可见性 public 和 internal ,internal 表示程序集内可以访问,那么程序集外如何可见?

    [assembly:InternalsVisibleTo ("AssemblyB, PublicKeyToken=32ab4ba45e0a69a1")] 

     还有一种方法是使用 StrongNameIdentityPermission

    参考 http://www.cnblogs.com/wdxinren/archive/2004/11/10/62259.html 

    还有这里 http://www.cnblogs.com/oec2003/archive/2010/11/15/1877390.html 

  • 相关阅读:
    sql server 数据定义常用sql
    历史数据处理
    Border不响应MouseDown等点击事件
    wpf 打印A3 & A4 纸张大小的图片
    xml文件读写
    请使用 MakeValid 将该实例转换为有效实例
    接口和抽象类
    索引器&集合
    C#中重写、重载和隐藏的概念
    超图SuperMap iObjects .NET Geometry转geoJSON&WKT&WKB
  • 原文地址:https://www.cnblogs.com/facingwaller/p/csharp_advance_2_how_to_use_type.html
Copyright © 2020-2023  润新知