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
}
}