• 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

    返回当前对象的字符串

  • 相关阅读:
    OpenGL红宝书:第一个渲染程序Triangles常见问题归总
    OpenGL绘制简单的参数曲线(完)——三次B样条曲线
    OpenGL绘制简单的参数曲线(二)——三次Bezier曲线
    OpenGL绘制简单的参数曲线(一)——三次Hermite曲线
    xcode:读取txt文件
    mac opengl 画一个三角形
    glVertexAttribPointer
    glEnableVertexAttribArray 使用
    macOS下基于GLFW+GLAD的OpenGL环境配置
    php 执行 shell 命令转义字符
  • 原文地址:https://www.cnblogs.com/FinleyJiang/p/7602170.html
Copyright © 2020-2023  润新知