VS编译器不允许为WINMD类型库创建密封的公开类型.
为什么要放置此限制?(我知道密封类型的优点,我的问题是关于Win RT组件).
我知道这在"技术上"是这个问题的重复. 我应该推荐默认的密封类吗?
但是我再问一遍,因为显然这个建议已经改变了1次虽然我在过去几年里找不到任何关于它的事情,或者现在越来越多的人推荐AGAINST密封课程,这要归功于改进在测试中(这是主要原因之一),处理器速度(速度差现在可以忽略不计)等.
我正在试图找出最新的天气指南是什么,或者不标记classes为sealed.
1 Essential C#6.0(第5版),Mark Michaelis(合着者Eric Lippert):
"一般来说,将一个类别标记为密封很少进行,并且只应保留那些有充分理由支持这种限制的情况.实际上,离开类型未开封的情况越来越令人满意,因为单元测试因为需要支持模拟(测试双重)对象创建来代替实际的实现."
这是硬拷贝证明,因为其他人都是口口相传.
可能重复:
密封类真的提供性能优势吗?
我的团队正在内部与密封的课堂辩论进行斗争,我想将辩论简化为设计问题,并将性能神话从辩论议程中删除.
任何人都可以发布一些代码来证明通过将类声明为密封而引入的性能提升吗?每秒2000万次虚拟方法调用,我看不到多少好处,可能在1000万次迭代中有1或2毫秒,但即便如此,我也不确定,因为结果会跳转.这适用于调试和发布运行.
ps我跟随一些John Skeet获得了关于密封类设计的好处的智慧,特别是当软件是通过团队或组织边界交付和/或类是组件中的打包组件样式时.
我已经实现了一个单例类,并且不断收到警告,我正在编写的方法是一个'在密封类中声明的新受保护成员'.它不会影响构建,但我真的不想忽略警告,以防以后出现问题?我理解一个密封类是一个不能被继承的类 - 所以它的方法不能被覆盖,但我仍然不明白为什么下面的代码会给我警告(是因为使用了单例设计?):
namespace WPFSurfaceApp
{
public sealed class PresentationManager
{
PresentationManager()
{
}
protected void MethodName()
{
}
public static PresentationManager Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly PresentationManager instance = new PresentationManager();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:警告是关于MethodName()方法.编辑:将public void MethodName()更改为protected void MethodName()
如果一个类没有任何虚方法,我认为继承类的任何方式都不会影响任何未明确引用该实例作为子类实例的代码,即
Subclass obj = new Subclass()
Run Code Online (Sandbox Code Playgroud)
而不是
BaseClass obj = new SubClass()
Run Code Online (Sandbox Code Playgroud)
因此,为什么sealed甚至存在?
如果你没有声明任何东西virtual(我认为在密封类中没有任何意义),它会阻止像(例如)a ListViewItem那样存储一些关于它代表什么的额外信息的代码"知道"该信息是在那里,与重写的方法不同,它对没有用该子类编写的代码没有影响.
在MATLAB中,类的一个属性(后面定义classdef)是Sealed,这意味着没有类可以将它用作超类(或者更确切地说," 表示这些类没有被设计为支持子类. " 1).
例如,如果我尝试实例化一个定义如下的类(考虑table是Sealed):
classdef SomeLie < table
end
Run Code Online (Sandbox Code Playgroud)
我会得到'MATLAB:class:sealed'错误:
>> A = SomeLie;
Error using SomeLie
Class 'table' is Sealed and may not be used as a superclass.
Run Code Online (Sandbox Code Playgroud)
由于我拒绝由机器来告诉我可能或可能不会做,我想继承一个Sealed类,而不管.我怎样才能在MATLAB R2017a中做到这一点?
我很难相信这个系统是完全不透气的,所以我正在寻找一种能够导致该Sealed属性被忽略的解决方案(或类似的东西).所需的解决方案应该无需修改任何"库类定义"即可从中删除Sealed.
我试着玩"反思",但到了死胡同......
classdef SomeLie % < table
properties (Access = private)
innerTable table;
end
properties (GetAccess = public)
methodHandles struct = struct();
end …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 AES.GCM 解密数据。加密的数据工作正常,但当我尝试使用相同的密钥解密数据时,会出现身份验证错误。下面是解密代码
func decryptData(decryptToData: Data, key: SymmetricKey) -> String {
var decryptedString: String!
let combinedData = decryptToData // Previous sealed bo
let sealedBoxToOpen = try! AES.GCM.SealedBox(combined: decryptToData)
if let decryptedData = try? AES.GCM.open(sealedBoxToOpen, using: key) {
decryptedString = String(data: decryptedData, encoding: .utf8)!
print(decryptedString)
} else {
print("error", CryptoKitError.self)
// Ouch, doSomething() threw an error.
}
return decryptedString
}
Run Code Online (Sandbox Code Playgroud)
以下是我的加密代码
let iv = AES.GCM.Nonce()
var encryptedData: Data!
let key = SymmetricKey(size: .bits128)
func encryptData(encryptString: String, key: SymmetricKey) -> Data { …Run Code Online (Sandbox Code Playgroud) 如果我正确地阅读了 JLS \xc2\xa78.1.6和\xc2\xa79.1.4,则密封类/接口允许的类只是直接子类/接口。
\n为了说明这一点,请考虑以下示例:
\npublic sealed interface I1 permits I2, C, D { /*...*/ }\npublic final class C implements I1 { /*...*/ }\npublic final class D implements I1 { /*...*/ }\n\npublic sealed interface I2 extends I1 permits E, F { /*...*/ }\npublic final class E implements I2 { /*...*/ }\npublic final class F implements I2 { /*...*/ }\nRun Code Online (Sandbox Code Playgroud)\n如果我正确理解了规范,I1显然允许CandD但不允许Eand F(通过fromextends的层次结构)。它是否正确?I2 …
阅读此处的答案后,我决定将我的类标记为密封,以简化IDisposable实现。为什么sealed会影响IDisposable的实现(例如GC.SuppressFinalize(this);不需要调用)?请解释发生了什么事。我需要能够向其他开发人员解释为什么我要密封该类。
将类标记为密封似乎可以获得一些真正的好处:
而且缺点似乎相对较少......您可以在不破坏代码的情况下解封一个类,但是您以后无法在不破坏代码的情况下密封一个已解封的类。
最好的做法是始终将类标记为密封,除非您打算继承它?为什么或者为什么不?
关于这个主题还有其他评论或指导吗?
sealed ×10
c# ×5
oop ×4
.net ×3
class ×2
inheritance ×2
.net-2.0 ×1
aes-gcm ×1
cryptography ×1
encryption ×1
idisposable ×1
java ×1
java-17 ×1
matlab ×1
sealed-class ×1
singleton ×1
swift ×1
windows-8 ×1
winrt-xaml ×1
wpf ×1