Instantiate “AS” palavra-chave
Pergunta
Eu comecei recentemente a trabalhar com JSON eo quadro ExtJs e eu me deparei com o seguinte código no exemplo.
nós recuperar a informação a partir do frontend usando este:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
Então no exemplo que faça o seguinte:
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
Eu nunca vi o "como" palavra-chave usada assim antes. Isto é apenas uma outra forma de boxe explicitamente a variável de updatedConfig como um JavaScriptObject Ou há algo que eu não estou entendendo sobre isso?
Graças
Solução
Isto é conhecido como um elenco segura. O que é que é ele tenta elenco de um tipo para outro e se a conversão falhar ele retorna null
invés de lançar uma InvalidCastException
.
Na verdade, existem duas instruções IL separadas para lidar com a diferença entre "as
" fundição e fundição estática normal. O seguinte código C # contém ambos os tipos de seleção de elenco:
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
O primeiro elenco usa a instrução castclass
IL ea segunda elenco usa a instrução isinst
.
Por favor, veja vs usando o 'como' palavra-chave em CLR para uma explicação mais detalhada.
Outras dicas
O como palavra-chave é um mais seguro maneira de elenco objetos em C #.
SomeType a = obj as SomeType;
significa que se obj
é do tipo SomeType
, obj
serão lançados esse tipo. Se obj
é nulo ou não é do tipo SomeType
, um será nulo.
Outra vantagem do como palavra-chave é que ele vai lançar uma exceção tempo de compilação se o tipo não pode ser fundido onde, como (elenco) não quebrar até run-time.
Além disso, é importante lembrar que "como" opera na referência não no próprio objeto. É por isso que ele pode retornar nulo em vez de lançar uma exceção, porque o objeto permanecerá intacto. E é por isso que você só pode fazê-lo em tipos de referência.
Normalmente, isso não importa muito, mas se você implementar uma função de elenco (como aqui em MSDN ) ele irá não ser invocado usando como operador.
Assim, o operador as é útil para "mover para cima e para baixo da hiearchy herança": Se você tem uma classe Pessoa, que você pode fazer: Person p = novo pessoa (); ojbect o = p como objecto; p = O como Pessoa; Mas em todos os casos, o objeto na memória não será modificado de qualquer forma, apenas a referência a ele.
Espero que ajude