Tag: readonly collection

在c#中只读一个列表

我有这个示例代码。 我想要做的是使“Nums”值只能使用“AddNum”方法写入。 namespace ConsoleApplication1 { public class Person { string myName = “N/A”; int myAge = 0; List _nums = new List(); public List Nums { get { return _nums; } } public void AddNum(int NumToAdd) { _nums.Add(NumToAdd); } public string Name { get; set; } public int Age { get; set; } } } […]

如何正确使用IReadOnlyDictionary?

来自msdn : 表示键/值对的通用只读集合。 但请考虑以下事项 class Test { public IReadOnlyDictionary Dictionary { get; } = new Dictionary { { “1”, “111” }, { “2”, “222” }, { “3”, “333” }, }; public IReadOnlyList List { get; } = (new List { “1”, “2”, “3” }).AsReadOnly(); } class Program { static void Main(string[] args) { var test […]

ReadOnlyCollection vs Liskov – 如何正确建模可变集合的不可变表示

Liskov替换原则要求子类型必须满足超类型的契约。 根据我的理解,这将导致ReadOnlyCollection违反Liskov。 ICollection的合同公开了Add和Remove操作,但只读子类型不满足此合约。 例如, IList collection = new List(); collection = new System.Collections.ObjectModel.ReadOnlyCollection(collection); collection.Add(new object()); — not supported exception 显然需要不可变的集合。 有没有关于.NET的建模方法的事情? 有什么比这更好的方法呢? IEnumerable很好地暴露了一个集合,至少看起来是不可变的。 但是,语义是非常不同的,主要是因为IEnumerable没有明确地暴露任何状态。 在我的特定情况下,我正在尝试构建一个不可变的DAG类来支持FSM 。 我显然在开始时需要AddNode / AddEdge方法,但我不希望它一旦运行就可以更改状态机。 我很难表示DAG的不可变和可变表示之间的相似性。 现在,我的设计涉及预先使用DAG Builder,然后创建一次不可变图,此时它不再可编辑。 Builder和具体的不可变DAG之间唯一的通用接口是Accept(IVisitor visitor) 。 我担心,面对可能更简单的选择,这可能是过度设计/过于抽象。 与此同时,我无法接受我可以在我的图形界面上公开可能在客户端获得特定实现时抛出NotSupportedException的方法。 处理这个问题的正确方法是什么?

添加到构造函数中的只读集合?

是否有ac#language构造允许我将项添加到构造函数中的只读集合属性中? 我想做这样的事情: public class Node{ public IList Children {get; protected set;} public Node(){ Children = new ObservableList(); } } …在我的代码中… var node = new Node {Children.Add(new Node())}; (不是一个很好的例子,但我希望这可以解决这个问题)…… UPDATE 对不起,我需要更清楚。 我没有写这个Node类,我无法改变它。 我问是否有ac#语言概念允许我在第二个片段中的无参数构造函数中添加readonly集合,假设Node类不可更改。

使用IReadOnlyCollection 而不是IEnumerable 来获取参数,以避免可能的多次枚举

我的问题与关于使用IEnumerable vs IReadOnlyCollection 。 我也总是使用IEnumerable将集合作为返回类型和参数公开,因为它既可以是不可变的又是懒惰的执行。 但是,我越来越关注我的代码中的地方的扩散,我必须枚举一个参数,以避免ReSharper给出的可能的多个枚举警告。 我理解为什么ReSharper建议这一点,我同意它建议的代码(下面)以确保封装(即,没有关于调用者的假设)。 Foo[] arr = col as Foo[] ?? col.ToArray(); 但是,我发现此代码的重复性是污染性的,并且我同意一些消息来源IReadOnlyCollection是一个更好的选择,特别是本文中提出的观点,其中指出: 最近,我一直在考虑返回IEnumerable的优点和缺点。 从好的方面来说,它与接口得到的一样小,所以它让你作为方法作者更灵活,而不是像IList或( 天堂禁止 )一个更重的替代方案。 但是,正如我在上一篇文章中所概述的那样, IEnumerable返回会诱使调用者违反Liskov替换原则 。 他们很容易使用像Last()和Count()这样的LINQ扩展方法,其语义IEnumerable不承诺。 我们需要的是一种更好的方法来锁定一个返回的集合,而不会让这样的诱惑如此突出。 (我想起Barney Fife艰难地学习这一课。) 输入IReadOnlyCollection ,.NET 4.5中的新增function。 它只向IEnumerable添加一个属性: Count属性。 通过承诺计数,你向你的呼叫者保证你的IEnumerable确实有一个终点。 然后他们可以清楚地使用像Last()这样的LINQ扩展方法。 但是,正如观察者可能已经注意到的那样,本文仅讨论如何将IReadOnlyCollection用于返回类型。 我的问题是,相同的论点同样适用于将其用于参数吗? 对此的任何理论思考或评论也将受到赞赏。 事实上,我正在考虑使用IReadOnlyCollection的一般经验法则是,如果使用IEnumerable可能会有多次枚举(相对于ReSharper警告)。 否则,使用IEnumerable 。

entity framework只读集合

考虑一个客户,公司,员工等具有ContactInfo属性的域,该属性又包含一组地址,电话,电子邮件等等…… 这是我的缩写ContactInfo: public class ContactInfo : Entity { public ContactInfo() { Addresses = new HashSet(); } public virtual ISet Addresses { get ; private set; } public Address PrimaryAddress { get { return Addresses.FirstOrDefault(a => a.IsPrimary); } } public bool AddAddress(Address address) { // insure there is only one primary address in collection if (address.IsPrimary) […]