静态只读字符串数组

8
我是您的助手,以下是翻译的结果:
我在我的Web应用程序中使用静态只读字符串数组。 基本上,该数组包含错误代码,并且我已将所有相似的错误代码放在一个数组中,而不是检查每个常量字符串的不同部分。
例如:
public static readonly string[] myarray = string[] {"232132132","31232132","123123123"}

请问使用静态只读字符串数组有什么危害吗?

注意:我没有遇到任何错误,只是想知道像这样使用是否会有任何危害或性能问题?


4
我无法确定你在询问什么,你到底想要做什么? - Juliet
抱歉让大家困惑了,我已经更新了问题。 - batwadi
4个回答

18

可以尝试使用类似这样的方法:

public static readonly ReadOnlyCollection<string> ErrorList = new ReadOnlyCollection<string>(
  new string[] {
    "string1",
    "string2",
    "stringn",
  }
);

您需要include命名空间System.Collections.ObjectModel以公开此对象。 ReadOnlyCollection只实现了getter,因此无法更改数组内容。


public static readonly List<string> ErrorList = new List<string>( new string[] { "字符串1", "字符串2", "字符串n", } ); - Nick Kovalsky

6

正如Ben所提到的,你的数组仍然是可修改的。它不能被改变为另一个数组,但其中的元素可以很容易地被替换。作为一种替代方案,你可以将数组字段设置为私有,并在公共属性中暴露它,就像这样:

public class MyClass {

    private static readonly string[] myArray = { ... };
    private static readonly IList<string> myArrayReadOnly = Array.AsReadOnly(myArray);

    public static IList<string> MyArray {
        get {
            return myArrayReadOnly;
        }
    }

}

为什么不直接使用System.Collections.ObjectModel.ReadOnlyCollection呢? - Chris Charabaruk
1
这就是array.asreadonly返回的内容。但在公共API中暴露它并不理想。 - Josh

5

你需要知道的是,只有数组引用是只读的,而不是数组内容。因此,如果数组是公共的(听起来像是这样),程序的任何部分都可以覆盖任何或所有消息,唯一不可能的是调整数组大小。

这符合你对“危害”的定义吗?


是的,没错,我确保这些引用的任何位置值都不会被修改。我已经注意到了这一点。我的担心是这种方法好吗?还是我能以更好的方式实现它? - batwadi
@prakash:我认为Ben的意思是你的数组值可能被覆盖,这种情况下你没有对它们进行保护。需要使用不同的实现方式而不是数组。 - John K

-1
Kivin有一个好主意。
你可以看看静态类中的常量是否更适合你的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接