为什么使用readonly IEnumerable <T>

Sam*_*ach 1 c# ienumerable readonly immutability mutability

你为什么要申报IEnumerable<T> readonly

这篇关于异步和等待的文章中我们得到以下代码.

class OrderHandler
{
    private readonly IEnumerable<Order> _orders;

    public OrderHandler()
    {
        // Set orders.
    }
    public IEnumerable<Order> GetAllOrders()
    {
        return _orders;
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable<T>是不可改变的.这与readonly关键字有何不同?

p.s*_*w.g 5

readonly此处的关键字适用于该字段_orders.它只是意味着在对象的生命周期内不能为字段分配不同的值.例如,这是不可能的:

class OrderHandler
{
    private readonly IEnumerable<Order> _orders;

    public OrderHandler()
    {
        // Set orders.
    }

    void SomeMethod()
    {
        _orders = new Order[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

您将收到此编译器错误:

readonly字段不能被分配到(除了在构造函数或变量初始值)

不会使集合成为只读集合.例如,您仍然可以这样做:

class OrderHandler
{
    public readonly IEnumerable<Order> Orders;

    public OrderHandler()
    {
        Orders = new List<Order>();
    }
}

((List<Order>)OrderHandler.Orders).Add(new Order());
Run Code Online (Sandbox Code Playgroud)

这可能会违反班级的线程安全性.有关不可变集合的信息,请参阅Tigran的答案.

进一步阅读