我有一个mainForm
变量,在我的程序中几乎无处不在。我希望能够引用此变量而无需键入包含此变量的类的名称(即代替Global._mainForm
,我应该只需键入_mainForm
即可访问此变量变量在同一名称空间内的任何地方。)
实现这一目标的最佳方法是什么?
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:0)
你无法在C#中实现这一目标。
命名空间只是类的类型名称的一部分。从词汇上讲,您可以将命名空间视为仅包含其他命名空间和类。
类可能包含字段,函数,事件,属性,嵌套类等,但不包含嵌套的命名空间。
因此,没有办法在类之外的名称空间中定义一个符号,该符号别名或引用特定类中包含的符号。
在解析对变量名_mainForm
的引用时,唯一不需要额外限定的地方就是在定义它的类的范围内。
如果您所在的命名空间范围与定义_mainForm
的类相同(并且_mainForm
是静态实例),那么您只需要通过使用该类对其进行限定来访问它名称。否则,您将需要额外的命名空间限定,或者可能需要使用using
指令进行欺骗。但是在包含类之外,您将始终需要某种资格才能访问_mainForm
。
有关难以理解的详细信息,请参阅http://en.csharp-online.net/ECMA-334:_10.7_Scopes。
答案 2 :(得分:0)
我可以在C#中看到命名空间中的每个类能够直接寻址同一个变量的唯一方法是在名称空间中所有其他类使用的基类中将变量定义为静态。由于静态变量可以作为类中的局部变量(或继承自的类)来定义,因此变量将在没有类限定的情况下可用。
不能说这是个好主意,但那不是你问的......