2009-04-21 14 views
11

Estoy trabajando a través de Josh Smith's CommandSink code obviamente no entiendo algo acerca de la palabra clave "como" en C#.¿Hay algo más en la palabra clave "#" de C# que en el simple casting?

No entiendo por qué escribió la línea:

IsValid = _fe != null || _fce != null; 

ya que sólo necesita escribir:

IsValid = depObj != null; 

Ya que nunca sería el caso de que el _fe sería nula y _fce no nulo, o viceversa, ¿verdad? ¿O me falta algo sobre cómo "as" arroja variables?

class CommonElement 
{ 
    readonly FrameworkElement _fe; 
    readonly FrameworkContentElement _fce; 

    public readonly bool IsValid; 

    public CommonElement(DependencyObject depObj) 
    { 
     _fe = depObj as FrameworkElement; 
     _fce = depObj as FrameworkContentElement; 

     IsValid = _fe != null || _fce != null; 
    } 
    ... 

RESPUESTA:

La respuesta es lo que dijo Marc en su comentario "que es el punto central de 'como' - que no lanzar una excepción - sólo se informa nula. "

y aquí está la prueba:

using System; 

namespace TestAs234 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer customer = new Customer(); 
      Employee employee = new Employee(); 

      Person.Test(customer); 
      Person.Test(employee); 
      Console.ReadLine(); 
     } 

    } 

    class Person 
    { 
     public static void Test(object obj) 
     { 
      Person person = obj as Customer; 

      if (person == null) 
      { 
       Console.WriteLine("person is null"); 
      } 
      else 
      { 
       Console.WriteLine("person is of type {0}", obj.GetType()); 
      } 
     } 
    } 

    class Customer : Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

    class Employee : Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

} 

Respuesta

26

as devolverá un objeto del tipo que ha solicitado, si el operando es compatible. Si no es así, devolverá null. Si usa as y es posible que el lanzamiento fracase, debe verificar que la referencia sea válida.

Por ejemplo, si depObj fue de tipo String, no sería null, pero también no sería capaz de ser convertido en cualquiera de los tipos solicitados y ambas de estas variables se convertiría en null.

+0

Ah, aprendes algo nuevo todos los días. Iba a sugerir algo similar, pero supuse que arrojaría una excepción si no podía emitir ... –

+7

@Gordon: ese es el objetivo de "como" - no * lanzará una excepción - simplemente informa nulo. –

3
IsValid = _fe != null || _fce != null; 

y

IsValid = depObj != null; 

no son las mismas pruebas porque si depObj no es de FrameworkElement tipo ni FrameworkContentElement pero no es nula la segunda prueba devolverá verdadero, mientras que la primera volverá falsa.

1

¿Y si el DependencyObject depObj era en realidad un FrameworkOtherTypeOfElement

Entonces depObj no sería nula

pero los intentos de as yesos habría tanto evaluar en null y _fe & _fce ambos serían nulas

as es equivalente a hacer

if(I Can Cast This Object) 
    //Then cast it 
else 
    //Return null 
2

¿Qué pasa si depObj no es FrameworkElement o FrameworkContentElement? No conozco el escenario completo (es decir, cuáles son los tipos que probablemente sean), pero esta parece una estrategia defensiva razonable.

5

al igual que "la conversión, si es", y equivalente a:

(X is TYPE) ? (TYPE) X : null

es sin embargo, más eficiente que is + cast.

depObj puede implementar cualquiera de las interfaces, ninguna o ambas.

2

Primero, la palabra clave as incluye un cheque is.

if(o is A) 
    a = (A) o; 

es lo mismo que

a = o as A; 

En segundo lugar, as no convierte el tipo como un molde hace, incluso si se define un operador de conversión de tipo A-B.

+0

bueno, eso definitivamente se repetiría hasta ... ¡desbordamiento de pila! – murki

+0

jaja, cierto. Se corrigió, significaba que había un elenco allí, pero el buen hábito de programación de C# redirigía la escritura de un elenco a un operador "como" allí: D –

Cuestiones relacionadas