C#属性和构造方法与析构方法

📅 2026/7/19 13:37:34
C#属性和构造方法与析构方法
属性在C#中属性是类、结构或接口中的一种特殊的成员他提供了灵活的机制来读取、写入或计算私有字段的值。属性就是面向对象封装原则的体现。属性内部包含get和set访问器来实现对后备字段的逻辑。class Person { int _age; public int Age { get { return _age; } set { if(value 130) { throw new ArgumentException(); } } } }通常set中写一些保护后备字段的逻辑。也有自动实现的版本由编译器自动生成隐藏的私有字段的。public class Person { public string Name { get; set; } // 可读可写 public int Age { get; set; } }若是想要保护后备字段还是使用自动实现的set不是起不到作用吗可以将set私有化这样在类外就没有办更改这个后备字段了。public class Person { public string Name { get; private set; } // 类外只可读类内才可写 public int Age { get; private set; } }要是也不想在类内被改写也可以用init替代setinit是只能在对象初始化的时候赋值一旦对象构造完成就变成只读的。public class Person { public string Name { get; init; } // 只有初始化的时候才可以赋值 public int Age { get; set; } }构造方法构造方法是创建对象时自动调用的特殊方法用于初始化对象状态在没有写构造方法的时候编译器默认提供一个无参的构造方法。构造方法方法名与类名完全相同没有返回值在创建对象时触发可以重载。public class Person { // 字段 private string _name; private int _age; // 构造函数无参数 public Person() { _name 未知; _age 0; Console.WriteLine(对象已创建); } // 构造函数带参数 public Person(string name, int age) { _name name; _age age; } // 构造函数仅姓名 public Person(string name) { _name name; _age 18; // 默认年龄 } } // 使用 Person p1 new Person(); // 调用无参构造 Person p2 new Person(张三); // 调用一个参数 Person p3 new Person(李四, 25); // 调用两个参数子类可以通过base调用父类的构造方法。public class Animal { public string Name { get; } public Animal(string name) { Name name; Console.WriteLine($Animal 构造函数: {name}); } } public class Dog : Animal { public string Breed { get; } public Dog(string name, string breed) : base(name) // 调用父类构造函数 { Breed breed; Console.WriteLine($Dog 构造函数: {name}, {breed}); } } // 使用 Dog dog new Dog(旺财, 金毛); // 输出 // Animal 构造函数: 旺财 // Dog 构造函数: 旺财, 金毛静态构造函数不能有访问修饰符不能有参数无法手动调用只会在第一次使用类时自动调用一个类只能有一个静态构造函数。public class Configuration { public static string AppName { get; } public static int MaxConnections { get; } // 静态构造函数无参数、无访问修饰符 static Configuration() { AppName MyApplication; MaxConnections 100; Console.WriteLine(静态构造函数执行了一次); } // 实例构造函数不影响静态构造 public Configuration() { Console.WriteLine(实例构造函数); } } // 使用 Console.WriteLine(Configuration.AppName); // 触发静态构造函数 Config c1 new Configuration(); // 不会再次触发静态构造 Config c2 new Configuration(); // 静态构造函数只输出一次私有构造函数防止外部直接创建对象常用于单例模式或工具类。public class Singleton { private static Singleton _instance; // 私有构造函数外部无法使用 new private Singleton() { } // 全局访问点 public static Singleton Instance { get { if (_instance null) _instance new Singleton(); return _instance; } } } // 使用 Singleton s1 Singleton.Instance; Singleton s2 Singleton.Instance; Console.WriteLine(s1 s2); // True同一个实例析构方法析构方法是对象被垃圾回收GC前自动调用的特殊方法用于释放非托管资源比如越过C#直接向操作系统申请了一块内存这块内存只能程序员手动释放编译器不去管理。得益于C#强大的垃圾回收机制析构方法并不常用。public class ResourceHandler { private IntPtr _handle; // 非托管资源句柄 public ResourceHandler() { // 分配非托管资源 _handle AllocateResource(); Console.WriteLine(资源已分配); } // 析构函数 ~ResourceHandler() { // 释放非托管资源 if (_handle ! IntPtr.Zero) { FreeResource(_handle); _handle IntPtr.Zero; Console.WriteLine(资源已释放); } } private IntPtr AllocateResource() { /* ... */ return IntPtr.Zero; } private void FreeResource(IntPtr handle) { /* ... */ } }