📄 7-8.cs
字号:
//程序7-8
using System;
class Reftest { public int testInt; }
class Student
{
public int studID;
public string studName;
public Reftest Ref1;
}
class CollegeStudent: Student
{
public int DepartmentID;
// Main方法只有定义在派生类中才能直接调用MemberwiseClone方法。
public static void Main()
{
CollegeStudent S1 = new CollegeStudent();
S1.studID = 2003179;
S1.studName = "Sam";
S1.DepartmentID=001;
S1.Ref1 = new Reftest();
S1.Ref1.testInt = 333;
// 浅表副本创建与原始对象具有相同类型的新实例,然后复制原始对象的非静态字段。
// 如果字段是值类型的,则对该字段执行逐位复制。
// 如果字段是引用类型,则复制该引用但不复制被引用的对象;
// 这样,原始对象中的引用和副本中的引用指向同一个对象。
// 相反,对象的深层副本复制对象中字段直接或间接引用的全部内容。
// Performs a shallow copy of m1 and assign it to m2.
CollegeStudent S2 = (CollegeStudent)S1.MemberwiseClone();
Console.WriteLine(S1.studID+" "+S1.studName+" "+S1.DepartmentID+" "+S1.Ref1.testInt);
Console.WriteLine(S2.studID+" "+S2.studName+" "+S2.DepartmentID+" "+S2.Ref1.testInt);
// 两个对象本身
Console.WriteLine(Object.ReferenceEquals(S1,S2)); // false
Console.WriteLine(Object.Equals(S1,S2)); // false
// 两个对象数据成员中的值类型
Console.WriteLine(Object.ReferenceEquals(S1.studID,S2.studID)); // false
Console.WriteLine(Object.Equals(S1.studID,S2.studID)); // true
// 两个对象数据成员中的引用类型
Console.WriteLine(Object.ReferenceEquals(S1.studName,S2.studName)); // true
Console.WriteLine(Object.Equals(S1.studName,S2.studName)); // true
Console.WriteLine(Object.ReferenceEquals(S1.Ref1,S2.Ref1)); // true
Console.WriteLine(Object.Equals(S1.Ref1,S2.Ref1)); // true
Console.WriteLine("===================");
S1.studName="Bush";
// S1.studName="Sam"; // string类型是一个特殊的引用类型,只要字符串内容相同,则引用和值均相等
S1.DepartmentID=002;
S1.Ref1.testInt = 444;
S1.studID = 2003180;
Console.WriteLine(S1.studID+" "+S1.studName+" "+S1.DepartmentID+" "+S1.Ref1.testInt);
Console.WriteLine(S2.studID+" "+S2.studName+" "+S2.DepartmentID+" "+S2.Ref1.testInt);
// 两个对象数据成员中的值类型
Console.WriteLine(Object.ReferenceEquals(S1.studID,S2.studID)); // false
Console.WriteLine(Object.Equals(S1.studID,S2.studID)); // true
// 两个对象数据成员中的引用类型
Console.WriteLine(Object.ReferenceEquals(S1.studName,S2.studName)); // false
Console.WriteLine(Object.Equals(S1.studName,S2.studName)); // false
Console.WriteLine(Object.ReferenceEquals(S1.Ref1,S2.Ref1)); // true
Console.WriteLine(Object.Equals(S1.Ref1,S2.Ref1)); // true
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -