3

我有一个mainForm在我的程序中几乎无处不在的变量。我希望能够引用此变量,而不必键入包含此变量的类的名称(即Global._mainForm,我应该能够只键入_mainForm以访问同一名称空间内的任何位置的此变量)。

实现这一目标的最佳方法是什么?

4

3 回答 3

7

每当我看到一个全球性的东西时,我都会担心,所以我会重新考虑你的程序是如何构建的。您几乎总是可以在没有全局可访问对象的情况下逃脱。尽管拥有全局可访问对象是有正当理由的,但我通常会尽量远离它们。

根据您提供的少量信息,您也许可以使用事件与主窗口对话,而不是直接访问它。

如果你确实需要一个全局可访问的对象,那么你可以做这样的事情

注意:在下面的代码中,所有内容都是静态的,相反,您可以创建一个特殊的静态类,该类包含对您真正感兴趣的类的实例的引用。但是我知道没有办法保存全局在所有命名空间之外对对象实例的引用。

using Bar = ProbablyAReallyBadIdeaToHaveAGlobalAnythingButHeyWhyNot.TestClass;

namespace ProbablyAReallyBadIdeaToHaveAGlobalAnythingButHeyWhyNot
{
  public static class TestClass
  {
    public static int TestFoo { get; set; }
  }
}

namespace Foo.SomeOtherNamespace
{
  class MyClassThatDoesStuff
  {
    public void DoStuff()
    {
      Bar.TestFoo = 123;
    }
  }
}
于 2012-07-17T02:01:59.690 回答
0

我可以看到,在 C# 中,命名空间中的每个类能够直接寻址同一个变量的唯一方法是将变量定义为命名空间中所有其他类使用的基类中的静态变量。由于静态变量可以作为定义它们的类(或继承自的类)中的局部变量来寻址,因此该变量将在没有类限定的情况下可用。

不能说这是一个好主意,但这不是你问的......

于 2012-07-17T02:17:03.947 回答
0

您无法在 C# 中完成此操作。

命名空间只是类的类型名称的一部分。从词法上讲,您可以将命名空间视为仅包含其他命名空间和类。

类可能包含字段、函数、事件、属性、嵌套类等,但不包含嵌套命名空间。

因此,无法在类之外的命名空间中定义一个符号,该符号别名或引用特定类中包含的符号。

在解析对变量 name 的引用时_mainForm,唯一不需要额外限定的地方是在定义它的类的范围内。

如果您处于与定义的类相同的命名空间范围内_mainForm(并且_mainForm是静态实例),那么您只需要通过使用类名限定它来访问它。否则,您将需要额外的命名空间限定,或者可能需要使用using指令进行欺骗。但是在包含类之外,您总是需要某种资格才能访问_mainForm.

请参阅http://en.csharp-online.net/ECMA-334:_10.7_Scopes了解令人痛苦的细节。

于 2012-07-17T01:46:19.250 回答