Diferença entre é e como palavra-chave


121

Diga qual é a diferença entre ise aspalavra - chave em C #



3
Se você está interessado neste assunto, provavelmente também quer saber qual é a diferença entre operadores "as" e "cast": blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
Deseja marcar a resposta aceita? Ajudaria outras pessoas a procurar respostas semelhantes.
KMån 26/09/10

Respostas:


151

é

O isoperador verifica se um objeto pode ser convertido para um tipo específico.

Exemplo:

if (someObject is StringBuilder) ...

Como

O asoperador tenta converter um objeto em um tipo específico e retorna nulo se falhar.

Exemplo:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

Também relacionado:

Fundição

O operador de conversão tenta converter um objeto em um tipo específico e lança uma exceção se falhar.

Exemplo:

StringBuilder b = (StringBuilder)someObject.

4
Isto não está correto. isnão verifica se um objeto pode ser convertido para um tipo específico. Um número inteiro lança uma multa longa, mas 10 is longé falso.
Martin Smith

9
@ MartinSmith: Você está misturando conversão de tipos com fundição. Um número inteiro pode ser convertido para comprido, mas não pode ser convertido para comprido porque não é comprido.
Guffa 23/08/16

2
Você está me dizendo que um número inteiro não pode ser convertido por muito tempo? Isso (long)some_integervai falhar? Eu tenho certeza que nós dois sabemos que isso não é verdade, mesmo sem executá-lo. Por favor, explique o que você quer dizer.
Martin Smith

12
@ MartinSmith: Você ainda está confundindo a transmissão com a conversão. Você não está convertendo um número inteiro em um comprimento, está convertendo um número inteiro em um comprimento. Embora eles usem a mesma sintaxe, as referências são convertidas e os valores são convertidos.
Guffa

2
Observação sobreis : " Observe que o operador is considera apenas conversões de referência, conversões de boxe e unboxing. Outras conversões, como conversões definidas pelo usuário, não são consideradas. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Sobreas : " Note-se que o como .. Executa operador apenas conversões de referência, conversões nulo, e conversões de encaixotamento A como operador não pode executar outras conversões, como conversões definidas pelo utilizador, que devem em vez disso ser realizados usando expressões de difusão " ( msdn .microsoft.com / pt-br / library / cscsdfbt.aspx )
user1234567

33

A diferença entre IS e As é que ..

O operador IS - Is é usado para verificar a compatibilidade de um objeto com um determinado tipo e retorna o resultado como um booleano (verdadeiro ou falso).

O operador AS - As é usado para converter o objeto em um determinado tipo ou classe.

Ex.

Student s = obj as Student;

é equivalente a:

Student s = obj is Student ? (Student)obj : (Student)null;

1
A equivalência mostra claramente qual dos dois é mais primitivo e subjacente à sua relação elegantemente! Obrigado pela equivalência!
Musa Al-hassy 01/07/2015

1
@ MusaAl-hassy Na verdade, isso não mostra o que é mais primitivo. ispode ser expresso com ase aspode ser expresso com is. Aqui está como fazer um iscom a aspalavra - chave. Bool b = obj is Student; é equivalente a: Bool b = (obj as Student) != null; Mais informações aqui
Alex Telon

8

Ambos iseas palavras chave são usadas para conversão de tipo em C #.

Ao examinar o código IL de usos de ambas as palavras-chave, você perceberá facilmente a diferença.

Código C #:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

Código IL (para o código C # acima está na imagem em anexo):

Código IL para código C # acima O código IL para isuso de palavras-chave contém instruções IL isinstae castclass.
Mas o código IL para asuso de palavras-chave possui apenas isinsta.

No uso mencionado acima, ocorrerão duas digitações onde a ispalavra-chave é usada e apenas uma digitação onde a aspalavra-chave é usada.

Nota: Se você estiver usando a ispalavra-chave para verificar alguma condição e não tiver interesse no resultado da conversão de tipo, haverá apenas um tipo de conversão, ou seja

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

ise as aspalavras - chave serão usadas com base na necessidade.


6

A palavra-chave is verifica se o valor no lado esquerdo é uma instância do tipo no lado direito. Por exemplo:

if(obj is string)
{
     ...
}

Observe que, nesse caso, você terá que usar uma conversão explícita extra para obter obj como string.

A palavra-chave as é usada para converter tipos anuláveis. Se o valor especificado não for uma instância do tipo especificado, será retornado nulo. Por exemplo:

string str = obj as string;
if(str != null)
{
     ...
}

+1 para "A palavra-chave as é usada para converter tipos anuláveis".
user2330678

3

Eu diria: leia o MSDN online, mas aqui está:

O operador is verifica se um objeto é compatível com um determinado tipo e o resultado da avaliação é um booleano: verdadeiro ou falso.

O operador as nunca lançará uma exceção.


O operador "as" também não lançará uma exceção; ele retornará nulo.
Pinte Dani

Corrigido o erro de digitação referente a 'é' e 'como'
Patrick Peters

2

O operador Is, uma conversão, retorna true se for bem-sucedido. Retorna false se o elenco falhar. Com ele, você não pode capturar a variável convertida. Esse operador é mais útil ao verificar tipos em instruções e expressões if. O cast é apenas ideal se a variável resultante não for necessária para uso posterior

Como é um elenco. Com isso, obtemos desempenho e evitamos exceções quando um elenco é inválido. Nulo é retornado quando o elenco é impossível. Para tipos de referência, o as-cast é recomendado. É rápido e seguro. Podemos testar a variável resultante contra nula e usá-la. Isso elimina lançamentos extras



2

is OPERATOR O operador is em C # é usado para verificar o tipo de objeto e retorna um valor bool: true se o objeto é do mesmo tipo e false se não. ou também O operador "is" é usado para verificar se o tipo de tempo de execução de um objeto é compatível com um determinado tipo ou não. Para objetos nulos, ele retorna false, por exemplo

if(obj is AnimalObject)
{
 //Then Work
}

como OPERADOR

O operador as faz o mesmo trabalho de is operator, mas a diferença é, em vez de bool, ele retorna o objeto se eles forem compatíveis com esse tipo; caso contrário, ele retornará nulo. tipos.

por exemplo

Type obj = Object as Type;

Vantagens de over over is No caso de is operator, para digitar cast, precisamos executar duas etapas:

Check the Type using is
If its true then Type cast

Na verdade, isso afeta o desempenho, pois cada vez que o CLR passa pela hierarquia de herança, verificando cada tipo de base com o tipo especificado.

Para evitar isso, use como, ele fará isso em uma única etapa. Somente para verificar o tipo, devemos usar o operador is.


Responder a perguntas de 8 anos que já têm muitas respostas válidas não é a melhor maneira de usar o Stack Overflow.
Claus Jørgensen

1

O operador As é semelhante a uma conversão, mas retorna nulo em vez de uma exceção, se falhar.

E o operador Is é usado para verificar se um objeto é compatível com um determinado tipo. Geralmente é usado nas instruções If.


1

is: O operador is é usado para verificar se o tipo de tempo de execução de um objeto é compatível com um determinado tipo

as: O operador as é usado para realizar conversões entre tipos compatíveis.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
Sua resposta está correta, mas seu código de amostra é um antipadrão. É caro fazer isisso as: desembala duas vezes. Para tipos de referência, você deve apenas fazer e as, em seguida, verificar nulo para ver se funcionou.
Steven Sudit 24/09/10

1

Dê uma olhada no vídeo do youtube abaixo, que explica a diferença de uma maneira mais demonstrativa e visual: -

https://www.youtube.com/watch?v=IKmRtJcRX_I

Abaixo segue a longa resposta com a explicação do código.

A palavra-chave "IS" é útil para verificar se os objetos são compatíveis com um tipo. Por exemplo, no código abaixo, estamos verificando se o objeto "ocust" é um tipo de classe "Customer".

object ocust = new Customer();

if (ocust is Customer)
{ 

A palavra-chave "AS" ajuda a fazer a conversão de um tipo para outro. Por exemplo, no código abaixo, estamos convertendo objeto para um tipo de dados string. Se a palavra-chave "AS" não puder digitar cast, ela retornará NULL.

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

O segundo retornará null se obj não for uma MyClass, em vez de lançar uma exceção de conversão de classe.

é retornará apenas verdadeiro ou falso


1

Tanto o IS quanto o AS são usados ​​para fundição de tipo seguro

Palavra-chave IS -> verifica se o tipo de um determinado objeto é compatível com o novo tipo de objeto. Nunca lança uma exceção. Este é um tipo booleano .. retorna true ou false

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

Palavra-chave AS: verifica se o tipo de um determinado objeto é compatível com o novo tipo de objeto. Retorna não nulo se o objeto fornecido for compatível com o novo, caso contrário nulo. Isso gera uma exceção.

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

Ambos os operadores são usados ​​para fundição do tipo seguro.

Operador AS:

O operador AS também verifica se o tipo de um determinado objeto é compatível com o novo tipo de objeto. Essa palavra-chave verificará se o tipo de um determinado objeto é compatível com o novo tipo de objeto. Se não for compatível com o novo, ele retornará NULL.

Operador de SI:

Este operador verifica se o tipo de um objeto é compatível com o novo objeto. Se for compatível, retorna true, caso contrário, false.


Você não acha que é um pouco tarde demais, como 4 anos?
Soner Gönül

Ohh sim ... Desculpe .... Eu sou novo para stackoverflow modo que pouco saiu ... Não notou a data afixada ...
Tukaram

Uma contribuição é uma contribuição! Obrigado por apontar as palavras-chave "Rotulagem segura"! :-)
Musa Al-hassy 01/07/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.