【问题标题】:Static Class and Getter静态类和 Getter
【发布时间】:2012-09-03 10:01:43
【问题描述】:

我有一个名为 Test 的静态类和一个私有 List 集合。现在我想实现一个 getter 来将我的 List 返回到主类。这是正确的方法吗?

其次可以实现静态构造函数吗?如果没有,我该如何正确声明我的列表集合?

static class Storage
{

   private static List<string> store;

   static Storage()
   {
       store = new List<string>();


   }

   //Is it okay to have a getter in my static class to return my List Collection
   public static List<string> getList
   {
       get
       {
           return store;
       }


   }

   public static void addString(string add)
   {
       store.Add(add);
   }

   public static void removeString(string remove)
   {
       store.Remove(remove);
   }

【问题讨论】:

  • 对我来说似乎是Code Review
  • 你应该非常小心这里的线程问题;静态字段通常是线程的问题。

标签: c# collections static


【解决方案1】:

如果您在 getter 中返回对列表的引用,则任何调用者都可以在列表中添加或删除项目,而无需通过静态类的添加/删除方法。如果您想阻止任何人修改列表,我会从 getter 中返回 read only collection

public static IEnumerable<string> getList
{
   get
   {
       return store.AsReadonly();
   }
}

编辑

正如 Marc 指出的,您需要注意多线程问题。想象一下,一个线程枚举通过 getter 获得的集合,而另一个线程通过添加或删除一个项目来修改它 -> 您将收到一个异常,指出您在枚举时无法修改集合。唯一的解决方案是锁定对私有集合的所有访问并在 getter 中返回一个副本。

【讨论】:

  • 谢谢克里斯。我可以用 ICollection 代替 IEnumerable 吗?
  • 是的,你可以返回ICollection
  • 假设我使用 ICollection,并从我的主程序中调用它,我将如何循环查看字符串值?
  • foreach (string value in Storage.getList) { ... }
【解决方案2】:

你可以改用private static readonly List&lt;string&gt; store = new List&lt;string&gt;()

拥有一个属性来返回您的字段是处理它的正确方法。你不应该有公共领域。

此外,虽然我们讨论的是样式:根据 Microsoft 发布的命名约定,方法和属性名称应以大写字母开头。

【讨论】:

  • 谢谢丹尼尔。你对我的方法名称是正确的。我只是在玩 C#。那么,我实现 getter 以返回 List 集合的方式是正确的方式吗?
  • 是的,没关系。尽管您拥有的 add 和 remove 方法是多余的。
猜你喜欢
  • 2014-09-24
  • 2015-03-21
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多