Object类

它是.NET Framework 中所有类的最终基类;它是类型层次结构的根。也就是说所有的类都拥有object类的方法,并能重写,调用.

object的构造函数:public Object().

直接使用new object()可以用来创建对象;如果非Object类型,则在该类型的构造函数被调用时,该函数自动被调用.

object类中的方法:

ToString()方法:快速获取对象的字符串表示的最便捷的方式.

案例:int i=99;string str=i.ToString();

另一个案例:

class Program

{

enum Colors

{

Red,

Green,

Yellow

}

static void Main(string[] args)

{

Colors color = Colors.Green;

string str = color.ToString();

}

}

Object.ToString()声明为虚方法,在这些例子中,实现该方法的代码都是为C#预定义数据类型重写过的代码,以返回这些类型的正确字符串表示.Colors枚举是一个预定义的数据类型,实际上实现一个派生自System.Enum的结构,而System.Enum有一个相当智能的ToString()重写方法,它处理用户定义的所有枚举.

如果不在自己定义的类中重写ToString(),该类将只继承System.Object的实现方法----它显示类的名称.如果希望ToString()返回一个字符串,其中包含类中对象的值信息,就需要重写它.例如:

class Program

{

static void Main(string[] args)

{

Money cash1 = new Money();

cash1.Amount = 40M;

Console.WriteLine(cash1.ToString());

Console.ReadKey();

}

}

public class Money

{

private decimal amount;

public decimal Amount

{

get

{

return amount;

}

set

{

amount = value;

}

}

public override string ToString()

{

return "$"+Amount.ToString();//这里如果不这么写,写成base.ToString()会咋样?如果只写ToString()会咋样.

}

}

Equals方法:确定指定的Object是否相等于当前的Object.   Equals默认实现支持引用相等性(德育引用类型)和按位相等性(对于值类型).引用相等性是指进行比较的多个对象引用所引用的是同一个对象.按位相等性是指进行比较的多个对象具有相同的二进制表示形式.

此方法可由派生类重写.例如,如果两个对象表示相同的值,则许多基数据类型返回true;否则返回false.

此方法仅比较级元素和对象.若要比较复杂的结构(如对象数组),必须重写该方法.

案例:

public class Sample {
    void Method() {
    Object Obj1 = new Object();
    Object Obj2 = new Object();
    Console.WriteLine(Obj1.Equals(Obj2)); //===> false
    Obj2 = Obj1;
    Console.WriteLine(Obj1.Equals(Obj2)); //===> true
    }
}

GetHashCode方法:用作特定的哈希函数.生成一个与对象的值相对应的数字以支持哈希表的使用。

class Program

{

static void Main(string[] args)

{

Hashtable ht = new Hashtable();

Class3 cc = new Class3(2, 3);

Class3 cc2 = new Class3(1, 4);

Class3 cc3 = new Class3(3, 3);

ht.Add(cc, "test1");

ht.Add(cc2, "test2");

ht.Add(cc3, "test3");

//cc.x = 5;

foreach (var item in ht.Keys)

{

Console.WriteLine(item.ToString());

Console.WriteLine(ht[item]);

}

Console.Read();

}

}

class Class3

{

public int x;

int y;

public Class3(int x, int y)

{

this.x = x;

this.y = y;

}

public override int GetHashCode()

{

Console.WriteLine("判断hashcode");

return x + y;

}

public override bool Equals(object obj)

{

Console.WriteLine("判断equals");

return base.Equals(obj);

}

public override string ToString()

{

return x.ToString() + y.ToString();

}

}

输出结果为:

判断hashcode

判断hashcode

判断equals

判断hashcode

33

判断hashcode

test3

14

判断hashcode

test2

23

判断hashcode

判断equals

test1

分析:

当向Hashtable里插入cc时,这时候哈希表是空的,所以只需要判断hashcode就行了;

当cc2插入哈希表时,判断哈希码,由于已经有了一个相同的哈希码的项,所以这时候需要判断它俩是不是相同的对象,不相同再插入哈希表。

输出的时候,

注意cc2那一项判断了两次Equals,这是由于按照哈希码查找到两个项,再通过key的判断取出这项的值(key是按照插入的先后顺序排列,对比的时候也是从前向后)。

从上面的讨论可以看出,哈希码只有在作为集合索引的时候才起作用,平时根本用不上这个功能,GetHashCode方法其实不用放在Object里面,而是可以单独放在一个接口里面

Finalize方法

几乎可以完全肯定地说,对于大多数C++编程人员而言,C#与C++最大的不同之处就在于碎片收集。这也意味着编程人员再也无需担心内存泄露和确保删除所有没有用的指针。但我们再也无法精确地控制杀死无用的对象这个过程。事实上,在C#中没有明确的destructor。

如果使用非可管理性资源,在不使用这些资源后,必须明确地释放它。对资源的隐性控制是由Finalize方法(也被称为Finalize)提供的,当对象被销毁时,它就会被碎片收集程序调用收回对象所占用的资源。

Finalize应该只释放被销毁对象占用的非可管理性资源,而不应牵涉到其他对象。如果在程序中只使用了可管理性资源,那就无需也不应当C#执行Finalize方法,只有在非可管理性资源的处理中才会用到Finalize方法。由于Finalize需要占用一定的资源,因此应当只在需要它的方法中执行Finalize。

直接调用一个对象的Finalize方法是绝对不允许的(除非是在子类的Finalize中调用基础类的Finalize。),碎片收集程序会自动地调用Finalize.接近C++风格的析构函数,在饮用对象作为垃圾被回收以倾力资源的时候调用它.Finalize方法的Object实现方式实际上什么也没有做,因而被垃圾收集器忽略.如果对象拥有对未托管资源的引用,则在该对象被删除时,就需要删除这些引用,此时一般重写Finalize().垃圾收集器不能直接伤处这些对未托管资源的引用,因为它只负责托管的资源,于是它只能依赖用户提供的Finalize()

最后:

using System;// The Point class is derived from System.Object.class Point {    public int x, y;     public Point(int x, int y)     {        this.x = x;        this.y = y;    }     public override bool Equals(object obj)     {        // If this and obj do not refer to the same type, then they are not equal.        if (obj.GetType() != this.GetType()) return false;         // Return true if  x and y fields match.        Point other = (Point) obj;        return (this.x == other.x) && (this.y == other.y);    }     // Return the XOR of the x and y fields.    public override int GetHashCode()     {        return x ^ y;    }     // Return the point's value as a string.    public override String ToString()     {        return String.Format("({0}, {1})", x, y);    }     // Return a copy of this point object by making a simple field copy.    public Point Copy()     {        return (Point) this.MemberwiseClone();    }}public sealed class App {    static void Main()     {        // Construct a Point object.        Point p1 = new Point(1,2);         // Make another Point object that is a copy of the first.        Point p2 = p1.Copy();         // Make another variable that references the first Point object.        Point p3 = p1;         // The line below displays false because p1 and p2 refer to two different objects.        Console.WriteLine(Object.ReferenceEquals(p1, p2));         // The line below displays true because p1 and p2 refer to two different objects that have the same value.        Console.WriteLine(Object.Equals(p1, p2));         // The line below displays true because p1 and p3 refer to one object.        Console.WriteLine(Object.ReferenceEquals(p1, p3));         // The line below displays: p1's value is: (1, 2)        Console.WriteLine("p1's value is: {0}", p1.ToString());    }}// This code example produces the following output://// False// True// True// p1's value is: (1, 2)//

名称

说明

Equals(Object)

确定指定的对象是否等于当前对象

Equals(Object,Object)

确定指定的对象实例是否被视为相等

Finalize

允许对象在”垃圾回收”回收之前常识释放资源并执行其他清理操作

GetHashCode

作为默认哈希函数

GetType

获取当前实例的Type

MemberwiseClone

创建当前Object的浅表副本

ReferenceEquals

确定指定的Object实例是否是相同的实例

ToString

返回当前对象的字符串

C#编程(十七)----------Object类的更多相关文章

  1. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  2. 面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法

    继承 概念: ①   继承背后的思想就是基于已存在的类来构建新类; ②   当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求; ③   当从其它类导出的类叫作子 ...

  3. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类

    class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...

  4. 并发编程(六)Object类中线程相关的方法详解

    一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...

  5. Java并发编程:Thread类的使用

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

  6. Object类概述

    Object:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.每个类都直接或者间接的继承自Object类. Object类的方法:public int hashCode() ...

  7. java10-1 Object类

    Object:类      Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...

  8. Java基础知识强化26:Object类之hashCode()方法、getClass()方法

    1. Object类的hashCode()方法,如下: public  int  hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...

  9. JDK1.8源码(一)——java.lang.Object类

    本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...

随机推荐

  1. jenkins 使用Git持续构建

    为jenkins添加git插件. 在Available tab页中找到Git Plugin 点击下方的Install without Restart安装插件. 插件安装完毕后,我们需要在jenkins ...

  2. window BIOS设置硬盘启动模式

      bios如何设置硬盘启动模式?BIOSD硬盘模试主是要针对IDE接口的硬盘和SATA接口的硬盘来设置的.以前的主板只支持一种类型.现在的智能笔记本主板支持:IDE Mode.AHCI Mode.下 ...

  3. Linux挂载qcow2格式的镜像

    qcow2格式的镜像一般用于KVM/QEMU的hypervisor,当我们需要修改guest host内的一些配置而又不想启动VM时则可以通过挂载guest host进行修改. 需要安装的工具包: l ...

  4. java 多态缺陷

    一,会覆盖私有方法 package object; class Derive extends Polymorphism{ public void f1() { System.out.println(& ...

  5. 【AtCoder】AGC029(A-E)

    A - Irreversible operation 题解 把每个B后面的W个数累加起来即可 代码 #include <bits/stdc++.h> #define fi first #d ...

  6. 030 RDD Join中宽依赖与窄依赖的判断

    1.规律 如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖 除 ...

  7. win10+wget 收藏

    win10+wget  收藏    https://blog.csdn.net/qq_31163325/article/details/84344774 1.下载地址:https://eternall ...

  8. 002.DHCP配置

    一 DHCP服务器安装包 yum -y install dhcp 二 对应端口 ipv4 udp67.udp68 ipv6 udp546.udp547 三 文件路径 服务名:dhcpd 主配置文件:/ ...

  9. 数据库相关--mysql中的单表查询

    一.完整的单表查询语句 select [distinct] *|字段1,字段2, .... from 表名 [where 条件1] [group by 字段名 [having 条件2] ] [orde ...

  10. CentOS 7下升级MySQL5.7.23的一个坑

    发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例 在我们环境下打开文件描述符个数的参数open_files_limit在MySQL 5.6. ...