C# 中Object的方法含义以及使用(详)

2023-11-20

如下图是object中的方法

上图来源于我阅读C#入门经典第8版的书本当中,图中明确标明方法的使用,以及含义。

Equals方法

  比较两个对象是否相等。在Object是所有的父类大家都知道,其中Object中方法Equals 有两种

object中内部方法代码的截图

第一种静态的

静态通过对象直接点方法名调用 如下所示 (至于为什么没有写Object是因为Object类在我们类中已经隐式的继承了)

  PLS pLS = new PLS();
            PLS pLSs = pLS;
            Equals(pLSs, pLS);

当前的返回结果为 True 因为当您比较的,如果是引用类型的对象,则用于判断两个对象是否引用了同一个对象。

第二种虚方法(居然是虚方法,那肯定能重写) 

   public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

不重写当然可以,使用变量名称点方法 Equals便好 (如下结果依旧会是 True)

   public class Program : Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            PLS pLSs = pLS;
            Console.WriteLine(pLS.Equals(pLSs));
            ReadKey();
        }
      
    }

当前方法 Equals 总之记住 

  • 如果是引用类型的对象,则用于判断两个对象是否引用了同一个对象。

Equals 上面使用的是一个参数,且是非静态的虚方法能被重写,是使用参数名点出方法。这里使用同样是Equals但它是静态的两个参数签名的方法。

其中的含义于上面的非静态的方法Equals相同,其中就是当您比较的值为空引用那么返回的值就是True

   PLS pLS = new PLS();
            PLS pLSs = new PLS ();
          WriteLine( Equals(pLS, pLSs));//结果为false
                                        //ReferenceEquals("","");


            PLS pLS1 = pLS;
            WriteLine(Equals(pLS, pLS1));//结果为True
            Console.WriteLine(pLS1.Equals(pLS));//结果为True
            Console.WriteLine(Equals(null,null));//结果为True
            ReadKey();

如果您使用静态的Equals比较的为空引用,那么程序会报错: System.NullReferenceException:“未将对象引用设置到对象的实例。”

ReferenceEquals 方法

 和上面静态方法Equals很像效果几乎一致。

ToString方法

将对象转换为string类型,如果是引用类型得到的就是当前类型所在的命名空间

MemberwiseClone 方法

默认使用该方法是复制当前对象的内容返回,同对象类型的变量。我们称呼为复制,其中复制有深度复制 和浅度复制,如下我们使用方法Clone

  public class Program :Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            pLS.MyProperty = 10;

           PLS newpLS= (PLS)pLS.Clone();
            Console.WriteLine(newpLS.MyProperty);//结果10
            ReadKey();
        }
    }
    public class PLS
    {
        public PLS() {}
        public int MyProperty { get; set; }
        private int myVar;
        public int MyPropertsy => myVar;
        public object Clone() => MemberwiseClone();
    }

默认将所有对象下的值进行了复制 ,且我更改其中的pLS 的属性MyProperty的值newpLS下的属性不会更改。但如果是引用一个类的属性可能出现问题 如下(问题:在更改其中的属性Count,两个对象的值都改变了 原因就是引用的同一个实例,上面属性没有问题是,虽然引用了相同的对象,但是在实际使用中也不会有什么问题。PL是一个对象实例可以说是复制指向了同一个类

 public class Program :Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            pLS.MyProperty = 10;

           PLS newpLS= (PLS)pLS.Clone();
            newpLS.PL.Count = 100;
            Console.WriteLine(pLS.PL.Count);//结果100
            Console.WriteLine(newpLS.PL.Count);//结果100
            ReadKey();
        }
    }
    public class PLS
    {
        public PLS() { PL.Count = 10; }
        public int MyProperty { get; set; }
        public object Clone() => MemberwiseClone();
        public OP PL { get; set; } = new OP();
    }
    public class OP
    {
        public int Count { get; set; }
    }

解决问题就是浅度复制,上面被称呼为深度复制 

改变复制的方法,将复制的时候 PL的属性指向,不在是同一个类 ,而是创建一个新的类返回

   public object Clone()
        {
            PLS pLS = (PLS)MemberwiseClone();
            pLS.PL = new OP();
            return pLS;

        }

GetType方法

返回当前实例的类型,方法为非静态,GetType

Object下的GetType截图

使用示例场景:类型比较 如下情景 判断变量是否为 string类型 

 string k="S";
            k.GetType().ToString();//获取当前实例
            //GetType可以用作类型判断
            //示例
           if (k.GetType() == typeof(string))//判断是否为 string类型的值
            {
// code
            }

GetHashCode方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中Object的方法含义以及使用(详) 的相关文章

  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • C++,多语言/本地化支持

    向 C 程序添加多语言支持的最佳方法是什么 如果可能 应该从包含键值对 WelcomeMessage Hello s 之类的纯文本文件中读取语言 我想到了添加一个 localizedString key 函数来返回加载的语言文件的字符串 有
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 如何在C中将2个4位无符号数组合成1个8位数

    我有 2 个 4 位数字 X0X1X2X3 和 Y0Y1Y2Y3 我想将它们组合起来 这样我就可以创建一个像这样的 8 位数字 X0X1X2X3 Y0Y1Y2Y3 gt X0Y0X1Y1X2Y2X3Y3 我知道如何连接它们以创建X0X1X1
  • 如何获取 C# PriorityQueue 元素的优先级

    我正在初始化一个存储 XY 坐标的优先级队列 根据距原点的欧几里得距离确定优先级 我创建了一个自定义Comparer这使得它作为最大堆运行 PriorityQueue
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • C++ fill() 与 uninitialized_fill()

    您好 我是初学者 我想知道容器的 fill 和 uninitialized fill 之间的区别 我在谷歌上进行了快速搜索 但没有得到很好的答案 有人可以帮助我吗 fill 将值 使用赋值运算符 分配给已构造的对象 uninitialize
  • 具有多重继承的不明确基数

    我正在尝试在一个大库中编写一些类的子类 我收到 基础不明确 错误 这是该问题的一个可编译示例 include
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • C++20 views::join 在生成的嵌套范围::single_view 上进入无限循环

    我正在使用 GCC 实现 v10 2 和 v11 来处理 C 20 范围 测试的行为std views join https en cppreference com w cpp ranges join view 我尝试使用生成嵌套视图sin
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 为什么 C++ 元组如此奇怪?

    我通常创建自定义structs将不同类型的值分组在一起时 这通常很好 而且我个人发现命名成员访问更容易阅读 但我想创建一个更通用的 API 在其他语言中广泛使用元组后 我想返回类型的值std tuple但发现它们在 C 中使用比在其他语言中
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • 如何将这个基于代码的 WPF 工具提示转换为 Silverlight?

    以下工具提示代码适用于WPF 我正在努力让它发挥作用银光 但它给了我这些errors TextBlock does not contain a definition for ToolTip Cursors does not contain
  • int 类型的构造函数

    考虑到成本 这些情况是否相同 case 1 int a 5 case 2 int a 5 case 3 int a a 5 这三种语法是不同的 请耐心等待 我使用用户定义类型而不是 int 稍后我将回到 int T a 5 Direct i

随机推荐

  • ubuntu双网卡绑定一个IP

    Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡 这个聚合起来的设备看起来是一个单独的以太网接口设备 通俗点讲就是两块网卡具有相同的IP 地址而并行链接聚合成一个逻辑链路工作 其实这项 技术在Sun和Cisco中早已存在 被称为Tr
  • Byte位元组单位-KB KiB MB MiB GB GiB区别

    一般而言大部份都只知道KB MB GB TB 等 倒是沒聽過KiB MiB 等 現在搞懂 原來分為以1000位元組或用1024位元組來計算之 這就是為什麼我們平時買硬碟或隨身碟的容量與實際真實的容量不同 像是我了8GB的隨身碟 實際為8 3
  • YOLOV5-6.1报错:OSError: [WinError 1455] 页面文件太小,无法完成操作。

    YOLOV5 6 1报错 OSError WinError 1455 页面文件太小 无法完成操作 注意 成功 解决方案 注意 数据集和之前的 共用一个数据集 使用之前的处理方式
  • vue之mixin理解与使用

    vue之mixin理解与使用 混入 mixin 提供了一种非常灵活的方式 来分发 Vue 组件中的可复用功能 一个混入对象可以包含任意组件选项 当组件使用混入对象时 所有混入对象的选项将被 混合 进入该组件本身的选项 权重 全局mixins
  • 开发之路,穷且益坚,不坠青云之志(入门开发者共勉)

    引言 2023毕业季 距离笔者毕业已过2年有余 互联网从业环境由盛转衰 互联网从业者数量剧增 市场竞争异常激烈 原本的利润空间被不断挤压 以至于很多开发者对互联网已经失去了信心与激情 互联网的市场份额依旧是占据着巨大的比重 为何互联网从业环
  • LInux基础——SELinux

    SELinux SELinux是什么 存取控制 自主式 DAC 委任式 MAC SELinux组成 SELinux安装 SELinux开关及模式 SELinux运行原理 SELinux Policy规则 getsebool setseboo
  • String.IsNullOrEmpty

    作用 指示指定的字符串是 null 还是 Empty 字符串 语法 public static bool IsNullOrEmpty string value 参数 value Type System String 要测试的字符串 返回值
  • 【SAP ABAP】OLE批量下载文件

    SAP ABAP OLE批量下载文件 目前在做DOI的程序 发现OAOR与SMW0有相似之处 OAOR可以单独获取文件夹地址与目标文件名拼接下载 但是之前OLE下载方式都是针对一个文件的 现在摸索出了批量方式 有限制 这里将先将主要代码粘贴
  • Maven创建现实公司应用web项目

    1 步骤说明 STEP BY STEP 见 下载地址 http download csdn net detail jun55xiu 8314633 2 过程出现的问题汇总 1 Failed to execute goalorg apache
  • css图片不断放大缩小的动画效果

    img class move img width 26px src assets img btn coupon 2x png alt move img animation name scaleDraw 关键帧名称 animation tim
  • 前端面试中级开发必须知道跨域解决方案

    跨域 不同协议 不同URL 不同端口号都会产生跨域 解决跨域的方案 postMessage web worker iframe Jsonp 用script标签请求地址 标签可以跨域 cors 服务端设置响应头信息 允许跨域 1 最常见用co
  • 【Java进阶营】29个你必须学会的微服务面试问题(含答案解析)

    这29个微服务面试题基本涵盖了方方面 希望对你有所帮助 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img YvPsK1zg 1651230439289 https upload images jianshu io
  • Starting udev卡死的问题

    Linux启动停止在Starting udev 一 出现问题 在VM的CentOS 5 4 32bit上重新编译了内核 2 6 19 7 启动新内核时 停在starting udev 然后按下Ctrl C取消 才能继续启动 于是google
  • 解决View drawableLeft左侧图片大小不可控的问题

    今天在制作带文字的图片按钮的时候 使用了TextView的drawableLeft属性 但是在使用的过程中 我发现我所使用的图片资源的大小过大 导致整个效果很不和谐 可是drawableLeft并不能在xml通过属性控制它的大小 这时 我就
  • 《OpenGL编程指南》示例笔记(2)--独立地移动光源

    TITLE OpenGL编程指南 示例笔记 2 独立地移动光源 AUTHOR norains DATE Monday 21 June 2010 Environment Windows XP 示例概述 例名 独立地移动光源 序号 5 6 页码
  • TVS管电路原理图符号及选型举例

    TVS管的电路原理图符号与稳压二极管符号类似 结构也都差不多 了解TVS管的电路原理图符号是掌握TVS管符合选型的基础 一般常见的TVS管电路原理图符号有 VBR IPP IR VRWM VC PM CP VBR代表的是 击穿电压 IPP代
  • 最详细的Vue实现日历组件Calendar(日期点击多选,滑动多选)

    1 成果演示 1 1 日期的切换 1 2 点击多选 1 3 滑动多选 2 实现基本的日期渲染 2 1 思路 2 1 1 要用到的Date对象方法 new Date 2020 4 1 getDay 计算传入的日期是星期几 返回值0表示星期天
  • 官网下载Eclipse

    1 打开Eclipse官网 https www eclipse org 也可以在百度中 搜索 Eclipse 2 点击 Download 3 点击 Download Pakeges 4 下拉 选择所要的版本和系统 5 点击 Select A
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • C# 中Object的方法含义以及使用(详)

    如下图是object中的方法 上图来源于我阅读C 入门经典第8版的书本当中 图中明确标明方法的使用 以及含义 Equals方法 比较两个对象是否相等 在Object是所有的父类大家都知道 其中Object中方法Equals 有两种 obje