密封类 - 断子绝孙类


  密封类:断子绝孙类
  如果我们的类是密封类,那么就意味着不能有任何派生类。但是密封类是可以拥有父类的
  
  C#中密封类使用
sealed关键字,sealed可以将类或者方法声明为密封类或者密封方法。
  对于密封类来说,表示不能继承该类
  对于密封方法来说,表示不能重写该方法
  
  密封类不能使用protected
  密封类不能使用virtual
  密封类的不可继承性,所以密封类不能声明为抽象,即sealed关键字不能和abstract共同使用
  
  如果用sealed修饰方法,必须要遵循一个条件,这个类必须有父类,并且重写了父类的某个虚方法才可以用sealed修饰,否则是绝对不行的
  
  密封类的作用就是防止外界修改本类,破坏类的内部构造


using System;

namespace OOP密封类
{
	//密封类不能使用virtual (下面的运行是错的)
//	sealed class Person{
//		public virtual void SayHi(){
//			Console.WriteLine ("111");
//		}
//	}

	class MainClass
	{
		public static void Main (string[] args)
		{
			Console.WriteLine ("Hello World!");
		}
	}
}


<think>嗯,用户现在问的是LVGL框架中lv_obj_del和lv_obj_clean的区别。这个问题其实挺专业的,说明用户正在深入使用LVGL做界面开发。用户之前问过如何清除父对象的子对象,当时我重点介绍了lv_obj_clean的用法,现在他应该想更系统地区分这两个关键API。用户可能正在开发需要动态更新界面的应用,比如仪表盘或者智能家居控制面板。这场景下经常需要创建和销毁UI元素,如果混淆这两个函数可能会导致内存泄漏或者程序崩溃。从用户两次提问的连贯性看,ta应该是有一定LVGL基础的开发者。让我仔细对比这两个函数:lv_obj_del就像“斩草除根”,不仅删除对象本身,还会递归删除所有子对象和关联资源。而lv_obj_clean是“断子绝孙”,只清理当前对象的直接子代,自己还留着。这个区别在父子对象嵌套时特别关键——比如用户删除了某个带子控件的按钮,用错函数整个界面可能就崩了。需要强调内存管理问题,因为LVGL在嵌入式环境运行,资源很宝贵。用户提供的引用[3]提到过要手动终止进程,说明ta的环境资源受限。还要提醒用户注意事件监听器的处理差异,这是容易踩坑的点。最后给出典型使用场景对比表会更直观。对了,用户之前给的引用[1]是程序启动模板,引用[2][4]更像是调试命令,和当前问题关系不大,但引用[3]的资源管理提醒值得呼应。</think> 在 LVGL 框架中,`lv_obj_del()` 和 `lv_obj_clean()` 是两个关键的内存管理函数,其核心区别在于操作对象的**作用范围和资源释放逻辑**。以下是详细对比: --- ### 1. **`lv_obj_del(obj)`:删除对象及其子对象** **作用**: - 删除对象 **`obj` 自身**以及其**所有子对象**(递归删除) - 释放对象内存及关联资源(样式、事件监听器等) - 自动解除父子关系 **语法**: ```c void lv_obj_del(lv_obj_t * obj); // 删除对象自身及所有子对象 ``` **示例**: ```c lv_obj_t *parent = lv_obj_create(lv_scr_act()); // 创建父对象 lv_obj_t *child = lv_btn_create(parent); // 创建子按钮 lv_obj_del(parent); // 删除父对象时,子按钮也会被自动删除 ``` **适用场景**: 需彻底销毁整个 UI 组件(如关闭弹窗、切换界面时释放旧页面)。 --- ### 2. **`lv_obj_clean(obj)`:仅删除子对象** **作用**: - 仅删除 **`obj` 的所有直接子对象** - **不删除 `obj` 自身** - 保留父对象样式/事件监听器,内存占用不变 **语法**: ```c void lv_obj_clean(lv_obj_t * obj); // 仅清空子对象 ``` **示例**: ```c lv_obj_t *list = lv_list_create(lv_scr_act()); lv_list_add_btn(list, NULL, "Item 1"); lv_list_add_btn(list, NULL, "Item 2"); lv_obj_clean(list); // 删除列表内所有按钮,但列表容器保留 ``` **适用场景**: 动态刷新容器内容(如清空列表再重新填充数据)。 --- ### 3. **关键区别总结** | **特性** | **`lv_obj_del()`** | **`lv_obj_clean()`** | |------------------------|----------------------------|----------------------------| | **删除对象自身** | ✅ | ❌ | | **删除所有子对象** | ✅ (递归删除) | ✅ (仅直接子对象) | | **父对象内存释放** | ✅ | ❌ | | **适用场景** | 销毁整个组件 | 刷新容器内容 | --- ### 4. **内存管理注意事项** 1. **悬挂指针风险** ```c lv_obj_del(parent); // 删除父对象 lv_obj_set_size(child); // 错误!child已被递归删除 ``` 调用 `lv_obj_del()` 后需置空指针避免野指针访问[^3]。 2. **性能影响** 频繁调用 `lv_obj_del()` 可能导致内存碎片。推荐复用对象或结合 `lv_obj_clean()` 减少开销[^4]。 3. **事件监听器处理** 二者均会**自动移除关联事件**,无需手动解绑。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值