Вы всегда можете найти некоторые хитрые ситуации, когда ключевое слово new
можно использовать для сокрытия, в то время как его можно избежать в большинстве случаев.
Однако в последнее время я действительно нуждался в этом ключевом слове, главным образом потому, что в языке отсутствуют некоторые другие надлежащие функции синтаксиса, например, для завершения существующего средства доступа:
Если вы считаете старомодный класс вроде:
KeyedCollection<TKey, TItem>
Вы заметите, что аксессор для доступа к индексу корыта предметов:
TItem this[Int32 index] { get; set; }
Имеет оба { get; set; }
, и они, конечно, обязательны из-за наследования относительно ICollection<T>
и Collection<T>
, но есть только один { get; }
для доступа к элементам через их ключи (у меня есть некоторые предположения об этом дизайне и для этого есть множество причин, поэтому, пожалуйста, обратите внимание, что я взял KeyedCollection<TKey, TItem>)
только для иллюстрации).
В любом случае, для доступа к ключам есть только один метод получения:
TItem this[TKey key] { get; }
Но что если я захочу добавить поддержку { set; }
, технически говоря, это не так глупо, особенно если вы продолжаете рассуждать из прежнего определения свойства, это всего лишь метод ... единственный способ - реализовать явно другой фиктивный интерфейс, но когда вы хотите сделать неявным, вы должны придумать ключевое слово new
, я скрываю определение метода доступа, сохраняя get; базовое определение и просто добавьте набор, наполненный некоторыми личными вещами, чтобы он работал.
Я думаю, что для этого очень специфического сценария это ключевое слово идеально применимо, в частности, в отношении контекста, в котором ничего не приведено к части { get; }
.
public new TItem this[TKey key]
{
get { return base... }
set { ... }
}
Это почти единственная уловка, позволяющая избежать такого рода предупреждений, потому что компилятор предлагает вам, что вы, возможно, скрываетесь, не понимая, что вы делаете.