(На ваш первоначальный вопрос о set
был дан ответ. IIRC, "set" - это слово с самыми разными значениями в английском языке ... очевидно, это также влияет на вычисления.)
Я думаю, что хорошо иметь HashSet<T>
с таким именем, но я бы, конечно, приветствовал ISet<T>
интерфейс. Учитывая, что HashSet<T>
появился только в .NET 3.5 (что само по себе было удивительно), я подозреваю, что в конечном итоге мы можем получить более полную коллекцию типов на основе множеств. В частности, эквивалент Java LinkedHashSet
, который поддерживает порядок вставки, был бы полезен в некоторых случаях.
Если честно, интерфейс ICollection<T>
фактически покрывает большую часть того, что вы хотели бы в ISet<T>
, так что, возможно, это не требуется. Тем не менее, вы можете утверждать, что основная цель набора (который главным образом связан с защитой и только косвенно заключается в возможности перебирать элементы) не совсем совпадает с коллекцией. Это сложно. На самом деле, действительно математический набор не может быть итеративным или счетным - например, у вас может быть «набор действительных чисел от 1 до 2». Если бы у вас был числовой тип с произвольной точностью, счет был бы бесконечным, и повторение по нему не имело бы никакого смысла.
Точно так же идея «добавления» к набору не всегда имеет смысл. Изменчивость - сложная задача при именовании коллекций: (* 1014 *
РЕДАКТИРОВАТЬ: Хорошо, отвечая на комментарий: ключевое слово set
никоим образом не является наследием Visual Basic. Это операция, которая устанавливает значение свойства, а не get
, которая возвращает операцию. Это не имеет ничего общего с идеей множества как операции.
Представьте себе, что вместо этого ключевые слова на самом деле были fetch
и assign
, например,
// Not real code!
public int Foo
{
fetch
{
return fooField;
}
assign
{
fooField = value;
}
}
Цель ясна там? Теперь реальный эквивалент этого в C # равен
public int Foo
{
get
{
return fooField;
}
set
{
fooField = value;
}
}
Так что если вы напишите:
x = y.Foo;
, который будет использовать get
часть свойства. Если вы напишите:
y.Foo = x;
, который будет использовать set
part.
Это понятнее?