当前位置:  开发笔记 > 编程语言 > 正文

C#中的"只读"属性访问器

如何解决《C#中的"只读"属性访问器》经验,为你挑选了3个好方法。

我有以下课程:

class SampleClass
{
   private ArrayList mMyList;

   SampleClass()
   {
       // Initialize mMyList
   }

   public ArrayList MyList
   {
       get { return mMyList;}
   }
}

我希望用户能够获得mMyList,这就是我通过属性公开"获取"的原因,但是我不希望他们对对象做出更改(即.MyList.Add(new Class());)以使其成为回到我班上的路.

我想我可以返回对象的副本,但这可能很慢,我正在寻找一种方法,它将提供编译时错误,通知用户他们不应该期望能够修改返回的值属性.

这可能吗?



1> JaredPar..:

使用ArrayList你是相当有限的,因为BCL中没有readonly非泛型集合类.快速而肮脏的解决方案是返回一种IEnumerable.

   public IEnumerable MyList
   {
       get { return mMyList;}
   }

这实际上不会阻止某人转换为ArrayList,但默认情况下也不允许编辑

您可以通过调用ArrayList.ReadOnly返回有效的只读列表.但是它的返回类型是一个ArrayList,因此用户仍然可以使用.Add编译,但它会产生运行时错误.



2> tvanfosson..:

使用ArrayList.ReadOnly()方法构造并返回列表周围的只读包装器.它不会复制列表,而只是围绕它创建一个只读包装器.为了获得编译时检查,您可能希望将只读包装器作为@nared建议的IEnumerable返回.

public IEnumerable MyList
{
     get { return ArrayList.ReadOnly(mMyList); }
}

只读集合只是一个带有包装器的集合,可以防止修改集合.如果对基础集合进行了更改,则只读集合会反映这些更改.

该方法是O(1)操作.

参考


我反对这个解决方案,因为它将应该是编译时错误变成运行时错误.

3> Tom Lokhorst..:

只是为了扩展JaredPar的答案.正如他所说,返回实际的支持字段并不是完全安全的,因为用户仍然可以动态地将其IEnumerable返回到ArrayList.

我会写这样的东西,以确保没有对原始列表进行任何修改:

public IEnumerable MyList
{
    get
    {
         foreach (object o in mMyList)
             yield return o;
    }
}

然后,我可能会使用通用列表(IEnumerable)完全类型安全.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有