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. history命令追查登录的用户和时间

    Linux查看History记录加时间,这个对于系统管理员还是很有帮助的,原因不解释,你懂得!ora11g$ history  |  more  1    rlwrap sqlplus / as sy ...

  2. three.js 初探

    2014年3月3日 22:18:40 简单旋转立方体: http://blog.163.com/hailin_xin/blog/static/21816219020136103402812 简单球体入 ...

  3. 设计模式及Python实现

    设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用该方案而不必做重复劳动.” 设计 ...

  4. JS windows.open打开窗口并居中

    function openWin() {            var url='Add.aspx';                             //转向网页的地址;           ...

  5. PHP使用某个键值对二维数组排序

    $arr=[ array( 'name'=>'A', 'age'=>28 ), array( 'name'=>'B', 'age'=>14 ), array( 'name'=& ...

  6. Java编程的逻辑 (10) - 强大的循环

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. 解决RabbitMQ service is already present - only up...

    C:\Users\Administrator>rabbitmq-service install RabbitMQ service is already present - only updati ...

  8. AndroidManifest.xml配置文件详解 (转)

    原文:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的 ...

  9. Linux磁盘空间扩容(LVM)

    Linux磁盘空间扩容(lvm) 随着系统的运行时间增长,业务数据的增长,原有磁盘的空间会存在空间不足情况,导致系统不能正常运行,或者系统管理员磁盘没有完全划完,根据使用者的需求自行划分.那么怎么才能 ...

  10. Atom组件

    Atom组件 最近用Atom写博客比较多,然后发现一个很严重的问题.. 没有一个我想要的上传图片的方式,比如某乎上边就可以直接copy/paste文件,然后进行上传. 然而在Atom上没有找到类似的插 ...