草庐IT

c# - 为什么默认情况下不密封类?

我只是想知道,既然sealed关键字的存在表明它是类作者决定是否允许其他类从它继承,为什么类默认不密封,有一些关键字将它们明确标记为可扩展?我知道这有些不同,但访问修饰符是这样工作的。默认情况下是限制性的,只有插入关键字才能授予更完整的访问权限。不过,很有可能我没有考虑清楚,所以请保持人性化! 最佳答案 我会说这只是一个错误。我知道很多人(包括我自己)认为类确实应该默认密封。该阵营的C#设计团队中至少有几个人。自从C#首次设计以来,钟摆就有点偏离了继承。(当然,它有它的用处,但我发现自己很少使用它。)就其值(value)而言,这并不

c# - IEquatable<T>、IComparable<T> 是否应该在非密封类上实现?

大家有没有意见IEquatable或IComparable通常应该要求T是sealed(如果它是class)?我想到了这个问题,因为我正在编写一组旨在帮助实现不可变类的基类。基类旨在提供的部分功能是相等比较的自动实现(使用类的字段以及可应用于字段以控制相等比较的属性)。当我完成时它应该非常好-我正在使用表达式树为每个T动态创建一个编译比较函数,因此比较函数应该非常接近常规相等比较函数的性能。(我正在使用以System.Type为键的不可变字典并仔细检查锁定以合理执行的方式存储生成的比较函数)不过突然出现的一件事是使用什么函数来检查成员字段的相等性。我的初衷是检查每个成员字段的类型(我称

c# - 当我想继承和添加属性时如何处理密封类

在recentquestiononStackOverflow中,我问我如何通过文件名解析文件的额外元信息。解决该问题后,我决定可能要创建一种新类型的对象来保存元数据和原始文件。我想我可能会做这样的事情:classBackupFileInfo:FileInfo,IEquatable{//PropertiesandMethodshere}我的想法是,我将保留原始FileInfo对象,同时在实现FileInfo的对象的属性中添加元信息,例如IsMainBackup.但是,FileInfo是密封的,这意味着其他类不能继承它。相反,我得到了以下结果:classBackupFileInfo:IEq

c# - 为什么 .NET 值类型是密封的?

不可能从C#结构继承。我不太明白这是为什么:很明显,您不能拥有从值类型继承的引用类型;这行不通从一种原始类型(Int32、Double、Char等)继承听起来不合理您需要能够使用派生实例在基础上调用(非虚拟)方法。您可以从派生结构转换为基础结构,因为它们会重叠相同的内存。我猜想从基类转换为派生类是行不通的,因为您无法在运行时知道派生结构的类型。我知道你不能在你的类层次结构中实现虚拟方法,因为值类型不能有虚拟成员我想知道这是CLR中的技术限制,还是C#编译器阻止您执行的操作?编辑:值类型不能有虚方法,我意识到这个限制排除了大多数您想使用继承的场景。不过,这仍然留下了作为聚合的继承。想象一

c# - 我是否应该密封所有我知道不应该用作基类的类?

我是否应该密封所有我知道不应该用作基类的类,即使没有明显的性能或安全问题,还是这只是增加了麻烦? 最佳答案 一个可扩展的类实现了它可以被扩展的特性——这个特性与该类的任何其他特性一样,应该被视为一个特性,与方法没有区别。应仔细考虑所有功能,以确保它们满足使用该功能的客户的目标。需要设计、实现、审查安全问题、调试、记录和维护功能。所有这些都需要付出努力,而努力通常需要付出金钱。你花谁的钱?他们可能对您是否应该执行此功能有意见。基本上,您有三个选择:1)花钱做这个功能,这样你就有信心它是正确的、健壮的、安全的并且满足用户需求。2)不执行

c# - 什么是 C# 中的内部密封类?

我正在查看一些C#代码以扩展VS2010中的语言支持(Ook示例)。我看到一些类叫做internalsealedclass这些有什么作用?人们会使用它们吗? 最佳答案 这是一个类:internal:只能从它定义的程序集(或友元程序集)内访问。sealed:不可继承。将类标记为internal是一种防止程序集的外部用户使用它们的方法。这实际上是一种设计封装形式,恕我直言,将不属于预期公共(public)API\对象模型的类型标记为internal是一种很好的做法。从长远来看,这可以防止您的库的用户将自己耦合到您不希望他们耦合的类型。这

c++ - 如何在 C++ 中定义密封类?

如何阻止类被其他类继承。 最佳答案 C++11解决方案在C++11中,你可以通过在定义中使用final关键字来封装一个类:classAfinal//notefinalkeywordisusedaftertheclassname{//...};classB:publicA//error-becauseclassAismarkedfinal(sealed).{//soAcannotbederivedfrom.//...};要了解final的其他用途,请在此处查看我的答案:Whatisthepurposeofthe"final"keywo

javascript - 冷冻和密封的区别

我刚刚听说了JavaScript方法freeze和seal,它们可用于使任何Object不可变。这里有一个简短的例子如何使用它:varo1={},o2={};Object.freeze(o2);o1["a"]="worked";o2["a"]="worked";alert(o1["a"]);//prints"worked"alert(o2["a"]);//prints"undefined"freeze和seal有什么区别?它们能提高性能吗? 最佳答案 Object.seal它可以防止从密封对象中添加和/或删除属性;使用delete将

Kotlin学习快速入门(9)—— 密封类的使用

原文地址:Kotlin学习快速入门(9)——密封类的使用-Stars-One的杂货小窝代码逻辑中,很多时候我们会需要分支语句,来根据数据的情况走不同的处理逻辑,而密封类就是在这种情况下,方便我们的使用介绍密封类是用来表示受限的类继承结构即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型,从使用角度来说,相当于是枚举类的扩展PS:Java17也有了这个密封类使用假设我们有中情形,需要根据一个type的数值来进行不同的逻辑,如下代码:fungetMsg(type:Int):String{returnwhen(type){1->TODO()2->TODO()else->TODO()}}编译

Kotlin学习快速入门(9)—— 密封类的使用

原文地址:Kotlin学习快速入门(9)——密封类的使用-Stars-One的杂货小窝代码逻辑中,很多时候我们会需要分支语句,来根据数据的情况走不同的处理逻辑,而密封类就是在这种情况下,方便我们的使用介绍密封类是用来表示受限的类继承结构即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型,从使用角度来说,相当于是枚举类的扩展PS:Java17也有了这个密封类使用假设我们有中情形,需要根据一个type的数值来进行不同的逻辑,如下代码:fungetMsg(type:Int):String{returnwhen(type){1->TODO()2->TODO()else->TODO()}}编译