C#属性和构造方法与析构方法
📅 2026/7/19 13:59:17
👁️ 阅读次数
📝 编程学习
属性
在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替代set,init是只能在对象初始化的时候赋值,一旦对象构造完成,就变成只读的。
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) { /* ... */ } }
编程学习
技术分享
实战经验