在C#高级编程的学习过程中,对象和类型是最基础也最核心的组成部分,理解两者的特性与关联,是写出规范、高效C#代码的前提。不同类型的特性决定了对象的存储方式、生命周期和使用规则,掌握这些内容能避免很多常见的编程错误。

C#类型的核心分类
C#中的类型主要分为值类型和引用类型两大类,两者的存储方式和赋值逻辑有本质区别。
- 值类型:直接存储数据本身,包括所有数值类型、bool类型、char类型、枚举、结构体等,存储在栈内存中,赋值时直接复制数据副本。
- 引用类型:存储的是指向堆内存中数据的引用地址,包括类、接口、数组、字符串、委托等,赋值时复制的是引用地址,多个变量可能指向同一个对象实例。
值类型与引用类型的对比
| 对比维度 | 值类型 | 引用类型 |
|---|---|---|
| 存储位置 | 栈内存 | 堆内存(引用地址存在栈中) |
| 赋值行为 | 复制数据副本 | 复制引用地址 |
| 默认值 | 零值(如0、false) | null |
| 继承特性 | 隐式继承ValueType | 隐式继承Object |
对象的创建与构造函数
对象是类型的实例,创建对象的过程本质是分配内存并初始化实例的过程,构造函数是完成这个初始化的核心方法。
默认构造函数与自定义构造函数
如果类中没有定义任何构造函数,C#会自动生成一个无参的默认构造函数,一旦定义了任意构造函数,默认构造函数就不会自动生成。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 自定义无参构造函数
public Person()
{
Name = "未知";
Age = 0;
}
// 自定义带参构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
// 使用构造函数创建对象
Person p1 = new Person(); // 调用无参构造函数
Person p2 = new Person("张三", 20); // 调用带参构造函数对象初始化器
除了使用构造函数,还可以通过对象初始化器在创建对象时直接赋值属性,这种方式不需要额外定义对应参数的构造函数。
Person p3 = new Person
{
Name = "李四",
Age = 25
};类型的常用高级特性
静态类型与静态成员
静态类型不能被实例化,所有成员都是静态的,比如Math类就是典型的静态类型。静态成员属于类型本身,而不是某个对象实例,所有实例共享同一个静态成员。
public static class Utils
{
// 静态字段
public static int Count = 0;
// 静态方法
public static void AddCount()
{
Count++;
}
}
// 调用静态成员,不需要创建实例
Utils.AddCount();
Console.WriteLine(Utils.Count); // 输出1只读字段与常量
常量是编译时确定的不可变值,用const修饰,必须初始化且不能修改。只读字段用readonly修饰,可以在构造函数中赋值,之后不可修改,比常量更灵活。
public class Config
{
// 常量,编译时确定
public const string AppName = "测试应用";
// 只读字段,运行时可在构造函数赋值
public readonly string Version;
public Config(string version)
{
Version = version;
}
}嵌套类型
在类或结构内部定义的类型称为嵌套类型,嵌套类型可以访问外部类型的私有成员,常用于封装只和外部类型相关的辅助类型。
public class OuterClass
{
private int outerValue = 10;
// 嵌套类
public class InnerClass
{
public void PrintOuterValue(OuterClass outer)
{
// 可以访问外部类的私有成员
Console.WriteLine(outer.outerValue);
}
}
}对象的生命周期与垃圾回收
引用类型的对象存储在堆中,当对象不再被任何变量引用时,就会成为垃圾回收的目标。C#的垃圾回收器会自动管理堆内存,不需要手动释放对象,但可以通过Dispose方法释放非托管资源。
如果类型使用了非托管资源(如文件句柄、数据库连接),建议实现IDisposable接口,在使用完后调用Dispose方法,或者使用using语句自动释放。
public class FileHandler : IDisposable
{
private FileStream _fileStream;
public FileHandler(string path)
{
_fileStream = new FileStream(path, FileMode.Open);
}
public void Dispose()
{
_fileStream?.Close();
_fileStream?.Dispose();
}
}
// 使用using语句自动释放资源
using (FileHandler handler = new FileHandler("test.txt"))
{
// 操作文件
}掌握C#中对象和类型的这些核心特性,能帮助你更清晰地设计类结构,合理选择类型分类,避免内存使用不当的问题,写出更符合C#设计规范的代码。