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

目录
相关文章
|
4天前
|
人工智能 前端开发 Devops
.NET技术在现代开发中的作用:.NET技术的核心价值、在现代应用开发中的实际应用、以及面临的挑战与未来趋势。
.NET技术是软件开发领域的核心力量,本文从其核心价值、实际应用及未来挑战三方面进行探讨。它支持多种语言,提供强大的开发工具和丰富的类库,并具备跨平台能力。在现代应用开发中,.NET广泛应用于企业级系统、Web应用、移动应用、云服务和游戏开发等领域。面对性能优化、容器化、AI集成等挑战,.NET持续创新以适应不断发展变化的技术环境。
15 4
|
4天前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
13 4
|
4天前
|
人工智能 物联网 开发者
.NET技术在现代软件开发中的应用愈发广泛和深入
.NET技术是软件开发的关键支柱,本文分为三部分探讨其创新应用:最新进展如.NET 5/6统一平台、性能提升、跨平台支持增强、云集成优化及开源社区贡献;应用场景涵盖微服务架构、物联网、AI/机器学习、游戏及移动应用开发;未来发展潜力在于持续性能优化、云原生支持、新兴技术集成、生态扩张及教育培训加强。.NET正以其强大适应性和创新潜力引领软件开发的新方向。
14 3
|
4天前
|
人工智能 开发框架 .NET
如何掌握.NET技术,引领开发前沿:.NET技术的核心能力、在现代开发中的应用实践、以及如何通过.NET技术实现持续创新。
.NET技术已成为软件开发不可或缺的部分,本文分三部分探讨:核心能力如多语言支持、统一运行时环境、丰富的类库及跨平台能力;现代开发实践包括企业级应用、Web与移动开发、云服务及游戏开发;并通过性能优化、容器化、AI集成等方面实现持续创新,使开发者站在技术前沿。
14 3
|
4天前
|
人工智能 前端开发 开发工具
.NET技术的开发潜力是巨大的,其核心优势和广泛应用不断推动着软件开发的进步
.NET技术自推出后已成为软件开发的关键力量。本文分三部分探讨其开发潜力:核心优势如统一平台、强大工具与跨平台能力;现代应用中的创新,包括企业级与Web应用、移动开发、云服务及游戏制作;以及面对的挑战与未来机遇,如性能优化、容器化支持、AI集成等。.NET的持续发展正塑造着软件行业的未来。
18 1
|
4天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
10 0
|
4天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
8天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
36 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
132 0
|
3月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
57 0