Esta é uma pergunta boba, mas você pode usar esse código para verificar se algo é de um tipo específico ...
if (child is IContainer) { //....
Existe uma maneira mais elegante de verificar a instância "NOT"?
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) {
Sim, sim ... pergunta boba ....
Como há alguma dúvida sobre a aparência do código, é apenas um retorno simples no início de um método.
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; }
- Eu poderia inverter o if e colocar o resto do método dentro dos colchetes do if, mas depois obteria o código da árvore de Natal, com muitos colchetes no final do método. Isso é muito menos legível.ifnot
declaraçõesRespostas:
é o único operador a ir (não há
IsNot
operador).Você pode criar um método de extensão que faça isso:
e use-o para:
E você pode acompanhar o seu tema:
Atualização (considerando o snippet de código do OP):
Como você está realmente lançando o valor posteriormente, você pode usar
as
:fonte
IsNot
nada.Você pode fazer assim:
fonte
is
tem maior precedência em relação a==
. A única razão pela qual você não pode usar!x is f
é que ela tem menos precedência do que!
.if (a is TextReader reader == false)
"deveria" funcionar, mas não permitirá que você use a variável no caminho verdadeiro, dizendo que ela pode não ter sido inicializada.out
parâmetros))if (a is TextReader reader == true)
que a variável não foi inicializada.Por que não usar apenas o resto?
É puro familiar e simples?
fonte
O modo como você o faz é bom, mas você pode criar um conjunto de métodos de extensão para tornar "uma maneira mais elegante de verificar a instância 'NOT'".
Então você pode escrever:
fonte
Isso ainda não foi mencionado. Funciona e acho melhor do que usar
!(child is IContainer)
is
sintaxeexpr is constant
:, em que expr é a expressão a ser avaliada e constante é o valor a ser testado.fonte
if (part as IContainer is null)
. Honestamente, não sei o que é melhor.Feio? Discordo. A única outra maneira (eu pessoalmente acho que isso é "mais feio"):
fonte
as
cláusulaobj as int
é sempre um erro de tempo de compilação.is
forma.O
is
operador avalia como resultado booleano, para que você possa fazer qualquer coisa que, de outra forma, seria capaz de fazer em um bool. Para negá-lo, use o!
operador Por que você gostaria de ter um operador diferente apenas para isso?fonte
O método de extensão
IsNot<T>
é uma ótima maneira de estender a sintaxe. Tenha em menteexecuta melhor do que fazer algo como
No seu caso, não importa como você está retornando do método. Em outras palavras, tenha cuidado para não fazer a verificação do tipo e a conversão do tipo imediatamente após.
fonte
Embora isso não evite o problema de parênteses, para o bem das pessoas que chegam aqui pelo Google, deve-se mencionar que existe uma sintaxe mais nova (a partir do C # 7) para tornar o restante do seu código um pouco mais limpo:
Isso evita a conversão dupla, a verificação nula e a disponibilidade de uma variável nos escopos em que ela pode ser nula.
fonte
Enquanto o operador IS é normalmente o melhor caminho, há uma alternativa que você pode usar em algumas circunstâncias. Você pode usar o operador as e testar como nulo.
fonte
C # 9 (para ser lançado com .NET 5) incluirá os padrões lógicos
and
,or
enot
, o que nos permite escrever este mais elegante:Da mesma forma, esse padrão pode ser usado para verificar se há nulo:
Você pode encontrar mais detalhes sobre o problema do Github que acompanha essa alteração.
fonte
fonte