当前位置: 首页 > news >正文

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替代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) { /* ... */ } }
http://www.jsqmd.com/news/1220107/

相关文章:

  • aiolimiter与其他限流库对比:为什么它是Python异步项目的最佳选择
  • 给大家普及一下,导师是怎么对你进行科研训练的?
  • 安徽各地普高志愿录取结果出炉未上岸?2026 合肥医药卫生学校 3+2、三年制招生详情 - 小张zc
  • 从二维到三维:ImageToSTL如何重新定义创意实现的边界
  • Google API Linter 源码解析:理解 Google API 规范检查工具架构
  • 栎偲财务管理系统:业财税银一体化建设实操
  • 2026年7月江诗丹顿中国区售后服务网络更新优化 全国60+门店地址及电话汇总 - 江诗丹顿中国服务中心
  • 2026萧邦售后维修保养全指南:正规维修流程、原厂服务标准与售后中心全公开 - 萧邦官方售后服务中心
  • 江诗丹顿中国官方售后服务中心|官方地址及客服电话全新公告(2026年7月最新) - 江诗丹顿中国服务中心
  • Formsmd开发指南:从源码构建到贡献代码的完整路径
  • 终极指南:如何为ESP32添加摄像头功能 - MicroPython摄像头驱动完整教程
  • 2026年7月江诗丹顿专业性服务及官方售后热线全解析 - 江诗丹顿中国服务中心
  • 硬件选型笔记|B1205XT-1WR3 适配优选 DB1-12S05XT,1W DC-DC 工业隔离电源模块参数规格全拆解
  • 如何用Zeroshot实现AI自主编码?executor-verifier循环全解析
  • iOS设备端IPA安装器:重新定义移动应用部署方式
  • 江诗丹顿中国官方售后中心2026年7月全新400客服热线启用通知 - 江诗丹顿中国服务中心
  • 洛阳黄金回收哪家强?这6家靠谱老店藏不住了!七区七县全覆盖,变现不踩坑 - 清奢黄金上门回收
  • 最新360手机刷机 360手机官方刷机教程100%成功 360奇酷手机线刷救砖教程
  • 3分钟搞定黑苹果EFI配置:OpCore Simplify终极自动化工具指南
  • 5分钟极速上手:fanbox-dl 一站式下载Pixiv FANBOX内容
  • 为什么你的Copilot响应迟滞?揭秘数据模型中被忽略的4类上下文衰减陷阱
  • 2026 安徽落榜初中生学医去哪?合肥医药卫生学校招生简章详细解读 - 小张zc
  • Kafka-Storm-Starter架构设计:如何实现可扩展的流处理系统
  • 猫抓Cat-Catch技术架构深度揭秘:浏览器资源嗅探扩展的4大核心技术实现原理
  • 手把手教你用逗脑IDE开发C/C++——从零开始跑通第一个程序
  • 【无人机通信】无人机通信控制神经符号人工智能(NSAI)框架MATLAB仿真代码
  • 2026年打工返乡寄电瓶车费用全解析:从运输逻辑到慧寄侠专线实测,帮你省下一半路费 - 快递物流资讯
  • 官方直营靠谱渠道!2026年7月北京宝珀官方售后维修网点电话、最新门店地址汇总 - 宝珀官方维修中心
  • 萧邦官方维保全指南:40 余家正规服务中心分布、预约流程与到店须知 - 萧邦官方售后服务中心
  • 放置游戏设计学习指南:4 本必读书、GDC 演讲与 30 天实践路线