Vă mulțumim pentru susținere

Casting: (NewType) vs. Obiect ca NewType

Possible Duplicate:
Casting vs using the 'as' keyword in the CLR

Care este de fapt diferența dintre aceste două distribuții?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

În mod normal, ambele ar trebui să fie exprimate explicit la tipul specificat?

0
adăugat editat
Care este amuzant pentru că a fost postat cu 3 luni mai devreme :) Dar celălalt are răspunsuri mai detaliate.
adăugat autor Michael Stum
Consultați, de asemenea, stackoverflow.com/questions/496096/… . Acesta a fost primul, dar acesta are un răspuns bun.
adăugat autor Jay Bazuzi
Ați postat cea de-a doua întrebare cea mai veche, care este un duplicat al alteia (prima este blocată)! Felicitări, cred?
adăugat autor gparyani

12 răspunsuri

Iată o modalitate bună de a vă aminti procesul pe care fiecare dintre ele îl urmează pe care îl folosesc atunci când încerc să decid ce este mai bine pentru circumstanțele mele.

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

iar următorul ar trebui să fie ușor de ghicit ce are

DateTime i = value as DateTime;

în primul caz dacă valoarea nu poate fi exprimată decât dacă o excepție este aruncată în cel de-al doilea caz dacă valoarea nu poate fi exprimată, i este setată la null.

Deci, în primul caz, se face o oprire greu în cazul în care castul eșuează în cel de-al doilea cast, se face o oprire ușoară și este posibil să întâlniți mai târziu un NullReferenceException.

0
adăugat

Și din motive de exhaustivitate,

0
adăugat

Este ca și diferența dintre Parse și TryParse. Folosiți TryParse atunci când vă așteptați ca aceasta să nu reușească, dar când aveți o asigurare sigură că nu veți reuși să utilizați Parse.

0
adăugat

Rețineți, de asemenea, că puteți utiliza numai ca cuvânt cheie un tip de referință sau un tip de tip nul

și anume:

double d = 5.34;
int i = d as int;

nu va compila

double d = 5.34;
int i = (int)d;

va compila.

0
adăugat
deoarece o turnare nu convertește
adăugat autor CiNN

Primul va arunca o excepție dacă tipul de sursă nu poate fi transferat la tipul de destinație. Acesta din urmă va avea ca rezultat faptul că sc2 este o referință nulă, dar nu este o excepție.

[Editați | ×]

Răspunsul meu inițial este cu siguranță cea mai pronunțată diferență, dar ca Eric Lippert scoate în evidență , nu este singurul. Alte diferențe includ:

  • Nu puteți utiliza operatorul "as" pentru a arunca la un tip care nu acceptă "null" ca valoare
  • Nu puteți utiliza "ca" pentru a converti lucruri, cum ar fi numerele unei reprezentări diferite (de exemplu, float la int).

Și, în cele din urmă, folosind funcția "ca" în raport cu distribuitorul, spuneți și "nu sunt sigur dacă acest lucru va reuși".

0
adăugat

Vor arunca diferite excepții.
(): NullReferenceException
ca: InvalidCastException
Care ar putea ajuta la depanare.

Cuvântul cheie "ca" încearcă să pună obiectul, iar în cazul în care castul eșuează, null este returnat în tăcere. Operatorul () va arunca imediat o excepție în cazul în care distribuția nu reușește.

"Folosiți doar C #" ca "cuvânt cheie în cazul în care așteptați ca cast-ul să eșueze într-un caz non-excepțional. Dacă numărați o distribuție pentru a reuși și sunteți nepregătit pentru a primi orice obiect care ar eșua, astfel încât să fie aruncată o excepție adecvată și utilă. "

For code examples and a further explanation: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

0
adăugat
(-1) deoarece nu va arunca o InvalidCastException.
adăugat autor Keith

Toate acestea se aplică tipurilor de referință, tipurile de valori nu pot utiliza cuvântul cheie ca deoarece nu pot fi nul.

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

Sintaxa exprimată este mai rapidă, dar numai atunci când este reușită, este mult mai lent să eșuezi.

Cea mai bună practică este să utilizați ca atunci când nu cunoașteți tipul:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

Cu toate acestea, dacă sunteți absolut sigur că someObject este o instanță a SomeClass atunci utilizați distribuția.

În genericul .Net 2 sau superior, înseamnă că, foarte rar, trebuie să aveți o instanță nespecificată a unei clase de referință, deci aceasta din urmă este mai puțin folosită.

0
adăugat

Ei bine, operatorul "as" vă ajută să "îngropați problemele tale mai mici , deoarece atunci când este furnizată o instanță incompatibilă se va întoarce nulă, poate că o veți trece într-o metodă care o va trece într-o altă și așa mai departe și în sfârșit veți obține o NullReferenceException care vă va face mai greu depanarea.

Nu-l abuzați. Operatorul de distribuție directă este mai bun în 99% din cazuri.

0
adăugat
Recomandări foarte bune aici. Cititorii, vă rugăm să luați în considerare acest lucru.
adăugat autor mbadawi23

Pentru a extinde comentariul lui Rytmis , nu puteți utiliza ca cuvânt cheie pentru structuri (Tipuri de valori), deoarece nu au valoare nulă.

0
adăugat

Tiparea folosind "as" este, desigur, mult mai rapidă atunci când castul eșuează, deoarece evită costul de a arunca o excepție.

Dar nu este mai rapid atunci când distribuția reușește. Graficul de la http://www.codeproject.com/KB/cs/csharpcasts.aspx este înșelătoare, deoarece nu explică ce măsurază.

Linia de jos este:

  • Dacă vă așteptați ca distribuția să reușească (adică o eșec ar fi excepțională), utilizați distribuția.

  • Dacă nu știți dacă va reuși, utilizați operatorul "as" și testați rezultatul pentru null.

0
adăugat

O diferență între cele două abordări este aceea că prima ((SomeClass) obj) poate provoca o convertorul de tip care va fi apelat.

0
adăugat

Pentru cei cu experiență VB.NET, (tipul) este același ca și DirectCast, iar "ca tip" este același ca și TryCast.

0
adăugat