一起谈.NET技术,.NET Framework源码研究系列之---万法归宗Object

简介:   经过前面三篇关于.NET Framework源码研究系列的随笔,相信大家都发现其实.NET Framework的实现其实并不复杂,也许跟我们自己做的项目开发差不多。本人也是这样的看法。不过,经过仔细深入的研究,我们还是会发现一下平时很难注意到的东西,而这些东西对我们完善思路,开阔眼界,锻炼良好的编码素质有着很大的意义.  我们知道.NET中所有的类型(包括:引用类型,值类型)都从Object类派生过来,由此可以说Object是所有类型的根本。

  经过前面三篇关于.NET Framework源码研究系列的随笔,相信大家都发现其实.NET Framework的实现其实并不复杂,也许跟我们自己做的项目开发差不多。本人也是这样的看法。不过,经过仔细深入的研究,我们还是会发现一下平时很难注意到的东西,而这些东西对我们完善思路,开阔眼界,锻炼良好的编码素质有着很大的意义.

  我们知道.NET中所有的类型(包括:引用类型,值类型)都从Object类派生过来,由此可以说Object是所有类型的根本。那么今天我们就研究.NET(C#)中一切元素的根本---System.Object。

  Object类在.NET源码中的实现很简单,一共不过100行左右的代码,这也是我们有精力可以仔细研究它的每一行代码。先看它的定义.

 
 
1  [Serializable()]
2  [ClassInterface(ClassInterfaceType.AutoDual)]
3  [System.Runtime.InteropServices.ComVisible(true)]
4   public class Object

  由定义来看,Object好像是一个普通的类(莫非Object也从Object派生而来?! ^_^ )。Serializable标签说明了Object可以做序列化反序列化操作。

  ClassInterface(ClassInterfaceType.AutoDual),System.Runtime.InteropServices.ComVisible(true)是.NET为了支持COM特别设计的。除非你要手动包装COM,否则对于绝大部分时间都是用托管代码而言的人没什么意义。

 
 
1  [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
2   public Object(){ }
3  [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
4  ~Object() {}

  从上面的代码看到Object只有一个空方法体的构造函数,这就是宇宙起源一样,刚开始什么都没有。此处要特别说明的是ReliabilityContract标签。ReliabilityContract定义某些代码的作者和依赖于这些代码的开发人员之间的可协靠性定。这是官方的定义,听起来有些玄乎。ReliabilityContract有两个属性,分别是两个枚举:Cer和ConsistencyGuarantee.Cer指在受约束的执行区域内调用时指定方法的行为;ConsistencyGuarantee指可靠性协定。看MSDN对这两个枚举的说明后,我们发现 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]为Object提供了安全性保证,就是说我们在调用Object构造函数时不管有没有遇到异常情况,总会获知执行结果。

  另外,Object显式定义了析构函数(又是一个不推荐的做法,好像微软很喜欢做的不推荐我们做@_@||),让我们能够手动释放对象占用的资源而不需要等到GC自动释放。

  要特别说明的是,这里有个我们很少遇到的一个概念:CER,即受约束的执行区域,是创作可靠托管代码的机制的一部分。CER 定义一个区域,在该区域中公共语言运行库 (CLR) 会受到约束,不能引发可使区域中的代码无法完全执行的带外异常。在该区域中,用户代码受到约束,不能执行会导致引发带外异常的代码。

  看完构造函数后我们看下Object中最常用的三个方法的实现,代码如下:  

 
 
public virtual String ToString(){
return GetType().ToString();
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
public virtual bool Equals(Object obj){
return InternalEquals(this, obj);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal static extern bool InternalEquals(Object objA, Object objB);
public virtual int GetHashCode(){
return InternalGetHashCode(this);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
internal static extern int InternalGetHashCode(Object obj);

  感觉有的悲剧,因为这三个方法什么都没做,直接调用了CLR的内部方法,看来Object也是个马甲:( 。微软官方号称Object类是所有类的基类在此恐怕要打个问号。我猜想此Object非彼Object。说不定CLR中也有一个Object。

  如果说上面三个方法有点让人无语,那么下面的代码就更让人困惑了。

 
 
private void FieldSetter(String typeName, String fieldName, Object val){
  FieldInfo fldInfo = GetFieldInfo(typeName, fieldName);
   if (fldInfo.IsInitOnly)
     throw new FieldAccessException(Environment.
      GetResourceString("FieldAccess_InitOnly"));
  System.Runtime.Remoting.Messaging.Message.CoerceArg(val,
    fldInfo.FieldType);
  fldInfo.SetValue(this, val);
}
private void FieldGetter(String typeName, String fieldName, ref Object val){
  FieldInfo fldInfo = GetFieldInfo(typeName, fieldName);
  val = fldInfo.GetValue(this);
}
private FieldInfo GetFieldInfo(String typeName, String fieldName){
  Type t = GetType();
   while ( null != t){
    if (t.FullName.Equals(typeName)){
      break;
    }
    t = t.BaseType;
  }
   if ( null == t){
     throw new RemotingException(String.Format(CultureInfo.CurrentCulture,
    Environment.GetResourceString("Remoting_BadType"),typeName));
  }
  FieldInfo fldInfo = t.GetField(fieldName, BindingFlags.Public
    |BindingFlags.Instance |BindingFlags.IgnoreCase);
   if ( null == fldInfo){
     throw new RemotingException(String.Format(CultureInfo.CurrentCulture,
    Environment.GetResourceString("Remoting_BadField"),
      fieldName, typeName));
  }
   return fldInfo;
}    

  上面一段代码似乎读取或设置一个字段的值(我们也是这样的做法)。问题时,我根本没有找到Object中用到这几个方法的地方,private又决定了扩展类也不可能访问。那么这三个方法到底有什么用,恐怕只有微软自己知道了。

  小结

  经过上面的分析,我们发现Object实现其实很简单,几乎没有内容。但Object中出现的CER给我们撰写高安全性代码带来一点思考。

目录
相关文章
|
15天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
15天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
2月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
46 3
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
44 3
|
2月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
40 3
|
21天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
145 4
|
3月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
138 20
|
5月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
4月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
29 0