自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1109)
  • 资源 (70)
  • 收藏
  • 关注

原创 优雅驾驭Python运算符重载:平衡灵活性与安全的艺术

运算符重载的终极价值在于:让用户定义的类型如内置类型般自然运作。严控边界、坚守契约,方能在灵活性与安全性间找到完美平衡点。技术延伸:当你实现__add__后,务必同步实现__radd__(右加)和__iadd__(就地加),才能完整支持v = 5 + vector和vector += other等场景。

2025-06-16 08:29:40 212

原创 Python 正确重载运算符(运算符重载基础)

使用得当,API 会变得好用,代码会变得易于阅读。Python 施加了一些。=、>、<、>=、<=)是特例,因此我们首先将在 Vector 中重。载四个算术运算符:一元运算符 - 和 +,以及中缀运算符 + 和 *。在某些圈子中,运算符重载的名声并不好。这个语言特性可能(已经)被滥用,让程序员困惑,导致缺陷和意料之外的性能瓶颈。第 10 章已经为 Vector 定义了一个中缀运算符,即。先从最简单的入手:一元运算符。

2025-06-16 08:29:06 30

原创 深入理解C#枚举:从基础到高级应用

静态优势:优先直接访问枚举成员,无需创建实例。类型安全:禁止跨枚举比较,利用编译器检查提升代码健壮性。动态处理:使用 Enum 类方法实现枚举值与字符串的灵活转换。

2025-06-16 08:28:30 76

原创 C# 枚举(关于枚举的更多内容)

如果对前面代码中的TrafficLight和Console类都使用usingstatic指令,则代码将更简。枚举是一个独特的类型。比较不同枚举类型的成员会导致编译时错误。明了两个枚举类型,它们具有完全相同的结构和成员名。枚举只有单一的成员类型:声明的成员常量。

2025-06-16 08:27:58 72

原创 Django 混入(Mixin)的魔力:多重继承如何拯救代码复用?

Django 的 Mixin 不是语法糖,而是对 关注点分离 的极致实践。它教会我们:当代码需要复用却无法垂直切割时,水平切分 是破局之道。2025 年,尽管函数式编程复兴,但类视图的混入设计仍在 Django 4.x 中活跃,成为解决代码复用的经典范式。掌握它,你收获的不仅是 Django 技能,更是架构思维的跃迁。

2025-06-15 16:22:04 285

原创 Python 继承的优缺点(一个现代示例:Django通用视图中 的混入)

给 TemplateView,经继承的 View.dispatch 方法检查,它没有 post。图中,位于顶部的两个类,View 和 TemplateResponseMixin,负责。对 Django 用户来说,在图 12-5 中,最重要的类是 ListView。与 Tkinter 相比,Django 基于类的视图 API 是多重继承更好的示例。在 Django 中,视图是可调用的对象,它的参数是表示 HTTP 请求的对。只继承 View,可以看到,它实现了 get、head、post 等方法。

2025-06-15 16:21:14 310

原创 深入解析C#枚举:位标志的妙用与实战技巧

位标志是一种利用单个整数的不同位来表示多个开关状态的技巧。每个位代表一个特定的标志(如启用动画、使用大图等),通过位运算可以高效组合和检查这些状态。// 传统方法:使用多个布尔变量// 位标志方法:单个变量管理所有状态确定标志数量:根据需求确定需要多少标志选择合适类型:选择足够位数的无符号整数类型(uint、ulong等)为每个位命名:每个标志对应一个位位置使用Flags特性:虽然不是必须,但强烈推荐[Flags]SingleDeck = 0x01, // 位0:0001。

2025-06-15 16:20:37 441

原创 C# 枚举(位标志)

程序员们长期使用单个字(singleword)的不同位作为表示一组开/关标志的紧凑方法。本节将其称为标志字(flagword)。枚举提供了实现它的简便方法。一般的步骤如下。(1)确定需要多少个位标志,并选择一种有足够多位的无符号类型来保存它。(2)确定每个位位置代表什么,并给它们一个名称。声明一个选中的整数类型的枚举,每个成员由一个位位置表示。(3)使用按位或(0R)运算符在持有该位标志的字中设置适当的位。(4)使用按位与(AND)运算符或HasFlag方法检查是否设置了特定位标志。

2025-06-15 16:20:03 541

原创 Python多重继承最佳实践:避免设计陷阱的8个关键原则

class DataLoader(ABC): # 现代Python推荐写法实践反模式接口继承用抽象基类非抽象父类代码复用用Mixin后缀类无名混入类聚合类封装复杂继承多层具体类继承委托模式替代继承深度继承树尽管Tkinter存在设计缺陷,但其稳定性和Canvas/Text组件的强大功能仍值得学习。现代开发应遵循上述原则,让多重继承成为利器而非枷锁。

2025-06-14 19:54:29 263

原创 Python 继承的优缺点(处理多重继承)

如 Alan Kay 所言,继承有很多用途,而多重继承增加了可选方案和复杂度。使用多重继承容易得出令人费解和脆弱的设计。我们还没有完整的理论,下面是避免把类图搅乱的一些建议。

2025-06-14 19:53:44 605

原创 掌握C#枚举:从交通灯看懂状态管理

enum Light : byte { Off, Low, High } // 底层byte类型优势应用场景语义化状态标识状态机(订单/工作流)类型安全校验替代魔法数字(错误代码)智能提示支持开发效率提升内存占用优化嵌入式/高性能场景✨最佳实践:优先使用枚举替代整数常量,让代码获得"自解释"的超能力!

2025-06-14 19:52:53 270

原创 C# 枚 举(枚举)

枚举是由程序员定义的类型,与类或结构一样。每个枚举类型都有一个底层整数类型,默认为int。例如,在TrafficLight类型中,编译器把int值0、1和2分别赋值给成员Green、Yellow和Red。在下面代码的输出中,把它们转换成类型int,可以看到底层的成员值。图12-1阐明了它们在栈中的排列。t1intt1t2intt2t3intt3可以把枚举值赋给枚举类型变量。例如,下面的代码展示了3个TrafficLight类型变量的声明。

2025-06-14 19:52:15 327

原创 C#结构体性能暴击指南:从内存陷阱到零损耗实战

结构体默认构造函数不可显式定义,字段初始化依赖构造函数逻辑。:静态成员可初始化。

2025-06-13 08:26:16 301

原创 C# 结构(属性和字段初始化语句和结构是密封的)

在声明结构体时,不允许使用实例属性和字段初始化语句,如下所示。但是,结构体的静态属性和静态字段都可以在声明结构体时进行初始化,即使结构体本身不是静态的。

2025-06-13 08:25:45 346

原创 多重继承的真实力量:从设计模式到Tkinter实践

多重继承如精密手术刀——在适配器模式、抽象基类等场景下精准高效,但Tkinter的教训表明:“如无必要,勿增继承”。现代开发更倾向组合模式(Composition)与协议类(Protocols),通过has-a替代is-a关系,降低系统熵增。正如Python之禅所言:“扁平优于嵌套,简洁胜于复杂”——多重继承的智慧,在于克制与精准的艺术。

2025-06-13 08:24:57 804

原创 Python 继承的优缺点(多重继承的真实应用)

子包中还有一些,https://docs.python.org/3/library/tkinter.ttk.html)。口,https://docs.python.org/3/library/tkinter.html)把多重继承用到了极。在 Python 标准库中,最常使用多重继承的是 collections.abc 包。这几个类的方法解析顺序如下,这些输出使用示例 12-8 中定义的。多重继承能发挥积极作用。一书中的适配器模式用的就是多重继承,因此使用多重继承肯定没有错。

2025-06-13 08:24:17 384

原创 多重继承和方法解析顺序:Python中的应用与思考

在《设计模式》相关的编程领域中,多重继承是一个重要概念,以下将详细探讨其作用以及关于它对错的争议。

2025-06-12 08:30:28 455

原创 Python 继承的优缺点(多重继承和方法解析顺序)

子包中还有一些,https://docs.python.org/3/library/tkinter.ttk.html)。口,https://docs.python.org/3/library/tkinter.html)把多重继承用到了极。在 Python 标准库中,最常使用多重继承的是 collections.abc 包。(那本书中的其他 22 个设计模式都使用单继承,因此多重继承显然不。一书中的适配器模式用的就是多重继承,因此使用多重继承肯定没有错。口声明,只不过它可以提供具体方法的实现。

2025-06-12 08:29:55 285

原创 深入解析结构的构造函数和析构函数

结构可以有实例构造函数和静态构造函数,但不允许有析构函数。这种特性与类有所不同,在编程时需要特别注意。

2025-06-12 08:29:01 377

原创 C# 结构(构造函数和析构函数)

结构可以有实例构造函数和静态构造函数,但不允许有析构函数。

2025-06-12 08:27:45 475

原创 Python内置类型子类化的陷阱与解决方案

内置类型(dict/list/str)永远不是理想基类。

2025-06-11 08:24:23 409

原创 Python 继承的优缺点(子类化内置类型很麻烦)

(http://docs.python.org/3/library/collections.html)中的类,例如。如果不子类化 dict,而是子类化 collections.UserDict,示例 12-1。UserDict、UserList 和 UserString,这些类做了特殊设计,因。内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。实例(self)所属的类开始搜索方法,即使在超类实现的类中调用也是。综上,本节所述的问题只发生在 C 语言实现的内置类型内部的方法委托。

2025-06-11 08:23:38 705

原创 赋值操作的惊天秘密:C#中结构体(struct)与类(class)的本质差异

结构体是值的副本,类是对象的影子”理解赋值背后的内存机制,能避免90%的隐蔽bug:修改类实例 → 影响所有引用者修改结构体 → 仅当前副本有效关键决策点:是否需要数据独立性?是否需要继承体系?内存敏感度如何?📚 拓展思考:C# 9.0引入的record类型如何融合两者特性?欢迎在评论区讨论!

2025-06-11 08:23:04 295

原创 C# 结构(对结构赋值)

图11-2展示了类变量赋值和结构变量赋值之间的区别。注意,在类赋值之后,cs2和cs1指。把一个结构赋值给另一个结构,就是将一个结构的值复制给另一个结构。但在结构赋值之后,ss2的成员的值和ss1的相同。同,复制类变量时只复制引用。

2025-06-11 08:22:25 266

原创 Python 抽象基类中的 subclasshook 方法解析

方法为 Python 抽象基类识别虚拟子类提供了便利,但在自定义抽象基类时,要谨慎使用该方法,优先考虑继承和注册的方式来保证代码的可靠性。

2025-06-10 08:29:53 863

原创 Python 接口:从协议到抽象基 类(鹅的行为有可能像鸭子)

论),Struggle 是 abc.Sized 的子类,这是因为 abc.Sized 实现了。然,OrderedDict 除外,它保留了插入元素的顺序,但是不支持通过。Alex 在他写的“水禽和抽象基类”一文中指出,即便不注册,抽象基类也。下面是他举的例子,我添加了一些代码,,但是不应该把它们视作 Sequence 的子类型,因为不能。方法,而 Sized 只声明了一个特殊方法,因此只。

2025-06-10 08:29:23 635

原创 深入解析C#中的结构:特点与内存安排

结构是程序员自定义的数据类型,和类类似,它也有数据成员和函数成员。类型本质不同:类是引用类型,而结构是值类型。继承特性差异:结构是隐式密封的,这就意味着无法从结构派生出其他结构。声明结构的语法和声明类很相似。下面是一个声明名为Point的结构的示例代码:firstX} }firstY");

2025-06-10 08:28:43 708

原创 C# 结构(什么是结构和结构是值类型)

结构是程序员定义的数据类型,与类非常类似。它们有数据成员和函数成员。虽然与类相似,但是结构有许多重要的区别。例如,下面的代码声明了一个名为Point的结构。它有两个公有字段,名称为x和Y。在Main中,声明了3个Point结构类型的变量,并对它们进行赋值和打印。

2025-06-10 08:28:07 259

原创 Python抽象基类注册机制解析:优雅实现接口兼容的艺术

🔌 对于内置类型:是扩展接口兼容性的唯一通道📡 对于系统集成:实现无侵入的接口标准化⚖️ 对于语言设计:体现Python"实用胜于纯粹"的哲学正如Python之禅所言:"如果实现很难解释,那是个坏主意;如果实现容易解释,那可能是个好主意"注册机制正是这样一个简单而强大的解决方案,让Python的类型系统既保持动态活力,又具备工程可靠性。

2025-06-09 10:37:52 253

原创 Python 接口:从协议到抽象基 类(Python使用register的方式)

(https://hg.python.org/cpython/file/3.4/Lib/_collections_abc.py),是这样。(https://hg.python.org/cpython/file/3.4/Lib/_collections_abc.py)中注册为。虽然现在可以把 register 当作装饰器使用了,但更常见的做法还是把。前的版本中不能这样使用 register,必须在定义类之后像普通函数那。这些类型在导入模块时注册,这样做是可以的,它当作函数使用,用于注册其他地方定义的类。

2025-06-09 10:36:49 250

原创 深入解析C#表达式求值:优先级、结合性与括号的魔法

— 为什么2/6*4不等于1/12?

2025-06-09 10:35:52 457

原创 C# 表达式和运算符(求值顺序)

表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生变化。例如,已知表达式3*5+2,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。

2025-06-09 10:35:13 374

原创 一文掌握 Tombola 抽象基类的自动化子类测试策略

通过和 _abc_registry 的内省机制,配合 doctest 的灵活运用,我们构建了可自动检测所有 Tombola 实现的测试框架。这种模式不仅适用于抽象基类测试,还可扩展至:插件系统接口验证API 多实现兼容性测试接口版本迁移验证测试框架代码量不足 50 行,却实现了对抽象接口规范的自动化守卫,充分展现了 Python 元编程和内省机制的强大威力。

2025-06-08 20:44:13 875

原创 Python 接口:从协议到抽象基 类(Tombola子类的测试方法)

下一节说明 Python 如何使。测试脚本的代码在示例 11-15 中,doctest 在示例 11-16 中。我编写的 Tombola 示例测试脚本用到两个类属性,用它们内省类的继。❶ 导入包含 Tombola 真实子类和虚拟子类的模块,用于测试。码中用不到想测试的模块,也要将其导入,因为要把那些类载入内存。❻ 输出测试结果,包含类的名称、尝试运行的测试数量、失败的测试。为了测试 Tombola 的所有子类,我编写的脚本迭代。这个方法返回类的直接子类列表,不含虚拟子类。返回的列表是内存中存在的直接子代。

2025-06-08 20:43:42 279

原创 深入解析C#表达式与字面量:编程基石全掌握

表达式是构建代码逻辑的砖瓦,字面量则是浇筑砖瓦的水泥—— 精准理解二者,是编写高效C#代码的核心前提。

2025-06-08 20:42:55 241

原创 C# 表达式和运算符(表达式和字面量)

本章将定义表达式,并描述C#提供的运算符,还将解释如何定义C#运算符以使用用户定义的类。运算符是一个符号,它表示返回单个结果的操作。操作数(operand)是指作为运算符输入的数据元素。表达式是运算符和操作数的宇符串。C#运算符有一个、两个或三个操作数。可以作为操作数可以使用运算符组合表达式以创建更复杂的表达式,如下面的表达式所示,它有3个运算符和4个操作数。表达式求值()是将每个运算符以适当的顺序应用到它的操作数以产生一个值的过程。

2025-06-08 20:42:23 1090

原创 Python抽象基类实战:构建广告轮播框架ADAM的核心逻辑

技术点解决的问题实际收益抽象方法强制子类实现核心逻辑防止漏写关键方法具体方法默认实现提供基础功能模板减少重复代码,允许子类优化虚拟子类整合第三方类/系统内置类到统一接口增强框架扩展性异常层次设计统一错误处理机制提高实现类互换性抽象基类的本质:通过规范化接口,在多人协作/长期维护的项目中建立可靠契约,使代码既灵活又可验证。

2025-06-07 21:24:29 496

原创 Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)

定义好 Tombola 抽象基类之后,我们要开发两个具体子类,满足Tombola 规定的接口。这两个子类的类图如图 11-4 所示,图中还有将在下一节讨论的虚拟子类。示例 11-12 中的 BingoCage 类是在示例 5-8 的基础上修改的,使用了更好的随机发生器。BingoCage 实现了所需的抽象方法 load 和 pick,从 Tombola 中继承了 loaded 方法,覆盖了 inspect 方法,还增加了__call__方法。

2025-06-07 21:23:47 1114

原创 一文掌握C#扩展方法:打破类边界的神器

扩展方法本质是编译器魔法,编译后会被还原为静态方法调用(可通过ILSpy验证)

2025-06-07 21:23:00 313

原创 C# 类和继承(扩展方法)

在迄今为止的内容中,你看到的每个方法都和声明它的类关联。扩展方法特性扩展了这个边界,允许编写的方法和声明它的类之外的类关联。想知道如何使用这个特性,请看下面的代码。它包含类MyData,该类存储3个double类型的值,并含有一个构造函数和一个名为Sum的方法,该方法返回3个存储值的和。在现实世界的开发中,扩展方法是一个特别有用的工具。事实上,几乎整个LINQ库都是通过扩展方法来实现的。这是一个非常有限的类,但假设它还含有另外一个方法会更有用,该方法返回3个数据的平均值。

2025-06-07 21:21:56 1390 1

PopuoWindowToRemind.rar

主窗体中有一个Button控件,通过控件控制子窗体的弹窗。

2021-01-28

LoadTheDisplayBarDynamically.rar

动态显示条纹加载,利用ProgressBar实现,通过button按钮控制。

2021-01-27

GetsTheClipboardImage.rar

通过读取图片使用button按钮实现对图片进行复制粘贴,利用imageList控件加载图像,每读取一张图通过操作均可复制。

2021-01-27

TossDisplayForm.rar

折叠显示窗体:一个主窗体一个子窗体,通过主窗体料两个Button控件实现控件显示子窗体,子窗体利用Picturebox控件设置新的关闭按钮图标。

2021-01-26

FilePathCopy.rar

拖拽文件复制文件:代码中利用Panel、listView、folderBrowserDialog1、button控件,将要复制的文件拖拽至ListView中点击复制按钮便可复制,支持的复制文件格式较少还有待完善代码。

2021-01-27

MouseThroughForm.rar

鼠标穿透穿透:contextMenuStrip、notifyIcon控件实现通过右击右下角右击鼠标选择不同类似实现变换。

2021-01-26

TheMouseThrough.rar

鼠标穿透:代码中利用日历控件、timer控件、菜单控件等实现鼠标穿透。

2021-01-25

HiddenToolbox.rar

隐藏工具:利用panel、picturebox、timer控件实现对工具的隐藏

2021-01-25

GetFileType.rar

显示文件类型,代码中利用listview控件及Form事件shown来实现。

2021-01-25

CustomMaximizeMinizeButton.rar

自定义最大化最小化,代码中利用picturebox、Panel控件实现对窗体的最大化或最小化。

2021-01-25

GetTheFileDirectory.rar

将文件夹拖拽至窗体内弹出对话框显示文件夹路径。

2021-01-25

CustomScreenSaver.rar

自定义屏幕保护:利用panel、button、Label、timer控件实现屏幕保护。

2021-01-24

FormFloatHiding.rar

窗体的浮动及隐藏:通过Panel、timer控件并加载Panel的鼠标事件实现。

2021-01-24

窗体换肤三种换肤模式.rar

通过鼠标右击选择换肤类型,代码中利用Panel、Picturebox、MenuStrip等控件。

2021-01-24

MagneticForm.rar

磁性窗体:本代码中三个窗体一个主窗体两个辅窗体,通过相应代码实现Button控件关闭或者打开另外两个窗体并与主窗体近邻在一起。

2021-01-23

DynamicallyDisplayMenusWithTreeLists.rar

1、树型动态显示列表,利用控件MenuStrip、toolStrip、treeView、panel、picturebox控件、值得下载学习。

2021-01-22

FocusChangeColor.rar

焦点变色:利用Label、TextBox控件,textBox控件中的Enter、Leave、KeyDown事件当光标在textBox中时颜色由白色变为蓝色。

2021-01-22

ResizeForm.rar

1、代码中利用Panel、PictureBox控件; 2、通过利用上述控件来改变窗体的大小;

2021-01-21

BorderLessForm.rar

1、利用Panel、Picturebox控件设置相关属性并添加相应代码实现无边框窗体

2021-01-21

ScroolCaption.rar

代码中利用listBox、timer控件实现字幕的滚动。

2021-01-21

C# 指定时间可具体到某个时间对日志文件进行删除

通过判断文件创建时间大于指定创建文件天数就删除文件,有两种方式一种是用timer控件在一段时间内进行执行,另一种方式是在每天凌晨执行一次,对大元指定天数的进行删除,详见代码。

2023-11-22

C# WinForm 读取多张图片、缩放、平移,缩放后可恢复原图

功能:① 打开文件夹读取多张通过上一张、下一张显示图片;④ 鼠标滚轮实现图片缩放平移,右击鼠标点击“原始图像实现原图显示;

2022-11-05

C# textbox输入数字,也可以软键盘输入

1、支持手动输入数字键盘,软键盘输入也可以; 2、支持输入上次记录显示; 3、可以根据需求选择数字,一键生产数字; 4、Textbox Combox Button Panel 构成;

2022-10-12

C# button textbox 控件实现功能输入数字

C# button textbox 控件实现功能: ① 可以硬件键盘输入数字也可以C#编写的软件键盘输入数字; ② 软键盘仅支持;

2022-10-07

CPUMemoryUsage.rar

CPU物理内存使用率。

2021-02-04

TheCameraImaging.rar

通过AForge调用笔记本电脑摄像头,利用toolstrip实现控制打开视频关闭视频等功能。

2021-02-18

PictureAutoPlay.rar

图片自动播放,主窗体中负责对相关功能进行设置,子窗体中负责对显示所打开文件夹的图片按照一定的时间进行显示。

2021-02-04

StoneClock.rar

石英时钟。

2021-02-04

ScreenCapture.rar

屏幕截图:通过控制保存屏幕以实现截图的效果。

2021-02-04

ImageThumbnail.rar

图片缩略图:利用folderBrowserDialog1、imageList1、statusStrip1、toolStrip1、Panel控件实现对打开图片文件夹并读取文件夹中的图片按照一定比例进行显示。

2021-02-03

ChineseValidateCode.rar

中文验证码:通过随机产生四个中文汉字并通过picturebox控件显示出来,在textbox控件中输入并验证,button两个控件一共用来刷新生成的字符,一个用来在textbox中输入后点击确定。

2021-01-30

ImageSynthesis.rar

读取两个图片并将两张图片合在一起。

2021-01-31

DrawTextOnThePicture.rar

读取图片通过在textbox控件上输入相关文字后在读取的图片上绘制相应的文字。

2021-01-31

CompressImages.rar

压缩图片:利用相关控件对图片进行批量或者单个按高清比例缩放。

2021-01-31

MusicPlayer.rar

简单的播放MP3格式的音乐播放器。

2021-01-30

FileSizeProgress.rar

根据复制文件大小显示精度条,代码中利用控件:textBox、button、folderBrowserDialog1、openFileDialog1实现对文件的复制。

2021-01-29

ListViewFlash.rar

去闪烁,其实是利用两个控件进行对比:ListView、Panel控件来实现对数据的添加,一个存在闪烁一个不存在闪烁。

2021-01-30

APopoverShowsProgress.rar

复制文件夹,通过主窗体的两个textBox控件以及三个button按钮、folderBrowserDialog1控件,复制文件子窗体弹出进度条。

2021-01-29

CalipersRichTextBox.rar

自定义卡尺控件并调用,利用RichTextBox控件自定义属性后显示刻度,刻度模式为厘米或毫米。

2021-01-29

CopyDataGridDataByImitatingExcel.rar

DataGridView控件模仿Excel复制选中的单元格内容。代码中利用DataGridView、button、contextMenustrip控件。

2021-01-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除