根据FxCop的建议和我个人的倾向,我一直鼓励我正在指导的团队尽可能多地使用ReadOnlyCollections.仅限于列表的收件人无法修改其内容.在他们的理论中,这是面包和黄油.问题是List <>接口更丰富,暴露了各种有用的方法.他们为什么做出这个选择?
你只是放弃并返回可写的集合吗?您是否返回只读集合,然后将它们包装在可写的多样性中?AHHHHH.
更新:谢谢我熟悉框架设计指南,这就是为什么团队使用FxCop来强制执行它.然而,这个团队和VS 2005一起生活(我知道,我知道)并告诉他们LINQ/Extension方法可以解决他们的问题只会让他们感到难过.
他们已经了解到List.FindAll()和.FindFirst()比编写foreach循环更清晰.现在我正在推动他们使用ReadOnlyCollections,他们失去了清晰度.
也许有一个更深层次的设计问题,我没有发现.
- 抱歉,原帖应该提到了VS2005的限制.我和我共处了很长时间以至于我没有注意到.
我有以下密封课.我正试图将列表作为一个返回ReadOnlyCollection.尝试了几件事,但我没有掌握这一点.那么如何将列表返回或转换为只读集合?
public sealed class UserValues
{
private readonly List<UserValue> _Values = new List<UserValue>();
public ReadOnlyCollection<UserValues> Values
{
get
{
return _Values;
}
}
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码Java中,我创建了一个列表nums.我可以在声明期间分配另一个列表.但是除了null.之外不能添加新项目.那么,这是否意味着nums只读?为什么?是否可以在该列表中添加新项目?
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(3.14); //Generates error
nums.addAll(ints); //Generates error
nums.add(null); //works
System.out.println(nums.get(0)); //works
Run Code Online (Sandbox Code Playgroud)
我已经通过了这个链接.我无法得到确切的理由.
我有一本字典如下:
public enum Role { Role1, Role2, Role3, }
public enum Action { Action1, Action2, Action3, }
var dictionary = new Dictionary<Role, List<Action>>();
dictionary.Add(RoleType.Role1, new Action [] { Action.Action1, Action.Action2 }.ToList());
Run Code Online (Sandbox Code Playgroud)
现在我希望能够构造一个只读字典,其值类型也是只读的,如下所示:
var readOnlyDictionary = new ReadOnlyDictionary<Role, ReadOnlyCollection<Action>>(dictionary);
Run Code Online (Sandbox Code Playgroud)
由于TValue类型的不同,最后一行显然会导致编译时错误.
使用a List<TValue>也是必要的,因为原始字典是以编程方式从外部源填充的.
有没有简单的方法来执行此转换?
这是示例代码:
static class Store
{
private static List<String> strList = new List<string>();
private static HashSet<String> strHashSet = new HashSet<string>();
public static List<String> NormalList
{
get { return strList; }
}
public static HashSet<String> NormalHashSet
{
get { return strHashSet; }
}
public static IReadOnlyList<String> ReadonlyList
{
get { return (IReadOnlyList<String>)strList; }
}
public static IReadOnlyCollection<String> ReadonlyHashSet
{
get { return (IReadOnlyCollection<String>)strHashSet; }
}
public static IReadOnlyList<String> Real_ReadonlyList
{
get { return (IReadOnlyList<String>)strList.AsReadOnly(); }
}
public static IReadOnlyCollection<String> Real_ReadonlyHashSet
{
get …Run Code Online (Sandbox Code Playgroud) 如果查看只读集合的代码,它没有"添加"方法,而是定义ICollection<T>.Add(T Value)方法(显式接口实现).
当我用我的ReadOnlyDictionary类做了类似的事情时,FxCop 10抱怨我打破了CA1033.
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//CA1033 ERROR
void IDictionary<TKey, TValue>.Add(TKey, TValue) { //Throw Exception }
}
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//NO CA1033 ERROR
Add(TKey, TValue) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)
ReadOnlyCollectionClass:
public class ReadOnlyCollection<T> : ICollection<T>
{
void ICollection<T>.Add(T item) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)
那么,这是误报吗?微软的基本代码是坏的吗?是什么赋予了?
我正在编写一个库,我们公司的其他开发人员将使用该库。状态机基类有一些ReadOnlyCollection<T>允许的状态等。开发人员需要继承该类并设置允许的状态。
我想限制它们在其派生类的构造函数中初始化ReadOnlyCollection<T>,并且以后无法修改它。
如果我在基类中将 声明ReadOnlyCollection<T>为只读属性,则该属性不起作用,因为无法在派生类的构造函数中对其进行修改。
我认为这种情况并不少见。有什么优雅的方式来实现这一点,让开发人员重写ReadOnlyCollection<T>?
我对数据结构只有两个要求:
我知道这IReadOnlyList确实保留了秩序。我可以使用它,但我不需要索引。这意味着我应该使用IReadOnlyCollection. 不幸的是,我找不到它保持秩序的信息。
你知道吗?
列表(和列表)实例可以只读,看到ReadOnly属性; 在集合具有属性ReadOnly属性的情况下,方法抛出异常.
如何创建只读List实例?主要用途是什么?
基本上,我总是在理解你应该尽可能地返回公开基类型并且在内部担心实现细节,这是有道理的......
但是,我不知道该怎么做.基本上,我现在有:
ReadOnlyObservableCollection<Foo> MyFoos {get; private set; }
Run Code Online (Sandbox Code Playgroud)
我想知道是否应该将其作为a ReadOnlyCollection<Foo>或ICollection<Foo>因为内部返回,因为我从未真正使用任何可观察的部分或尝试写入集合.WPF似乎不关心我返回什么,它仍然绑定它并正确触发集合更改通知事件.但是,我在某处读到了我应该设计这个以确实有任何消费视图处理我的ViewModel.
所以我在这里有点不知所措.我认为将它ReadOnlyObservableCollection<T>留作最有意义的是明确地告诉消费者视图他们可以和不能对财产做什么,但我也认为你应该减少类型到他们的基本类型当你能够.所以我不知道该怎么做.特别是因为WPF不关心我返回的类型,它会发现它是可观察的.
c# ×9
.net ×2
list ×2
collections ×1
dictionary ×1
fxcop ×1
generic-list ×1
generics ×1
hashset ×1
inheritance ×1
java ×1
mvvm ×1
null ×1
readonly ×1
wpf ×1