尽管.Net允许动态调用(例如使用反射,C#动态关键字),但是当使用诸如C#之类的语言时,我们有时会觉得有必要使用静态类型,以证明我们的程序是正确的,并且在运行时不会有输入问题。
有时这会导致我们引入接口或基类,只是为了向编译器解释'是的,我知道我传递给这个上下文的所有对象都将理解调用方法X和arg是的 - 在这里,我将使用界面定义向您证明! (例如 - .net在内部使用IReadChunkBytes接口允许将SteamReadChunkBytes或BufferReadChunkBytes对象传递给某些方法或其他方法。)
其他时候我们创建类或类型以用于其他目的,这些目的不是非常有用的类型-y,例如具有小附加行为的唯一标识符(有点像枚举),或者包含一组常量等等
我有兴趣更好地理解当我面临这样的设计决策时,编译时,运行时和其他成本是什么,我要问'我应该为了解决这个问题而定义一个新类型或接口吗? “显然,在每次这样的比较中,成本和收益将有两个方面,但总的来说,我们应该在每次这样的比较/讨论中看到“定义新类型”的相同成本。我们如何量化这些成本?
答案 0 :(得分:4)
静态创建新接口或类的性能和/或空间成本始终可以忽略不计。在这个意义上,不要过多考虑它。相反,反射和后期绑定会导致严重的性能问题。你应该在每个机会都使用静态类型。
与创建新类或接口相关的成本不是性能成本。他们的人力成本更高。以下是在添加新类或接口之前应该考虑的一些注意事项的列表。无论如何,使用后期绑定或反射可能不会对您的程序有所帮助。这些是最后的手段。
答案 1 :(得分:1)
几乎所有东西都有一些运行时成本。唯一的例外是像空的空间。原因是几乎所有东西都在IL映像中记录,甚至是局部变量名,参数名,常量。所以至少会有磁盘成本,虚拟内存空间成本,工作空间成本。
就CPU而言,更多元数据会降低程序启动速度,令牌分辨率,JIT / NGEN。
但有时添加类型也会对性能产生积极影响。
答案 2 :(得分:0)
使用动态强类型更有可能给您带来性能问题。因此,如果您对大多数对象使用dynamic
都没问题,则可能无需担心创建静态类型的成本。
旁注:如果您更喜欢动态输入,C#可能不是最适合的语言。由于大多数C#代码都是针对强类型对象,因此获取好样本会更难。