【问题标题】:C# static constructor in instance class -- Pros & Contras实例类中的 C# 静态构造函数——优缺点
【发布时间】:2017-01-21 00:58:40
【问题描述】:

我在实例类中使用静态构造函数通过一些资源常量来初始化这个类。我更有经验的同事评论说,与代码中的任何静态代码一样,C# 风格都是糟糕的。他的意见更可靠的是为此的外部公共只读类。

然而,VisualStudio C# 在公共资源的第一个地址提供内部静态构造函数的运行,而不是外部类,我应该从更高的程序级别调用。它不是其他错误的来源吗?我的这个逻辑对吗?

【问题讨论】:

  • "这是不好的 C# 风格,因为 代码中的任何静态" I have some bad news for your colleague...
  • 您能提供一些代码以便我们查看/讨论吗?
  • 静态是不错的 C# 风格。它有很多应用程序,其中它是首选方法。告诉你的同事,他将自己与语言的整个主要特性隔离开来,是在把自己当作开发人员。
  • 以下陈述中只有一个是正确的,但我们不知道哪一个是正确的: (1) 我们误解了您。 (2) 你误解了你的同事。 (3) 你的同事不知道他在说什么,你不应该听他的。 - “永远不要让任何东西静止”与“永远让一切静止”一样无用。

标签: c# static


【解决方案1】:

您提出的问题是关于编码风格的。有些人喜欢使用静态,有些人喜欢避免使用它。

静态非常有用,并且有一些功能依赖于静态。例如 Main、Class Extension、Singleton 模式。

我在自己的代码中大量使用静态,因为它使很多事情变得简单(您不必担心构建共享的东西)。然而,当我开始进行单元测试时,我对它越来越感到不自在。根据定义,静态数据将创建一次并共享,这意味着对于单元测试,此数据将由测试共享。它使测试的独立性变得更加困难,迫使您手动重置设置/拆卸方法中的所有内容。

简而言之,出于单元测试和模块化的目的,我不鼓励您对不可变的数据使用静态构造函数(或者至少您用作不可变的数据 -> 只读访问)。不可变数据不是问题,因为它不会在程序(或测试)运行时被更改,您始终可以对其价值充满信心。

这又是某种编码风格,有些人会不同意,这很好(只要他们知道为什么他们更喜欢另一种风格)

【讨论】:

  • 谢谢布鲁诺!事实上,这个讨论的背后不仅仅是“难闻的阶梯气味”,而是一个事实:静态数据对项目的其他部分是开放的,这可能导致信息损坏。你是对的:手动重置强制是一个严重的头痛。但是,除了手动重启来获取另一套外部资源之外,没有任何办法,不是吗?当然,一些静态方法(Program Main、一些字符串方法等)是不可避免的。这是关于 C# 代码复杂性和数据保护之间的平衡。
  • 我昨天遇到的另一个案例与这篇文章内联:我在实例类中留下了静态构造函数;它在目标类的第一个地址读取输入 Excel 文件和设置环境信息。确实很方便,但是昨天我在单元测试中加入了这个类,得到了System.TypeInitializationException。 @Bruno Belmondo 有什么建议吗?
  • 感觉您的单元测试中可能缺少一个 dll。尝试检查所有必需的 dll 是否在单元测试项目的输出目录中,如果没有,请尝试添加显式引用。
  • 亲爱的 Bruno,经过很长时间从高级类初始化实例类单例后,我作为单例返回到静态构造函数 - 现在来自 Property resx 项,而不是以前使用的 Excel。它工作正常:比 Microsoft.Interop.Excel.dll 更快、更安全,它允许单元测试;它将所有内容保存在一个模块中,即更具可读性。您的经历对此有何评价?
  • 抱歉,我没有这个精确的用例,所以我不能告诉你太多。但是我觉得你知道理解你选择的原因,并且有能力争论你为什么做出这个选择。这可能意味着您还可以在未来评估它的表现以及是否需要进行任何更改。
猜你喜欢
  • 2011-04-19
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2013-03-05
  • 2012-05-15
  • 2010-11-11
相关资源
最近更新 更多