【问题标题】:Should I use static function in c# where many calls the same func?我应该在许多调用相同函数的 c# 中使用静态函数吗?
【发布时间】:2011-12-03 18:59:53
【问题描述】:

John 的控制台应用程序多次调用我的 DLL 函数(每秒约 15 次)。我正在考虑将此函数作为 static 方法。

我知道:

  1. 它只能访问静态道具和对象。
  2. 它不需要实例来运行该函数。

但我不知道这些是不是我需要问自己的唯一问题。

John 对我的函数的每个调用都在他创建的新线程中。

  • 如果我的函数出现错误,这将如何影响所有其他调用?
  • 我是否应该将此函数设为具有类实例的常规函数​​(John 将创建该类)?
  • GC 呢?

这个问题的最佳实践答案是什么?

【问题讨论】:

  • 我也是 :-) 静态方法很好,在上下文中,它是您必须担心的状态(即静态字段/属性/对象之类的东西)。 Stack Overflow 上已经有很多关于此的问题 - 例如,请参阅 stackoverflow.com/questions/2524524/…
  • @Christoph 我总是使用以下示例:john 、 paul George 和 Ringo。

标签: c# .net static-methods


【解决方案1】:

听起来可能有问题。在多线程环境中调用对静态(共享)对象进行操作的方法应该会为您敲响一些警钟。

查看您的代码,如果有可能同时从两个(或更多)线程访问共享对象,请将该对象设为实例字段并将您的方法设为实例方法。

当然,是否存在风险很大程度上取决于实际代码(您没有显示),但将所有调用设为非静态意味着您可以降低潜在风险。

【讨论】:

  • 既然您提到了 2 个可以同时访问它(我不想暂停/锁定任何一个),它确实会响起铃声(一个大铃声)。谢谢。
【解决方案2】:

一般来说,如果您的静态方法不使用任何状态(即读取和写入静态字段和属性,或调用其他这样做的静态方法),调用者不会有任何副作用,不会不管他们启动了多少线程。

如果您要求最佳实践,静态方法通常不是一个好主意。如果有的话,静态方法应该只用于非常通用的实用程序功能。

不建议这样做,因为您无法预测需求是否会发生变化,并且有一天您需要某种状态。那么你最好使用一个调用者可以实例化的类,你会破坏所有使用你的函数的现有代码。

关于垃圾收集,是的,肯定会有一些开销,但如果你走内存管理的 OO 路线,那目前是牺牲品。如果您想要更多控制,请使用不安全的代码或 C++ 或 Vala 等语言。

【讨论】:

  • 如果我没记错的话 - STATIC 不会去 GC... 对吧?
  • 我不明白你的意思,但是对于静态方法来说,GC 收集的东西实际上并不存在。
【解决方案3】:

我同意 Wiktor (+1),但还要补充一点,如果在静态方法中需要同步,则使用多个实例可能更有效。否则,拥有许多线程可能毫无意义,因为一次只有一个可以访问临界区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多