【C#补全计划】万类之父中的方法

一、Object中的静态方法

  1. Equals方法

(1)作用:判断两个对象是否相等。最终的判断权交给左侧对象的Equals方法

(2)值类型比较:判断值是否相等

cs 复制代码
using System;

namespace ObjectFun
{
	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
		}
	}
}

运行结果如下:

(3)引用类型比较:判断引用地址是否相等

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true
		}
	}
}

运行结果如下:

  1. ReferenceEquals方法:

(1)作用:比较两个对象的引用地址是否相等

(2)值类型比较:始终返回false

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
		}
	}
}

运行结果如下:

(3)引用类型比较:判断引用地址是否相等

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true
		}
	}
}

运行结果如下:

二、Object中的成员方法

  1. GetType方法

(1)作用:获取对象运行时的类型

(2)代码:

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true

			// 调用Object类的成员方法
			// GetType方法: 获取对象运行时的类型
			Console.WriteLine("\nGetType方法:");
			Type type1 = 1.GetType(); // 获取整数1的类型
			Type type2 = t1.GetType(); // 获取t1的类型
			Console.WriteLine("数字1的类型: " + type1);
			Console.WriteLine("t1对象的类型: " + type2);
		}
	}
}

运行结果如下:

  1. MemberwiseClone方法

(1)作用:创建当前对象的浅拷贝对象

(2)代码:

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
		public int value;

		public Test2 obj;

		public Test()
		{
		}

		public Test(int value, Test2 obj)
		{
			this.value = value;
			this.obj = obj;
		}

		public Test clone()
		{
			return (Test)this.MemberwiseClone(); // 创建当前对象的浅拷贝
		}
	}

	class Test2
	{
		public int value;

		public Test2()
		{
		}

		public Test2(int value)
		{
			this.value = value;
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true

			// 调用Object类的成员方法
			// GetType方法: 获取对象运行时的类型
			Console.WriteLine("\nGetType方法:");
			Type type1 = 1.GetType(); // 获取整数1的类型
			Type type2 = t1.GetType(); // 获取t1的类型
			Console.WriteLine("数字1的类型: " + type1);
			Console.WriteLine("t1对象的类型: " + type2);

			// MemberwiseClone方法: 创建当前对象的浅拷贝对象
			Console.WriteLine("\nMemberwiseClone方法:");
			Test test = new Test(1, new Test2(2));
			Test clone = test.clone();
			Console.WriteLine("克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			clone.value = 11; // 修改克隆对象的值
			clone.obj.value = 22; // 修改克隆对象的引用类型成员的值
			Console.WriteLine("修改克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			// 可以理解为:值类型复制值,引用类型复制引用地址
			// 浅拷贝对象与原对象共享引用类型成员的内存地址,修改克隆对象的引用类型成员会影响原对象
		}
	}
}

运行结果如下:

三、Object中的虚方法

  1. Equals方法

(1)作用:比较两个对象的引用是否相同

(2)代码:

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
		public int value;

		public Test2 obj;

		public Test()
		{
		}

		public Test(int value, Test2 obj)
		{
			this.value = value;
			this.obj = obj;
		}

		public Test clone()
		{
			return (Test)this.MemberwiseClone(); // 创建当前对象的浅拷贝
		}
	}

	class Test2
	{
		public int value;

		public Test2()
		{
		}

		public Test2(int value)
		{
			this.value = value;
		}

		public override bool Equals(object? obj) // 重写Equals方法以比较Test2对象的值
		{
			if (obj is Test2 other) // 使用模式匹配检查类型并转换
			{
				return this.value == other.value; // 比较值是否相等
			}
			return false; // 类型不匹配,返回false
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true

			// 调用Object类的成员方法
			// GetType方法: 获取对象运行时的类型
			Console.WriteLine("\nGetType方法:");
			Type type1 = 1.GetType(); // 获取整数1的类型
			Type type2 = t1.GetType(); // 获取t1的类型
			Console.WriteLine("数字1的类型: " + type1);
			Console.WriteLine("t1对象的类型: " + type2);

			// MemberwiseClone方法: 创建当前对象的浅拷贝对象
			Console.WriteLine("\nMemberwiseClone方法:");
			Test test = new Test(1, new Test2(2));
			Test clone = test.clone();
			Console.WriteLine("克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			clone.value = 11; // 修改克隆对象的值
			clone.obj.value = 22; // 修改克隆对象的引用类型成员的值
			Console.WriteLine("修改克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			// 可以理解为:值类型复制值,引用类型复制引用地址
			// 浅拷贝对象与原对象共享引用类型成员的内存地址,修改克隆对象的引用类型成员会影响原对象

			// 调用Object类的虚方法
			// Equals方法: 比较两个对象的引用是否相同, 相当于ReferenceEquals方法
			Console.WriteLine("\nEquals方法:");
			Test2 t2_1 = new Test2(1);
			Test2 t2_2 = new Test2(1); // 值相同但引用地址不同
			Console.WriteLine("t2_1 t2_2重写Equals方法比较: " + t2_1.Equals(t2_2)); // true, 因为重写了Equals方法, 只比较值是否相等
		}
	}
}

运行结果如下:

  1. GetHashCode方法

(1)作用:获取对象的哈希码

(2)哈希码:通过一种算法算出的,表示对象的唯一标编码。不同的对象可能有相同的哈希码,但相同的对象一定有相同的哈希码

(3)代码:

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
		public int value;

		public Test2 obj;

		public Test()
		{
		}

		public Test(int value, Test2 obj)
		{
			this.value = value;
			this.obj = obj;
		}

		public Test clone()
		{
			return (Test)this.MemberwiseClone(); // 创建当前对象的浅拷贝
		}
	}

	class Test2
	{
		public int value;

		public Test2()
		{
		}

		public Test2(int value)
		{
			this.value = value;
		}

		public override bool Equals(object? obj) // 重写Equals方法以比较Test2对象的值
		{
			if (obj is Test2 other) // 使用模式匹配检查类型并转换
			{
				return this.value == other.value; // 比较值是否相等
			}
			return false; // 类型不匹配,返回false
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true

			// 调用Object类的成员方法
			// GetType方法: 获取对象运行时的类型
			Console.WriteLine("\nGetType方法:");
			Type type1 = 1.GetType(); // 获取整数1的类型
			Type type2 = t1.GetType(); // 获取t1的类型
			Console.WriteLine("数字1的类型: " + type1);
			Console.WriteLine("t1对象的类型: " + type2);

			// MemberwiseClone方法: 创建当前对象的浅拷贝对象
			Console.WriteLine("\nMemberwiseClone方法:");
			Test test = new Test(1, new Test2(2));
			Test clone = test.clone();
			Console.WriteLine("克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			clone.value = 11; // 修改克隆对象的值
			clone.obj.value = 22; // 修改克隆对象的引用类型成员的值
			Console.WriteLine("修改克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			// 可以理解为:值类型复制值,引用类型复制引用地址
			// 浅拷贝对象与原对象共享引用类型成员的内存地址,修改克隆对象的引用类型成员会影响原对象

			// 调用Object类的虚方法
			// Equals方法: 比较两个对象的引用是否相同, 相当于ReferenceEquals方法
			Console.WriteLine("\nEquals方法:");
			Test2 t2_1 = new Test2(1);
			Test2 t2_2 = new Test2(1); // 值相同但引用地址不同
			Console.WriteLine("t2_1 t2_2重写Equals方法比较: " + t2_1.Equals(t2_2)); // true, 因为重写了Equals方法, 只比较值是否相等

			// GetHashCode方法: 获取对象的哈希码
			// 哈希码: 通过一种算法算出的,表示对象的唯一标编码。不同的对象可能有相同的哈希码,但相同的对象一定有相同的哈希码
			// 可以通过重写GetHashCode方法来定制哈希码的计算方式
			Console.WriteLine("\nGetHashCode方法:");
			Console.WriteLine("t1的哈希码: " + t1.GetHashCode()); // 输出t1的哈希码
			Console.WriteLine("t2的哈希码: " + t2.GetHashCode()); // 输出t2的哈希码
			Console.WriteLine("t3的哈希码: " + t3.GetHashCode()); // 输出t3的哈希码
			Console.WriteLine("test的哈希码: " + test.GetHashCode()); // 输出test的哈希码
			Console.WriteLine("clone的哈希码: " + clone.GetHashCode()); // 输出clone的哈希码
			Console.WriteLine("t2_1的哈希码: " + t2_1.GetHashCode()); // 输出t2_1的哈希码
			Console.WriteLine("t2_2的哈希码: " + t2_2.GetHashCode()); // 输出t2_2的哈希码
		}
	}
}

运行结果如下:

  1. ToString方法

(1)作用:获取对象的字符串表示形式

(2)代码:

cs 复制代码
using System;

namespace ObjectFun
{
	class Test
	{
		public int value;

		public Test2 obj;

		public Test()
		{
		}

		public Test(int value, Test2 obj)
		{
			this.value = value;
			this.obj = obj;
		}

		public Test clone()
		{
			return (Test)this.MemberwiseClone(); // 创建当前对象的浅拷贝
		}

		public override string ToString() // 重写ToString方法以返回对象的字符串表示形式
		{
			return "值:" + value + ", 引用类型成员值: " + (obj != null ? obj.value : "null");
		}
	}

	class Test2
	{
		public int value;

		public Test2()
		{
		}

		public Test2(int value)
		{
			this.value = value;
		}

		public override bool Equals(object? obj) // 重写Equals方法以比较Test2对象的值
		{
			if (obj is Test2 other) // 使用模式匹配检查类型并转换
			{
				return this.value == other.value; // 比较值是否相等
			}
			return false; // 类型不匹配,返回false
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			// 调用Object类的静态方法
			// Equals方法: 比较两个对象是否相同
			Console.WriteLine("Equals方法:");
			// 值类型比较: 比较两个对象的值是否相等
			Console.WriteLine("1 1值类型比较: " + Object.Equals(1, 1)); // true
			Console.WriteLine("1 2值类型比较: " + Object.Equals(1, 2)); // true
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Test t1 = new Test();
			Test t2 = new Test();
			Test t3 = t1; // 让t3指向t1的引用地址
			Console.WriteLine("t1 t2引用类型比较: " + Object.Equals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.Equals(t1, t3)); // true

			// ReferenceEquals方法: 比较两个对象的引用是否相同
			Console.WriteLine("\nReferenceEquals方法:");
			// 值类型比较: 始终返回false
			Console.WriteLine("1 1值类型比较: " + Object.ReferenceEquals(1, 1)); // false
			Console.WriteLine("1 2值类型比较: " + Object.ReferenceEquals(1, 2)); // false
			// 引用类型比较: 比较两个对象的内存地址是否相同
			Console.WriteLine("t1 t2引用类型比较: " + Object.ReferenceEquals(t1, t2)); // false
			Console.WriteLine("t1 t3引用类型比较: " + Object.ReferenceEquals(t1, t3)); // true

			// 调用Object类的成员方法
			// GetType方法: 获取对象运行时的类型
			Console.WriteLine("\nGetType方法:");
			Type type1 = 1.GetType(); // 获取整数1的类型
			Type type2 = t1.GetType(); // 获取t1的类型
			Console.WriteLine("数字1的类型: " + type1);
			Console.WriteLine("t1对象的类型: " + type2);

			// MemberwiseClone方法: 创建当前对象的浅拷贝对象
			Console.WriteLine("\nMemberwiseClone方法:");
			Test test = new Test(1, new Test2(2));
			Test clone = test.clone();
			Console.WriteLine("克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			clone.value = 11; // 修改克隆对象的值
			clone.obj.value = 22; // 修改克隆对象的引用类型成员的值
			Console.WriteLine("修改克隆对象后: ");
			Console.WriteLine("test.value:" + test.value + ", test.obj.value:" + test.obj.value);
			Console.WriteLine("clone.value:" + clone.value + ", clone.obj.value:" + clone.obj.value);
			// 可以理解为:值类型复制值,引用类型复制引用地址
			// 浅拷贝对象与原对象共享引用类型成员的内存地址,修改克隆对象的引用类型成员会影响原对象

			// 调用Object类的虚方法
			// Equals方法: 比较两个对象的引用是否相同, 相当于ReferenceEquals方法
			Console.WriteLine("\nEquals方法:");
			Test2 t2_1 = new Test2(1);
			Test2 t2_2 = new Test2(1); // 值相同但引用地址不同
			Console.WriteLine("t2_1 t2_2重写Equals方法比较: " + t2_1.Equals(t2_2)); // true, 因为重写了Equals方法, 只比较值是否相等

			// GetHashCode方法: 获取对象的哈希码
			// 哈希码: 通过一种算法算出的,表示对象的唯一标编码。不同的对象可能有相同的哈希码,但相同的对象一定有相同的哈希码
			// 可以通过重写GetHashCode方法来定制哈希码的计算方式
			Console.WriteLine("\nGetHashCode方法:");
			Console.WriteLine("t1的哈希码: " + t1.GetHashCode()); // 输出t1的哈希码
			Console.WriteLine("t2的哈希码: " + t2.GetHashCode()); // 输出t2的哈希码
			Console.WriteLine("t3的哈希码: " + t3.GetHashCode()); // 输出t3的哈希码
			Console.WriteLine("test的哈希码: " + test.GetHashCode()); // 输出test的哈希码
			Console.WriteLine("clone的哈希码: " + clone.GetHashCode()); // 输出clone的哈希码
			Console.WriteLine("t2_1的哈希码: " + t2_1.GetHashCode()); // 输出t2_1的哈希码
			Console.WriteLine("t2_2的哈希码: " + t2_2.GetHashCode()); // 输出t2_2的哈希码

			// ToString方法: 获取对象的字符串表示形式
			// 可以通过重写ToString方法来自定义字符串的表示形式
			Console.WriteLine("\nToString方法:");
			Console.WriteLine("t1重写ToString方法: " + t1.ToString()); // 输出t1的字符串表示
			Console.WriteLine("test重写ToString方法: " + test.ToString()); // 输出t2的字符串表示
		}
	}
}

运行结果如下:

今天的学习就到这里了。感谢阅读。

再见!