C# 终极基类Object介绍
一、简介
Object这个类型,相信everyone都不陌生,这个是CLR定义的最基础的类型,俗称"上帝类"。CLR(运行时)要求所有类型,不管是系统定义的类型还是自定义的类型,都必须从Object派生,所以以下代码从本质上是一样的,代码如下:
/// <summary>
/// 隐式派生自Object
/// </summary>
class Worker
{ } /// <summary>
/// 显式派生自Object
/// </summary>
class Worker : System.Object
{ }
因为CLR会要求所有的类型都派生自Object,所以自定义类就算没有显示继承Object类,CLR还是会让自定义类默认继承Object类,由于所有的类型都从System.Object类型派生,所以每个类型的每个对象(实例)都会有一组最基本的方法。
二、Object公开的实例方法
以下一派生自Object之后自带的公开的实例方法:

上面4个方法其中Equals、ToString、GetHashCode这三个方法是虚方法,可重写GetType是外部方法.下面来一一介绍:
1、Equals方法

如果两个对象具有相同的值,就返回true,详情请参考C# 对象相等性判断和同一性判断
2、GetHashCode方法
返回对象的值的哈希值,详情请参考C# 对象哈希码
3、ToString方法
默认返回类型的完整名称(this.GetType().FullName)。例如,核心类型(如Boolean和Int32)类型重写该方法来返回他们的值的字符串表示,另外处于调试的目地而重写该方法.调用后获得一个字符串,显示对象各字段的值.代码如下:
static void Main(string[] args)
{
var t = new Test
{
Name = "张三",
Desc = "张三的描述",
Age =
};
Console.WriteLine(t.ToString());
Console.ReadKey();
}
public class Test
{
public string Name { get; set; } public string Desc { get; set; } public int Age { get; set; } public override string ToString()
{
var type = this.GetType();
PropertyInfo[] infos = type.GetProperties();
StringBuilder sb = new StringBuilder();
foreach (var property in infos)
{
if (property.GetIndexParameters().Length == )
{
string propertyName = property.Name;
string propertyType = property.PropertyType.Name;
var propertValue = property.GetValue(this);
if (property.GetIndexParameters().Length == )
sb.AppendFormat("属性名:{0},属性类型:{1},属性值:{2}", propertyName, propertyType, propertValue);
else
sb.AppendFormat("当前属性为索引属性,属性名为:{0},属性值:{1}", propertyName, propertyType);
sb.AppendLine();
} }
return sb.ToString();
}
}

4、GetType方法
返回从一个Type派生的一个类型的实例,指出调用GetType的那个对象是什么类型,返回的Type对象和反射类配合,获取与对象的类型有关的元数据信息.GetType是非虚方法,目的是防止类重写该方法,隐瞒起类型,破坏类型的安全性,代码如下:
public class Program
{
static void Main(string[] args)
{
var p = new Person
{
Name = "张三",
Age =
};
var t = p.GetType();
var properties = t.GetProperties();
foreach (var item in properties)
{
var propertyName = item.Name;
var propertyVal = item.GetValue(p);
Console.WriteLine("属性名:{0},属性值:{1}", propertyName, propertyVal);
}
Console.ReadKey();
}
}
public class Person
{
public string Name { get; set; } public int Age { get; set; }
}

三、Object受保护的方法
1、MemberwiseClone方法
这个非虚方法创建类型的新实例,并将新对象的实例字段设于this对象的实例字段完全一致,返回对新实例的引用,代码如下:
public class Program
{
static void Main(string[] args)
{
var p = new Person
{
Name = "张三",
Age =
};
var t=p.Clone();
Console.WriteLine("this is Original object named p,the value of property named Name is {0},this value of property named Age is {1}", p.Name, p.Age);
Console.WriteLine("this is clone object named t,the value of property named Name is {0},this value of property named Age is {1}", t.Name, t.Age);
Console.ReadKey();
}
}
public class Person
{
public string Name { get; set; } public int Age { get; set; } public Person Clone()
{
return (Person)MemberwiseClone();
}
}

2、Finalize方法
在垃圾回收器判断对象应该作为垃圾被回收之后,在对象的内存实际被回收之前,会调用这个虚方法.需要在回收内存前执行清理工作的类型应该重写该方法.
C# 终极基类Object介绍的更多相关文章
- [Unity2D]脚本基类MonoBehaviour介绍
Unity中的脚本都是继承自MonoBehaviour. MonoBehaviour 表示一个单一的行为.Unity中用户对游戏对象的操作被分割成若干个单一行为.每个单一行为都作为一个MonoBeha ...
- Python+Selenium框架设计之框架内封装基类和实现POM
原文地址https://blog.csdn.net/u011541946/article/details/70269965 作者:Anthony_tester 来源:CSDN 博客地址https ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
- C# System.Object基类
System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Objec ...
- .NET基础 (11)类型的基类System.Object
类型的基类System.Object1 是否存在不继承自System.Object类型的类2 在System.Object中定义的三个比较方法有何异同3 如何重写GetHashCode方法 类型的基类 ...
- 浅析Object基类提供的Equals方法
当我们去查看object.cs源代码文件的时候,会发现object基类提供了三种判断相等性的方法.弄清楚每种方法存在的原因,也就是具体解决了什么问题,对我们理解.net判断对象相等性的逻辑很有帮助,下 ...
随机推荐
- IntelliJ IDEA 2017版 SpringBoot的web项目补充
一.注解 @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置. @Configuration:这是一个配置Sprin ...
- Deployment is out of date due to changes in the underlying project contents. Deployment is out of date due to changes in the underlying project contents. You'll need to manually 'Redeploy' the projec
原因1:导入的jar包路径不对,造成第一个错误, 原因2:设置右键工程->属性->myeclipse->web->deployment选use workbenk defaul ...
- AlertDialog设计对话框
MainActivity.java public class MainActivity extends Activity { TextView show; Str ...
- where /group by/ having/ order by/
1.order by 是 按字段 进行排序.. 字段后面可跟 desc 降序..asc 升序..默认为升序2.group by 是进行分组 查询3.having 和 where 都属于 条件过滤 区别 ...
- Python Sleep休眠函数
#!/usr/bin/env python import os import time def fun(name): write_name="command %s failed!\n&quo ...
- 基于zookeeper的主备切换方法
继承CZookeeperHelper即可快速实现主备切换: https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zooke ...
- Java 容器 LinkedHashMap源码分析1
同 HashMap 一样,LinkedHashMap 也是对 Map 接口的一种基于链表和哈希表的实现.实际上, LinkedHashMap 是 HashMap 的子类,其扩展了 HashMap 增加 ...
- Python学习-29.Python中列表的一些操作
in关键字: 注意这个是关键字,用来判断元素是否在集合中存在. list = ['a','b','c'] print('a' in list) print('f' in list) 将依次输出 Tru ...
- IllegalArgumentException: requirement failed: Corrupt index found
今天突然接到客户反映线上服务器发送消息异常,登录服务器查看是kafka服务出现了问题,想重启一下服务,结果重启出现一下报错 [2017-06-30 19:29:13,708] FATAL Fatal ...
- SQL Server 统计信息(Statistics)-概念,原理,应用,维护
前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述 ...