.NET“全局”变量;哪一个是更好的做法?

时间:2011-03-08 10:24:01

标签: .net oop global-variables

我应该使用哪一个?

此:

public class MyClass
{
    static string m_MyString = "My string here";
    public static string MyString { get { return m_MyString; } }
}

或者这个:

public class MyClass
{
    public static readonly string MyString = "My string here";
}

3 个答案:

答案 0 :(得分:1)

使用后者,但略作修改:

public static class CommonStrings
{
    public const string MyString = "My string here";
}

另一方面,'全局'变量具有不良做法的耻辱 - 然而,在这种情况下,在我看来,可重用字符串的常用容器是更可取的;我不打算将你想要重复使用的所有内容公之于众,特别是如果它们不是常数。

答案 1 :(得分:1)

我会说既不。修辞问题要问自己帮助你的决定:他们在哪里使用?它们不能在使用它们的类中声明为私有的吗?如果由几个类使用,那么这些类可能包含对MyClass的引用?是否有与字符串相关的操作可以放在MyClass

答案 2 :(得分:1)

如果您只需要在代码中共享此类字符串,我建议您使用资源(resx)而不是重新发明轮子。

只需创建一个资源并使用它。

另一方面,如果你想分享常见的值,我建议你创建类似环境类的东西,比如在.NET类库中找到的名为“CustomEnvironment”的东西(用任何标识符更改“Custom”)这对你来说是合理的。)

此“环境”提供对公共资源,特定于平台的信息和方法的访问,这些信息和方法可以格式化,转换或容纳任何数据或对象到平台。

你应该避免“全局变量”的做事方式,以及那些破坏任何好的OOP图的机会的类。因为“常量类”是快速做事的好捷径,但是你如何回答“这个类在你的对象模型中代表什么?”的问题:

  • 这是一组变量:错误,这不是一个类,因为这些变量(或常量或属性)没有意义:你可以在这个类或任何其他类中实现它们。

  • 这是一类工具:“做所有”工具类,将所有“常见”属性和行为移动到一个类,所以其他所有人都访问它以进行某些关键操作不是OOP,它只是分组

  • 这是一组资源。好的,您不需要重新发明轮子,只需使用Microsoft .NET类库中的开箱即用的资源管理工具。

  • 这只是一个例子。不好的例子;)

所以,回答这个问题,接受“全局变量”在OOP中是一种不好的方法,如果没有计算暴露值或者不需要任何处理,你应该使用常量,因此,你可以定义它和它将在课堂建设期间分配。

也许你需要在设置这样的“常数”之前计算或处理一些东西:你将使用一个只读字段,但是,对我来说 - 只是一个意见 - ,我建议你使用一个属性来暴露它value(也许你不需要这样的readonly字段,因为有时你会更喜欢计算/处理每次代码访问属性,但如果你总是使用属性,你可以封装这个实现细节。)