C#编程(十七)----------Object类
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类的更多相关文章
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- 面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法
继承 概念: ① 继承背后的思想就是基于已存在的类来构建新类; ② 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求; ③ 当从其它类导出的类叫作子 ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:Object类
class Demo{ // 定义Demo类,实际上就是继承了Object类 }; public class ObjectDemo01{ public static void main(String ...
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- Java并发编程:Thread类的使用
Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...
- Object类概述
Object:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.每个类都直接或者间接的继承自Object类. Object类的方法:public int hashCode() ...
- java10-1 Object类
Object:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...
- Java基础知识强化26:Object类之hashCode()方法、getClass()方法
1. Object类的hashCode()方法,如下: public int hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...
- JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
随机推荐
- Linux硬盘的检测(原创)
http://czmmiao.iteye.com/blog/1058215 概述 随着硬盘容量.速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非 ...
- Shiro:ajax的session超时处理
本问题解决方案参照网站多篇文章融合解决,在此表示感谢! 环境:springboot+shiro+jquery-easyui 问题:在ajax请求时,如果此时session已经失效,系统没有自动跳转到登 ...
- SUSE Enterprise Server 12 SP3 64 设置防火墙开放8080端口,出现Unsafe permissions for file /etc/sysconfig/SuSEfirewall2 to be sourced
SUSE Enterprise Server 12 SP3 64 设置防火墙开放8080端口时出现 Unsafe permissions for file /etc/sysconfig/SuSEf ...
- Java流程控制练习--万年历
Java流程控制练习--万年历 标签: Java入坑之旅 0x01. 打印倒三角和正三角 public static void main(String[] args) { // TODO Auto-g ...
- linux开启远程访问端口
开启3306端口的tcp访问权限 /sbin/iptables -I INPUT -p tcp -dport 3306 -j ACCEPT 保存防火墙信息 /etc/rc.d/init.d/iptab ...
- Vue 动态组件渲染问题分析
fire 读在最前面: 1.本文适用于有一定基础的vue开发者,需要了解基本的vue渲染流程 2.本文知识点涉及vue构造器以及选项策略合并.<component> 渲染逻辑 问题描述: ...
- 设置idealUI选中变量的颜色与同名称变量的颜色一致
- Java中的String问题
方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优.因为字符串是保存在常量池中的,而通 ...
- 【LOJ】#2513. 「BJOI2018」治疗之雨
题解 具体就是列一个未知数方程\(dp[i]\)表示有\(i\)滴血的时候期望多少轮 \(dp[i] = 1 + \sum_{j = 1}^{i + 1} a_{i,j}dp[j]\) \(dp[n] ...
- 【AtCoder】ARC099题解
C - Minimization 每次操作必然包含一个1 枚举第一次操作的位置计算两边即可 代码 #include <bits/stdc++.h> #define fi first #de ...