Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 终极基类Object介绍

C# 终极基类Object介绍

作者头像
郑小超.
发布于 2018-01-26 07:59:31
发布于 2018-01-26 07:59:31
1.2K00
代码可运行
举报
文章被收录于专栏:GreenLeavesGreenLeaves
运行总次数:0
代码可运行

一、简介

Object这个类型,相信everyone都不陌生,这个是CLR定义的最基础的类型,俗称"上帝类"。CLR(运行时)要求所有类型,不管是系统定义的类型还是自定义的类型,都必须从Object派生,所以以下代码从本质上是一样的,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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)类型重写该方法来返回他们的值的字符串表示,另外处于调试的目地而重写该方法.调用后获得一个字符串,显示对象各字段的值.代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void Main(string[] args)
        {
            var t = new Test
            {
                Name = "张三",
                Desc = "张三的描述",
                Age = 23
            };
            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 == 0)
                {
                    string propertyName = property.Name;
                    string propertyType = property.PropertyType.Name;
                    var propertValue = property.GetValue(this);
                    if (property.GetIndexParameters().Length == 0)
                        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是非虚方法,目的是防止类重写该方法,隐瞒起类型,破坏类型的安全性,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class Program
    {
        static void Main(string[] args)
        {
            var p = new Person
            {
                Name = "张三",
                Age = 23
            };
            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对象的实例字段完全一致,返回对新实例的引用,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public class Program
    {
        static void Main(string[] args)
        {
            var p = new Person
            {
                Name = "张三",
                Age = 11
            };
            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方法

在垃圾回收器判断对象应该作为垃圾被回收之后,在对象的内存实际被回收之前,会调用这个虚方法.需要在回收内存前执行清理工作的类型应该重写该方法.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# 学习笔记(4)—— C# 中的面向对象编程
封装指的是把类内部的数据隐藏起来,不让对象实例直接对其操作。C# 中提供了属性机制来对类内部的状态进行操作。此外,封装可以通过 public、private、protected 和 internal 等关键字来体现
Karl Du
2023/10/20
2480
C# new关键字和对象类型转换(双括号、is操作符、as操作符)
一、new关键字 CLR要求所有的对象都通过new来创建,代码如下: Object obj=new Object(); 以下是new操作符做的事情 1、计算类型及其所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数.堆上每个对象都需要一些额外的成员,包括“类型对象指针”和"同步索引块"。CLR利用这些成员管理对象.额外成员的字节数要计入对象的大小. 2、从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为0 3、初始化对象的"类型
郑小超.
2018/01/26
1K0
C# 中类与继承等概念
虚方法实现多态: 首先将父类函数标记为虚方法,然后子类就可以重写父类的虚方法,实现多态。
王瑞MVP
2022/12/28
3600
.NET基础拾遗(2)面向对象的实现和异常的处理基础
  在C#中申明一个类型时,只支持单继承(即继承一个父类),但支持实现多个接口(Java也是如此)。像C++可能会支持同时继承自多个父类,但.NET的设计小组认为这样的机制会带来一些弊端,并且没有必要。
Edison Zhou
2018/08/20
6400
.NET基础拾遗(2)面向对象的实现和异常的处理基础
[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法。 另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1,泛型 1.1 泛型是什么 泛型的英文表述是"generic", 这个单词意为通用的。从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化, 从而达到之实现一个方法就可以操作多种数据类型的目的。泛型是将方法实现行为与方法操作的数据类型分离,实现了代码重用。
一枝花算不算浪漫
2018/05/18
1.3K0
学习C#(一)
赶紧好好学学自己的C#,,要不然要给做的东西说拜拜了,,,时间紧迫,,,真担心会食言..................... 在C#中以为只要类有构造方法,,,,原来结构也有 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 结构 { class Program { public struct Rect {
杨奉武
2018/04/18
7230
学习C#(一)
C#实例练习5:类的设计和实现
实验1:创建类MyMath,计算圆的周长、面积和球的体积 创建类MyMath,包含常量PI,静态方法Perimeter(周长)、Area(面积)、Volume(体积)。 using System; namespace ConsoleApp5 { class MyMath { public const double PI = 3.1415926; public static double Perimeter (double r)
小孙同学
2022/01/17
6610
C# 数组基础
一、数组的基础知识 1、数组有什么用? 如果需要同一个类型的多个对象,就可以使用数组。数组是一种数组结构,它可以包含同一个类型的多个元素. 2、数组的初始化方式 第一种:先声明后赋值 int[] ar
郑小超.
2018/01/26
1.2K0
c#中的多态学习总结
c#的多台方法,大体上和c++的类似,但是有点区别的,我这里刚刚初学,因此把重点记录下。
用户4645519
2020/09/07
8660
C# 语言程序设计笔记
C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。他是从C和C++派生而来的,其与C/C++语法非常相似,并依附于.NET虚拟机的强大类库支持,各方面对强于C/C++.
王瑞MVP
2022/12/28
3.9K0
C#中Abstract 、Virtual和Override的使用
1. abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
用户2282526
2021/06/11
1.4K0
C#中Abstract 、Virtual和Override的使用
C# 反射高级用法
反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。反射是一种在.NET Framework中广泛使用的技术,它是实现上述特性的基础,非常重要。
郑子铭
2023/08/30
3030
C# 反射高级用法
C# 之 System.Object
System.Object C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承。假设我们没有明白指定继承类,编译器缺省觉得该类继承自System.Object类。System.Object类也可用小写的objectkeyword表示,两者全然等同。 由于全部的类都继承与System.Object,所以这些类都能够訪问该类中受保护的成员和公共的成员。以下我们就一起来看看可使用的成员有哪些。
全栈程序员站长
2022/07/12
4770
C# 之 System.Object
[译]聊聊C#中的泛型的使用(新手勿入)
今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发现了一些问题,因此也进行了纠正,当然,原文的地址我放在最下面,如果你的英文水平比较好的话,可以直接直接阅读全文。同时最近建了一个.NET Core实战项目交流群637326624,有兴趣的朋友可以来相互交流。目前.NET Core实战项目之CMS的教程也已经更新了6篇了,目前两到三天更新一篇。
依乐祝
2018/11/28
1.7K0
[译]聊聊C#中的泛型的使用(新手勿入)
C#基础知识之base、this、new、override、abstract梳理
base重要用于OOP的多态上,base 关键字用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中
用户9127601
2021/11/01
4780
C#进阶学习--反射(Reflection)
(1)Assembly:定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例。
腾云大使
2022/01/13
1.3K0
C# 中的动态类型
.NET 4.0 中引入的 dynamic 关键字为 C# 编程带来了一个范式转变。对于 C# 程序员来说,强类型系统之上的动态行为可能会让人感到不适 —— 当您在编译过程中失去类型安全性时,这似乎是一种倒退。
zls365
2021/04/02
3.4K0
c#多态性   静态多态性函数重载 动态多态性 虚方法:
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
酱紫安
2020/07/24
1.6K0
c#多态性
    




          静态多态性函数重载 动态多态性 虚方法:
C# 学习笔记(3)—— 类和结构体
类代表一组具有公共属性和行为的对象。比如人,有眼睛、鼻子、嘴巴这些属性以及走路、说话等这些行为,这些属性和行为是公共的
Karl Du
2023/10/20
2970
C1第 1 节: 面向对象类的介绍和继承
第 1 节: 面向对象类的介绍和继承 1、字段和属性可以看成是。这个对象的特征; 2、如果出现了曲线错误提示,鼠标放在那里,点击F6(或者等片刻); 3、子类默认调用父类无参数的构造函数,如果父类中没有默认的无参数的构造函数,需要手动添加无参数的构造函数; 4、子类也可以调用父类的有参数的构造函数,利用:base(); public Student(string name, int age ):base(name,age)//可以先写半个括号,就会有自动提示了。。 {
静心物语313
2020/03/24
4250
相关推荐
C# 学习笔记(4)—— C# 中的面向对象编程
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验