一起谈.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给我们撰写高安全性代码带来一点思考。

目录
相关文章
|
7天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
7天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
7天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
7天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
7天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
6月前
|
Java
java判断Object对象是否为空demo
java判断Object对象是否为空demo
|
25天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`'1.2,2,3,4,5'`)转换为对象数组。通过使用`split(',')`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
2月前
|
存储 设计模式 Python
Python中的类(Class)和对象(Object)
Python中的类(Class)和对象(Object)
32 0
|
2月前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别
|
6月前
判断Object对象是否为空
判断Object对象是否为空