C#知識:萬物之父Object
Object類(即object)是所有類的基類,這里面的方法還是需要好好了解一下。
1、Object類
- 是頂級父類,其他類默認都是Object類的子類(自定義類也會默認繼承Object類)
- 可以用Object變量裝載值類型和其他自定義類型對象
- Object類是引用類型
- 存在裝箱拆箱
object x = 100; //裝箱
int y = (int)x; //拆箱
2、Object類中的靜態方法
2.1 靜態方法Equals
- 判斷兩個參數是否相等
- 調用第一個參數的虛擬Equals方法進行判斷,無論值類型和引用類型
public static bool Equals(object? objA, object? objB);
2.2 靜態方法ReferenceEquals
- 比較兩個引用類型對象是否相等
- 傳遞值類型則返回false
public static bool ReferenceEquals(object? objA, object? objB);
3、Object類的成員方法
3.1 普通方法GetType
- 返回對象類型的Type對象,可用于反射
public extern Type GetType();
3.2 普通方法MemberwiseClone
- 獲取對象的淺拷貝對象
- 對象的引用類型成員變量也是直接拷貝,指向堆中相同位置
protected unsafe object MemberwiseClone();
4、Object類的虛擬方法
4.1 虛擬方法Equals
- 只有一個參數,將調用方法的對象與參數對象進行比較
- 引用類型比較引用(默認)
- 值類型比較值是否相等,因為System.ValueType中重寫了該方法
- 測試了枚舉和結構體,也符合值類型的比較規則
public virtual bool Equals(object? obj)
4.2 虛擬方法GetHashCode
- 獲取對象哈希值
public virtual int GetHashCode()
4.3 虛擬方法ToString
- 將對象進行打印輸出時默認調用此方法
public virtual string? ToString()
5、完整測試用例:
namespace LearnObject
{enum Daily{Eat,Sleep}struct Point{public int x;public int y;public Point():this(0,0) { }public Point(int x, int y){this.x = x;this.y = y;}}class Student{public string name;public int age;public Teacher teacher;public Student():this("張飛",18, new Teacher()) { }public Student(string name, int age){this.name = name;this.age = age;this.teacher = new Teacher();}public Student(string name, int age, Teacher teacher) : this(name, age){this.teacher = teacher;}public override bool Equals(Object? a){if (a != null && a is Student){Student other = a as Student;return this.name.Equals(other.name) && this.age == other.age;}return false;}public override int GetHashCode(){Console.WriteLine($"重寫之前的哈希值: {base.GetHashCode()}");return 10086; //自定義哈希邏輯}public override string ToString(){return $"自定義輸出,學生的名字:{this.name},年齡:{this.age} \n" ;}public Student ShallowClone() => this.MemberwiseClone() as Student;}class Student2{public string name;public int age;public Teacher teacher;public Student2() : this("張飛", 18, new Teacher()) { }public Student2(string name, int age){this.name = name;this.age = age;this.teacher = new Teacher();}public Student2(string name, int age, Teacher teacher) : this(name, age){this.teacher = teacher;}public Student2 ShallowClone() => this.MemberwiseClone() as Student2;}class Teacher{public string name;public Teacher() { this.name = "諸葛亮"; }public Teacher(string name){this.name = name;} }internal class Program{static void Main(string[] args){object x = 100; //裝箱int y = (int)x; //拆箱Student student1 = new Student();Student student2 = new Student();Student2 student3 = new Student2();Student2 student4 = new Student2();Console.WriteLine(Equals(student1, student2)); //True //因為Student中Equals方法被重寫了Console.WriteLine(Equals(student3, student4)); //False //因為Student2默認比較的是引用Console.WriteLine(ReferenceEquals(student1, student2)); //FalseConsole.WriteLine(ReferenceEquals(5, 5));Point point1 = new Point(1, 1); //測試結構體Point point2 = new Point(1, 1);Daily daily1 = Daily.Sleep; //測試枚舉Daily daily2 = Daily.Sleep;Console.WriteLine(ReferenceEquals(point1, point2)); //FalseConsole.WriteLine(Equals(point1, point2)); //TrueConsole.WriteLine(ReferenceEquals(daily1, daily2)); //FalseConsole.WriteLine(Equals(daily1, daily2)); //TrueType type = student1.GetType();Console.WriteLine(type.ToString()); //LearnObject.StudentStudent student5 = new Student("關羽",20, new Teacher("諸葛亮"));Student student6 = student5.ShallowClone();Console.WriteLine("修改前");Console.WriteLine($"學生5:{student5.name}的老師是{student5.teacher.name}"); //學生5:關羽的老師是諸葛亮Console.WriteLine($"學生6:{student6.name}的老師是{student6.teacher.name}"); //學生6:關羽的老師是諸葛亮student6.name = "劉備";student5.teacher.name = "龐士元";Console.WriteLine("學生6修改后");Console.WriteLine($"學生5:{student5.name}的老師是{student5.teacher.name}"); //學生5:關羽的老師是龐士元Console.WriteLine($"學生6:{student6.name}的老師是{student6.teacher.name}"); //學生6:劉備的老師是龐士元Student student7 = new Student();Student2 student8 = new Student2();Console.WriteLine(student7.GetHashCode()); //10086 Console.WriteLine(student8.GetHashCode()); //18643596Console.WriteLine(student7.ToString()); //自定義輸出,學生的名字:張飛,年齡:18Console.WriteLine(student8.ToString()); //LearnObject.Student2}}
}
6、參考資料:
- 《唐老獅C#》
本篇結束,感想您的閱閱閱閱閱閱閱閱閱讀~