如何创建常量静态数组?

时间:2013-02-11 16:41:37

标签: c# class

我的数据库有一个静态字符串类,因此我总是以他们设计的方式拼写表格和列。

我目前在这一个类中有大约500行代码,但这是一个简短的例子:

public const string PURCHASING = "PURCHASING";
public const string SCHED_PURCH = "SCHED/PURCH";
public const string SCHEDULING = "SCHEDULING";

要创建“Clerk”部门的 readonly 静态字符串数组,我使用此静态声明:

public static string[] CLERK_DEPT {
  get {
    return new string[] { PURCHASING, SCHEDULING, SCHED_PURCH };
  }
}

我的数据库字符串类中有很多这样的代码。

今天,我发现这个活跃的帖子中有人做了非常相似的事情:

How do I prevent the modification of a private field in a class?

答案提供了一种方法来提供我以前没有考虑过的只读字符串数组:

  

您必须返回阵列的副本

public String[] getArr() {
  return arr == null ? null : Arrays.copyOf(arr, arr.length);
}

现在我想知道是否有人在这里知道一种更有效的方法来传回我的readonly字符串数组。

我必须承认,我一直憎恶我的代码中return new string[]的想法。

那么,有吗? ...一种更有效,更清洁的方法,或者我已经创建了最佳解决方案?

2 个答案:

答案 0 :(得分:6)

基本上没有不可变数组这样的东西。

如果您信任所有来电者,可以告诉他们不要改变数组。另一种方法是提供只读包装器:

private static readonly ReadOnlyCollection<string> clerkDepartments =
    new ReadOnlyCollection<string>(
        new[] { "PURCHASING", "SCHED/PURCH", "SCHEDULING" });

public static readonly ReadOnlyCollection<string> ClerkDepartments
    { get { return clerkDepartments; } }

请注意,尽管ReadOnlyCollection<T>不是完全不可变集合,但只有访问底层集合的代码才能更改它 - 并且作为唯一“知道”数组的代码是初始化器,它将它传递给构造函数,除非有人破解反射,否则你基本上是安全的。)

答案 1 :(得分:3)

也许使用ReadOnlyCollection?

http://msdn.microsoft.com/en-us/library/ms132474.aspx