2

虽然.Net允许动态调用(比如用反射,C#动态关键字),但是在使用C#这样的语言时,我们有时觉得有必要使用静态类型,以证明我们的程序是正确的,不会有运行时的打字问题。

有时这会导致我们引入接口或基类,这些接口或基类只是为了向编译器解释‘是的,我知道我传递给这个上下文的所有对象都将被理解为调用带有 arg Y 的方法 X - 这里,我会用接口定义来证明给你看!(例如 - .net 内部使用 IReadChunkBytes 接口来允许将 SteamReadChunkBytes 或 BufferReadChunkBytes 对象传递给某个方法或其他。)

其他时候,我们创建类或类型来服务于其他感觉不是很有用的类型-y,例如作为具有小附加行为的唯一标识符(有点像枚举),或者保存一组常量等。

当我面临这样的设计决策时,我想更好地了解编译时间、运行时和其他成本将是多少 显然,每次这样的比较都会有两个方面的成本和收益,但总的来说,我们应该希望在每次这样的比较/讨论中看到“定义新类型”的相同成本。我们如何量化这些成本?

4

3 回答 3

4

静态创建新接口或类的性能和/或空间成本总是可以忽略不计。在这个意义上不要想太多。相反,反射和后期绑定会导致严重的性能问题。你应该在每一个机会都使用静态类型。

与创建新类或接口相关的成本不是性能成本。它们是更多的人力成本。下面列出了在添加新类或接口之前应考虑的一些事项。无论如何,使用后期绑定或反射可能对您的程序没有帮助。这些是最后的手段。

  • 程序复杂性。虽然通常情况并非如此,但一般的经验法则是,每个类都会为您的应用程序增加额外的复杂性,从而使其在运行时更难理解、传递给新的项目成员、记住和绘制图表。改变变得更加难以实施。
  • 如果你真的不觉得上课是必要的,也许不是。也许还有其他方法可以解决您的问题,例如使用更多动态类。也许您可以使用继承或其他技术来减少重复。
于 2012-09-19T22:28:38.260 回答
1

几乎所有东西都有一些运行时成本。唯一的例外是空白空间之类的东西。原因是几乎所有内容都记录在 IL 映像中,甚至是局部变量名、参数名、常量。所以至少会有磁盘成本、虚拟内存空间成本、工作空间成本。

在 CPU 方面,更多的元数据会减慢程序启动、令牌解析、JIT/NGEN 的速度。

但有时添加类型也会对​​性能产生积极影响。

于 2012-09-19T23:10:23.480 回答
0

在强类型上使用动态更有可能给您带来性能问题。因此,如果您可以很好地使用dynamic大多数对象,您可能无需担心创建静态类型的成本。

旁注:如果您更喜欢动态类型,C# 可能不是最好的语言。由于大多数 C# 代码都针对强类型对象,因此很难获得好的样本。

于 2012-09-19T22:36:34.093 回答