【问题标题】:Global variable in a static method静态方法中的全局变量
【发布时间】:2011-01-17 16:49:48
【问题描述】:

这似乎很基本,但我发现这很微不足道。简而言之,您会如何建议使用静态类(即控制台应用程序)设置全局变量?

为了让您了解更多背景知识,主要方法是调用一些我希望获取/设置变量的自定义事件处理程序。

感谢您的任何想法或建议。

【问题讨论】:

  • 我个人建议从您的词汇表中删除“全局变量”这个短语。
  • 供以后参考,一些琐碎的事情,你觉得很简单。

标签: c# static console-application


【解决方案1】:

最简单的方法是

public static Object MyGlobalVariable;

创建一个公共静态字段。更好一点的是:

public static Object MyGlobalVariable { get; set; }

这会创建一个公共静态属性。

【讨论】:

  • 物业为什么好一点?
  • @IllidanS4, stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0/653799
  • 我知道区别,但是静态属性客观上比静态字段好吗?
  • @IllidanS4,对于公共数据,是的。
【解决方案2】:

C# 中没有全局变量。变量始终是局部范围的。代码的基本单元是类,在一个类中你有字段、方法和属性。

可以通过在某个类中创建公共静态字段或属性来模仿“全局变量”,但您不应该。 C# 让这变得困难是有充分理由的;全局变量是纯粹的邪恶。它们违反了 OO 设计的几个良好原则 - 封装、松散耦合和高内聚,仅举几例。

我知道这是一个初学者的问题,但我认为这是因为这是一个初学者的问题,所以说这个非常重要。现在是开始学习 C# 中积极劝阻甚至危险的策略的最佳时机,使用静态字段/属性作为全局变量大约是其中的六个。这些结构有合法的用途,但从一个地方到另一个地方传递数据并不是其中之一。

如果两个不同的类依赖于相同的信息,则将信息从源传递到目标。这通常通过构造函数或作为被调用方法的参数来完成。您应该始终只有一个实例真正“拥有”此信息;使信息“全球化”意味着您无法推断在任何给定时间点谁或什么可能依赖于它。

请考虑这一点,并尝试考虑其他方法可以共享您想要存储在全局变量中的信息(即通过将其作为参数提供给构造函数或方法)。如果您不确定,请发布您正在尝试做的示例,我们会提供帮助。

【讨论】:

  • 感谢您的详细说明。这很有帮助。
  • 假设我有几个线程同时运行并且远离主线程,现在当其中任何一个线程发生故障时,我想增加故障计数。那要怎么做呢?
  • @user20358:这些信息不足以推荐解决方案。线程在做什么?他们为什么会失败?失败的后果是什么? 计数它们的意义何在,而不是记录它们或采取一些后续行动?你应该澄清你的问题并提出一个新问题。
  • ^ 在我的例子中,我用创建的每个线程递增计数器,然后在每个线程完成时递减,并在执行另一个命令之前等待所有线程完成。
【解决方案3】:

不是 100% 确定,但您可以尝试使用单例来保存变量。在不知道您要完成什么的情况下,如果此解决方案不会让您失望,那么很难推荐。

http://www.yoda.arachsys.com/csharp/singleton.html

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2012-12-30
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多