- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
2011 年 1 月 6 日更新:
信不信由你,我继续把这个界面合并到an open source library I've started, Tao.NET .我wrote a blog post解释这个图书馆的 IArray<T>
界面,它不仅解决了我最初在这个问题中提出的问题(一年前?!),而且还提供了 协变索引接口(interface) ,BCL 中非常缺乏(在我看来)的东西。
问题(简而言之):
我问为什么 .NET 有 IList<T>
,它实现了 ICollection<T>
因此提供了修改列表的方法( Add
、 Remove
等),但不提供任何中间接口(interface),例如 IArray<T>
通过索引提供随机访问,无需任何列表修改。
编辑 2010 年 1 月 21 日美国东部时间下午 2:22:
在对 Jon Skeet 的原始回答的评论中(他质疑人们多久需要一份诸如 IArray<T>
之类的契约(Contract)),我提到了 Keys
和 Values
SortedList<TKey, TValues>
的属性类是IList<TKey>
和 IList<Value>
,分别,乔恩回答说:
But in this case it's declared to be IList and you know to just use the indexers. . . . It's not hugely elegant, I agree - but it doesn't actually cause me any pain.
SortedList<TKey, TValue>
的经验类(class)。
SortedList<string, int> mySortedList = new SortedList<string, int>();
// ...
IList<string> keys = mySortedList.Keys;
keys.Add("newkey");
IList<string>
,这是合法的.但是我们都知道,它会导致异常。
Well, the interfaces aren't perfect but a dev can check the IsReadOnly property before calling Add/Remove/Set...
public interface ICanWalkAndRun {
bool IsCapableOfRunning { get; }
void Walk();
void Run();
}
Walk
方法;在很多情况下,我会选择设置
IsCapableOfRunning
至
false
并抛出
NotSupportedException
在
Run
...
var walkerRunners = new Dictionary<string, ICanWalkAndRun>();
// ...
ICanWalkAndRun walkerRunner = walkerRunners["somekey"];
if (walkerRunner.IsCapableOfRunning) {
walkerRunner.Run();
} else {
walkerRunner.Walk();
}
ICanWalkAndRun
的接口(interface)的目的? ?
IList<T>
.
IList<T>
的一些实现。明确定义方法
Add
,
Insert
等 - 通常通过执行以下操作:
private List<T> _items;
public IList<T> Items {
get { return _items.AsReadOnly(); }
}
IList<T>
的属性, 和
接口(interface)的整个想法是:“这些是一些可用的属性和方法” ,我为什么要扔
NotSupportedException
(或无论如何)当他/她试图做一些根据界面应该完全合法的事情时?
IArray<T>
的东西通过索引提供非常基本的随机访问的接口(interface),但没有添加/删除,如下所示:
public interface IArray<T> {
int Length { get; }
T this[int index] { get; }
}
IList<T>
可以实现
ICollection<T>
和
IArray<T>
并添加其
IndexOf
,
Insert
和
RemoveAt
方法。
IList<T>
并吐出一个
IArray<T>
,但是......真的吗?)
System.Collections.Generic
中的接口(interface)?是这样设计的?我错过了什么吗?是否有一个令人信服的论点反对我所说的关于明确定义 IList<T>
成员的方法的问题? ?
最佳答案
设计问题并不总是非黑即白的。
一方面是针对每种情况的精确接口(interface),这使得实际实现接口(interface)的整个过程变得非常痛苦。
另一个是少数(er)多用途接口(interface),它们并不总是完全被实现者支持,但使许多事情变得更容易,例如传递相似但不会获得“精确接口(interface)”设计中分配的相同接口(interface)的实例.
所以BCL设计师选择了第二种方式。有时我也希望接口(interface)少一点多用途,特别是对于集合和 C#4 接口(interface)协/逆变特性(不能应用于大多数集合接口(interface),除了 IEnumerable<>,因为它们包含两个协以及逆变部分)。
此外,令人遗憾的是,诸如字符串和原始类型之类的基类不支持某些接口(interface),例如 ICharStream(对于字符串,可用于正则表达式等以允许使用除 string
实例之外的其他来源进行模式匹配)或 IArithmetic 用于数字基元,以便通用数学成为可能。但我想所有框架都有一些弱点。
关于.net - 为什么.NET 中没有 IArray(T) 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110440/
我正在寻找一种方法来拥有 Enum a => UArray a(这对我来说很有意义,因为我们可以简单地将枚举映射到 Int 并通过 toEnum 和 fromEnum) 到目前为止,我试图从 Data
2011 年 1 月 6 日更新: 信不信由你,我继续把这个界面合并到an open source library I've started, Tao.NET .我wrote a blog post解
我是一名优秀的程序员,十分优秀!