本章主要讲的是类型的一些基本概念,一切类型都是从System.Object继承下来了,在具体的实现中有CLR内部调用机制来进行优化,这与Python的实现有明显的不同,尤其是在内存分配的处理上,.NET显然更高效。然后说明了不同类型之间是如何转换的,以及命名空间的实现原理,命名空间与程序集之间的关系。最后说明了在运行期,CLR是如何使用线程栈和应用程序堆的,并逐步解释了程序执行过程中栈和堆的变化,以及JIT参与的情况。
All Types are Derived from System.Object
1. 所有的类型都是从System.Object继承下来的,是的,不仅仅是引用类型,值类型System.ValueType也是;
2. System.Object的方法:
[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class Object
{
// Methods
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public Object();
public virtual bool Equals(object obj);
public static bool Equals(object objA, object objB);
private void FieldGetter(string typeName, string fieldName, ref object val);
private void FieldSetter(string typeName, string fieldName, object val);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
protected virtual void Finalize();
private FieldInfo GetFieldInfo(string typeName, string fieldName);
public virtual int GetHashCode();
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public extern Type GetType();
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
internal static extern bool InternalEquals(object objA, object objB);
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
internal static extern int InternalGetHashCode(object obj);
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
protected extern object MemberwiseClone();
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static bool ReferenceEquals(object objA, object objB);
public virtual string ToString();
}
|
3. 看到C++中常见的邪恶关键字extern,在C#中表示什么意思呢?C#中一般用到extern是在Interop情况下,而在这里呢?
这些extern的方法是为了执行效率、安全性或者为了实现简单等方面考虑,通过 本地代码来实现。但与Interop不同的是,不需要定义为 static extern ,也无需通过dll来导出函数来实现。这种CLR的内部调用机制,通过一个 InternalCall 的函数定义。参考:《用WinDbg探索CLR世界 [8] InternalCall 的使用与实现》
Casting Between Types
1. 显式转化与隐式转化;
2. is 与 as操作符,编译时错误CTE与运行时错误RTE。
Namespaces and Assemblies
1. 对CLR来说,没什么命名空间的概念,必须知道类型的完整名字;
2. 命名空间可以在引用时定义别名。
How Things Relate at Runtime
1. 线程栈与应用程序堆
本章小结
本章主要讲的是类型的一些基本概念,一切类型都是从System.Object继承下来了,在具体的实现中有CLR内部调用机制来进行优化,这与Python的实现有明显的不同,尤其是在内存分配的处理上,.NET显然更高效。然后说明了不同类型之间是如何转换的,以及命名空间的实现原理,命名空间与程序集之间的关系。最后说明了在运行期,CLR是如何使用线程栈和应用程序堆的,并逐步解释了程序执行过程中栈和堆的变化,以及JIT参与的情况。