2010-02-25 5 views
2

Duplique possibles:
Casting: (NewType) vs. Object as NewType
Why is the C# “as” operator so popular?différents types de Cast en C#

Hey,

Je sais que cela peut être une question stupide, mais ce doute est venu me aujourd'hui .

Quelle est la différence entre faire

String text = (String) variable; 

et

String text = variable as String; 

?

+0

Voir http://stackoverflow.com/questions/2483/ –

+0

http://stackoverflow.com/questions/2139798/why-is-the-c -as-operator-so-popular –

Répondre

7

Un casting peut faire trois choses:

  • Effectuer une conversion définie par l'utilisateur
  • Effectuer une conversion unboxing
  • Effectuer une conversion de référence

Une opération as est presque toujours un conversion de référence, la seule exception étant le déballage vers un type Nullable:

object x = "hello"; 
int? y = x as int?; // y is null afterwards 

Ensuite, il y a le comportement avec les conversions qui échouent au moment de l'exécution. Donc, les différences sont:

  • Les lancements effectuant des conversions de référence ou unboxing lanceront InvalidCastException en cas d'échec; as entraînera la valeur null du type cible à la place
  • Les conversions peuvent effectuer des conversions définies par l'utilisateur; as ne peut pas
  • Les conversions peuvent être converties en valeurs non nulles; as ne peut être utilisé pour unboxing si le type de cible est un type de valeur nullable
4

as renverra null si variable n'est pas réellement de ce type (String dans ce cas). Le casting va lancer une exception.

+1

comme retournera null si la variable n'est pas réellement de ce type ** ou un type dérivé ** (String dans ce cas). Le casting va lancer une exception. –

+1

Battez-moi. Gardez à l'esprit que "as" ne fonctionnera pas sur les types de valeur. 'int i = obj comme int;' ne compilera pas. Le mot clé 'as' doit être utilisé avec un type de référence ou un type nullable comme l'a dit @Mehrdad Afshari. –

+0

@Matt: cela fonctionne. Vous devez utiliser un type nullable: 'int? i = obj comme int?; ' –

0

Il y a beaucoup de façons différentes exprimés en C#.

Cela va essayer de transformer la référence en une référence de chaîne.Si la distribution échoue, elle déclenche une exception:

string text = (String) variable; 

Cette opération tente de transformer la référence en référence de chaîne. Si la distribution échoue, il renvoie une référence null à attribuer à la variable:

string text = varible as String; 

Cela jeté une référence de chaîne à une référence d'objet, qui est une coulée en toute sécurité sous forme de chaîne hérite de l'objet:

object text = (object)"1337"; 

casting à une classe parent peut également être fait implicitement:

object text = "1337"; 

Cela boîte une valeur à l'intérieur d'un objet, unbox alors à une valeur simple encore:

int value = 42; 
object boxed = (object)value; 
int valueAgain = (int)boxed; 

La boxe peut également être fait implicitement:

int value = 42; 
object boxed = value; 
int valueAgain = (int)boxed; 

Cela fera une conversion élargissement de l'octet int:

byte a = 42; 
int b = (int)a; 

Les mêmes œuvres que d'une conversion implicite:

byte a = 42; 
int b = a; 

Cela va faire un rétrécissement conv ersion de int à l'octet, jeter le trop-plein:

int a = 512; 
byte b = (byte)a; // b now contains 0 
Questions connexes