Это глупый вопрос, но вы можете использовать этот код, чтобы проверить, является ли что-то определенного типа ...
if (child is IContainer) { //....
Есть ли более элегантный способ проверить наличие экземпляра «НЕ»?
if (!(child is IContainer)) { //A little ugly... silly, yes I know...
//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) {
if (child aint IContainer) {
if (child isnotafreaking IContainer) {
Да да ... глупый вопрос ....
Поскольку существует некоторый вопрос о том, как выглядит код, это просто простое возвращение в начале метода.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
if (!(argument is MapsControlViewModel vm)) { return; }
- Я мог бы инвертировать if и поместить оставшуюся часть метода в квадратные скобки if, но тогда я получил бы рождественский код с множеством закрывающих скобок в конце метода. Это гораздо менее читабельно.ifnot
заявленияОтветы:
это единственный оператор (нет
IsNot
оператора).Вы можете создать метод расширения, который делает это:
а затем использовать его для:
И вы можете следить за вашей темой:
Обновление (учитывая фрагмент кода ОП):
Поскольку вы на самом деле приводите значение потом, вы можете просто использовать
as
вместо этого:источник
IsNot
.Вы можете сделать это следующим образом:
источник
is
имеет более высокий приоритет по сравнению с==
. Единственная причина, по которой вы не можете использовать!x is f
это то, что он имеет меньший приоритет, чем!
.if (a is TextReader reader == false)
«Должен» работать, но он не позволит вам использовать переменную в истинном пути, говоря, что она, возможно, не была инициализирована.out
параметров)if (a is TextReader reader == true)
что считает переменную неинициализированной.Почему бы просто не использовать остальное?
Это аккуратно, это знакомо и просто?
источник
У вас все хорошо, но вы можете создать набор методов расширения, чтобы сделать «более элегантный способ проверки экземпляра« НЕ »».
Тогда вы могли бы написать:
источник
Это еще не было упомянуто. Это работает, и я думаю, что это выглядит лучше, чем при использовании
!(child is IContainer)
Новое в C # 9.0
https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#logical-patterns
источник
if (part as IContainer is null)
. Честно говоря, не уверен, что лучше.Гадкий? Я не согласен. Единственный другой способ (лично я считаю, что это «уродливее»):
источник
as
пункт.obj as int
всегда ошибка времени компиляции.is
формы.В
is
операторе принимает значение булева результата, так что вы можете делать все , что бы в противном случае быть в состоянии сделать на BOOL. Чтобы отрицать это, используйте!
оператор. Зачем вам нужен другой оператор только для этого?источник
Метод расширения
IsNot<T>
- это хороший способ расширить синтаксис. Иметь ввидуработает лучше, чем делать что-то вроде
В вашем случае это не имеет значения, так как вы возвращаетесь из метода. Другими словами, будьте осторожны, чтобы не выполнять как проверку типа, так и преобразование типа сразу после него.
источник
Хотя это не устраняет проблему с круглыми скобками, ради людей, попадающих сюда через Google, следует отметить, что существует более новый синтаксис (начиная с C # 7), чтобы сделать остальную часть вашего кода немного чище:
Это позволяет избежать двойного приведения, нулевой проверки и наличия переменной, доступной в областях, где она может быть нулевой.
источник
Хотя оператор IS обычно является наилучшим способом, есть альтернатива, которую вы можете использовать при некоторых обстоятельствах. Вы можете использовать оператор as и проверить нулевое значение.
источник
C # 9 (будет выпущен с .NET 5) будет включать в себя логические шаблоны
and
,or
иnot
, что позволяет нам написать это более элегантно:Аналогично, этот шаблон можно использовать для проверки на нулевое значение:
Вы можете найти более подробную информацию о проблеме Github, отслеживающей это изменение.
источник
источник