C# 解封类是否会导致运行时或编译时中断?

C# 解封类是否会导致运行时或编译时中断?,c#,.net,C#,.net,我正在从事一个涉及许多不可变类的项目。我们对将这些类标记为密封类很感兴趣,但担心的是,如果我们以后决定“解封”一个类,它将导致API客户的运行时或编译时错误。这种担心有什么好处,或者解封一个类不会导致运行时/编译时问题吗?解封一个类不会导致任何额外的编译时错误。可以通过解封类来编译以前不可编译的代码,但反过来不行 可能会导致许多运行时问题,但我认为这些问题非常罕见,因为这需要使用者检查类型元数据。例如,如果类型未密封,用户可能会抛出,但我不确定这是一个主要问题 解封类不会导致任何额外的编译时错误

我正在从事一个涉及许多不可变类的项目。我们对将这些类标记为密封类很感兴趣,但担心的是,如果我们以后决定“解封”一个类,它将导致API客户的运行时或编译时错误。这种担心有什么好处,或者解封一个类不会导致运行时/编译时问题吗?

解封一个类不会导致任何额外的编译时错误。可以通过解封类来编译以前不可编译的代码,但反过来不行


可能会导致许多运行时问题,但我认为这些问题非常罕见,因为这需要使用者检查类型元数据。例如,如果类型未密封,用户可能会抛出,但我不确定这是一个主要问题

解封类不会导致任何额外的编译时错误。可以通过解封类来编译以前不可编译的代码,但反过来不行


可能会导致许多运行时问题,但我认为这些问题非常罕见,因为这需要使用者检查类型元数据。例如,如果类型未密封,用户可能会抛出,但我不确定这是一个主要问题

在框架的更新版本中从类中删除sealed属性只会允许它们从类派生,而以前它们无法这样做。只要您的更新版本不要求您的客户机派生自您的类,我想不出任何问题


解封该类的另一个影响是运行时将无法优化掉一些虚拟函数调用,但这也不会导致任何问题

在框架的更新版本中从类中删除sealed属性只会允许它们从类派生,而以前它们无法这样做。只要您的更新版本不要求您的客户机派生自您的类,我想不出任何问题


解封该类的另一个影响是运行时将无法优化掉一些虚拟函数调用,但这也不会导致任何问题

如果Jon Skeet不抱怨解封一个不是为继承而设计的类的想法,我会很失望。如果您在设计这些类时没有考虑继承,那么当您打开它们时,可能会出现问题。如果你为继承而设计它们,就不需要密封它们。如果我是你的话,我会做一个快速测试:)我确实运行了一个简单、快速的测试,这并没有造成编译时间或运行时中断,但是我没有考虑到类似的反射(下面在一个答案中提到)。这正是我所关心的,一些我没有考虑过可能会被破解的聪明代码。至于为什么我们可能会打开一个类…希望我们不会。不过,如果发生这种情况,我想提前知道后果。我可以想到一些场景,在需要继承之前,可能需要进行初始密封。我有一些库利用隐含的“密封”知识来优化一些动态(运行时)处理(例如,永远不会有派生类的知识)。请记住,由于反射的性质,它应该适应运行时实际类的实际情况。。。所以,除非有人编写了执行反射的代码,并期望使用一个密封的类,否则这应该不是一个问题。。。虽然有人可以编写这样的代码,但我认为这有点违背了首先使用反射的整个想法。如果Jon Skeet没有抱怨解封一个不是为继承而设计的类的想法,我会很失望。如果您在设计这些类时没有考虑继承,那么当您打开它们时,可能会出现问题。如果你为继承而设计它们,就不需要密封它们。如果我是你的话,我会做一个快速测试:)我确实运行了一个简单、快速的测试,这并没有造成编译时间或运行时中断,但是我没有考虑到类似的反射(下面在一个答案中提到)。这正是我所关心的,一些我没有考虑过可能会被破解的聪明代码。至于为什么我们可能会打开一个类…希望我们不会。不过,如果发生这种情况,我想提前知道后果。我可以想到一些场景,在需要继承之前,可能需要进行初始密封。我有一些库利用隐含的“密封”知识来优化一些动态(运行时)处理(例如,永远不会有派生类的知识)。请记住,由于反射的性质,它应该适应运行时实际类的实际情况。。。所以,除非有人编写了执行反射的代码,并期望使用一个密封的类,否则这应该不是一个问题。。。虽然有人可以编写这样的代码,但我认为这有点违背了最初使用反射的想法。你知道那些运行时异常可能是什么吗?我想记录可能的运行时异常以供将来参考。@JadeMason,否,因为这将非常依赖于用户在这种情况下选择抛出的内容。您知道这些运行时异常可能是什么吗?我想记录可能的运行时异常,以供将来参考。@JadeMason,否,因为它将非常依赖于用户在这种情况下选择抛出什么。