C#.NET 中所有数据类型的基类是什么?

1. C#.NET 的数据类型

C#.NET 中的数据类型可以分为两大类:值类型和引用类型。

值类型包括八种基本类型:bool、byte、char、decimal、double、float、int 和 long,以及枚举类型和结构类型。

引用类型包括类类型、接口类型、委托类型、数组类型和字符串类型。

2. 所有数据类型的基类

C#.NET 中所有数据类型的基类是 System.Object 类。

每个数据类型都从此基类派生而来,这意味着它们都具有一些共同的成员和行为。

2.1 System.Object 类的成员

System.Object 类定义了一些常用的成员和方法,这些成员和方法可以被继承到所有的派生类型中。

其中一些成员是:

ToString(): 将当前对象转换为字符串表示。

GetType(): 获取当前对象的类型。

Equals(): 确定当前对象是否等于另一个对象。

GetHashCode(): 获取当前对象的哈希码。

2.2 值类型和引用类型的继承

所有值类型都从 System.ValueType 继承,System.ValueType 又从 System.Object 继承。

所有引用类型都从 System.Object 继承。

public struct Point

{

public int X;

public int Y;

}

public class MyClass

{

public static void Main()

{

Point pt = new Point();

Console.WriteLine(pt.ToString()); // "Point"

Console.WriteLine(pt.GetType()); // "Point"

Console.WriteLine(pt.GetHashCode()); // hash value of pt

Console.WriteLine(pt.Equals(null)); // return false

}

}

3. 结构类型的特殊行为

结构类型可以像类一样定义成员,包括字段和方法,但它们具有一些在语义上与类不同的行为。

3.1 结构类型的栈分配

结构类型的实例通常分配在栈上,而不是堆上。

当声明一个结构类型实例时,它是立即分配在栈上的。在方法返回之前,该实例保持在栈上。

public struct Point

{

public int X;

public int Y;

public void Offset(int deltaX, int deltaY)

{

X += deltaX;

Y += deltaY;

}

public override string ToString()

{

return $"({X}, {Y})";

}

}

public class MyClass

{

public static void Main()

{

Point pt = new Point();

pt.X = 12;

pt.Y = 13;

Console.WriteLine(pt.ToString()); // Output: (12, 13)

pt.Offset(2, 2);

Console.WriteLine(pt.ToString()); // Output: (14, 15)

}

}

3.2 结构类型的复制

当复制结构类型的实例时,复制的是值本身。

与类不同,在对结构类型进行赋值或传递参数时,实际上复制的是整个数据结构,而不是其引用。

public struct Point

{

public int X;

public int Y;

public override string ToString()

{

return $"({X}, {Y})";

}

}

public struct Size

{

public int Width;

public int Height;

public override string ToString()

{

return $"{Width}x{Height}";

}

}

public class MyClass

{

static void Main(string[] args)

{

Point p1 = new Point { X = 10, Y = 10 };

Point p2 = p1;

p2.X = 20;

Console.WriteLine(p1.ToString()); // Output: (10, 10)

Console.WriteLine(p2.ToString()); // Output: (20, 10)

Size s1 = new Size { Width = 100, Height = 100 };

Size s2 = s1;

s2.Width = 200;

Console.WriteLine(s1.ToString()); // Output: 100x100

Console.WriteLine(s2.ToString()); // Output: 200x100

}

}

3.3 结构类型的运算符重载

结构类型可以定义运算符重载。

public struct Point

{

public int X;

public int Y;

public static bool operator ==(Point a, Point b)

{

return a.X == b.X && a.Y == b.Y;

}

public static bool operator !=(Point a, Point b)

{

return !(a == b);

}

}

public class MyClass

{

static void Main(string[] args)

{

Point p1 = new Point { X = 10, Y = 10 };

Point p2 = new Point { X = 10, Y = 10 };

Console.WriteLine(p1 == p2); // Output: True

Console.WriteLine(p1 != p2); // Output: False

}

}

4. 引用类型的基类

所有引用类型都从 System.Object 继承,这些类型具有所有基础成员和方法。

public class Person

{

public string Name { get; set; }

public int Age { get; set; }

public override string ToString()

{

return $"{Name}, {Age}";

}

}

public class MyClass

{

static void Main(string[] args)

{

Person p1 = new Person { Name = "Tom", Age = 30 };

Person p2 = p1;

p2.Age++;

Console.WriteLine(p1.ToString()); // Output: Tom, 31

Console.WriteLine(p2.ToString()); // Output: Tom, 31

}

}

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签