c# - 限制对只读属性的方法调用的访问

标签 c# properties readonly

我有一个类定义了一个只读属性,该属性有效地公开了一个私有(private)字段,如下所示:

public class Container
{
    private List<int> _myList;

    public List<int> MyList
    {
        get { return _myList;}
    }

    public Container() : base ()
    {
        _myList = new List<int>();
    }

    // some method that need to access _myList
    public SomeMethod(int x)
    {
         _myList.Add(x);
    }
}

现在消费者不可能直接管理我的属性(property),所以代码像 aContainer.MyList = new List();生成编译时错误。 然而,消费者绝对可以根据他得到的引用调用各种方法,所以这是完全有效的代码

Container c = new Container();  
Console.WriteLine(c.MyList.Count);  
c.MyList.Add(4);  
Console.WriteLine(c.MyList.Count);  

哪一种破坏了整个只读概念。

是否有任何合理的解决方法可以让我拥有真正的只读引用属性?

附言我不能只返回列表的副本,因为那样的话用户会认为他进行了所有必要的更改,但是唉......它们将会消失。

最佳答案

不要返回对列表的直接引用。而是返回一个环绕它的 ReadOnlyCollection,或者如果 List<> 返回类型是固定的,则返回列表的副本。他们可以在不影响原件的情况下对副本做任何他们想做的事。

关于c# - 限制对只读属性的方法调用的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443144/

相关文章:

python - 如何将类属性转换为整数

c# - 如何使用 MySQL 查询将组合框的所有项目发送到 SQL DB

c# - 如何使用 Targets.wpp 更改 Web.Config 的应用程序设置

c# - Entity Framework 4 部分 SaveChanges

python:创建可以使用赋值自行编写的只读属性

objective-c - ARC 是否消除了 Objective-C 中对属性的需求?

ruby-on-rails - rails 模型 : How to make field read only in Rails model?

c# - 以只读方式打开文件

ruby-on-rails - 这段代码如何抛出 ActiveRecord::ReadOnlyRecord 异常?

c# - Interop.Outlook 是多线程的吗?