Lití: (Newtype) vs. objekt jako Newtype

hlasů
79

Možné Duplicitní:
Odlévání vs pomocí ‚jako‘ klíčové slovo v CLR

Jaký je vlastně rozdíl mezi těmito dvěma odlitků?

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

Za normálních okolností by měly být oba explicitní odlitky do zadaného typu?

Položena 05/08/2008 v 16:42
zdroj uživatelem
V jiných jazycích...                            


13 odpovědí

hlasů
82

První z nich bude hodit výjimku v případě, že typ zdroje nelze házet do cílového druhu. Ten bude mít za následek SC2 bytí null referenci, ale bez výjimky.

[Upravit]

Můj původní odpověď je určitě nejvýraznější rozdíl, ale jako Eric Lippert poukazuje na to , že to není jediný. Další rozdíly jsou:

  • Nelze použít ‚jako‘ provozovatel obsazení s typem, který nepřijímá ‚null‘ jako hodnota
  • Nelze použít ‚jako‘ na převod věci, jako čísla do jiné reprezentace (float na int, například).

A konečně, s použitím ‚jako‘ vs. provozovatel odlitku, vy jste také říká: „Nejsem si jistý, jestli to bude mít úspěch.“

Odpovězeno 05/08/2008 v 16:44
zdroj uživatelem

hlasů
27

Všimněte si také, že můžete použít pouze jako klíčové slovo s referenčním typu nebo typu nullable

tj:

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

nebude sestavovat

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

bude sestavovat.

Odpovězeno 05/08/2008 v 17:15
zdroj uživatelem

hlasů
9

Obsadit pomocí „as“ je samozřejmě mnohem rychlejší při obsazení selže, protože se vyhýbá náklady na vyvolání výjimky.

Ale není to rychlejší při obsazení uspěje. Z grafu na http://www.codeproject.com/KB/cs/csharpcasts.aspx je zavádějící, protože to nevysvětluje, co se to měří.

Závěr je:

  • Máte-li očekávat, že obsazení na úspěch (tj neúspěch by být výjimečná), použijte nádech.

  • Pokud si nevíte, jestli to bude mít úspěch, použijte „jako“ operátor a otestovat výsledek NULL.

Odpovězeno 16/09/2008 v 20:21
zdroj uživatelem

hlasů
5

Rozdíl mezi těmito dvěma přístupy je, že první ((SomeClass) obj) může způsobit typ převodníku být volán.

Odpovězeno 08/11/2008 v 00:46
zdroj uživatelem

hlasů
4

No jen ‚jako‘ operátor „pomáhá“ vám pohřbít váš problém, jak nižší, protože je-li poskytována nekompatibilní instanci vrátí null, možná budete míjet, že na způsobu, který přejde do jiného a tak dále, a nakonec ti‘ ll dostat NullReferenceException který bude vaše ladění těžší.

Neber si to zneužívat. Přímý provozovatel obsazení je lepší v 99% případů.

Odpovězeno 28/10/2010 v 10:21
zdroj uživatelem

hlasů
4

Zde je dobrý způsob, jak si vzpomenout na proces, který každý z nich vyplývalo, že mohu použít, když se snaží rozhodnout, která je lepší pro mé okolnosti.

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

a další by měly být snadno uhodnout, co dělá

DateTime i = value as DateTime;

V prvním případě, pokud hodnota není možné házet, než je vyvolána výjimka v druhém případě, pokud hodnota nemůže být obsazen, i je nastaven na hodnotu null.

Takže v prvním případě pevný doraz je provedena v případě, že selže obsazení ve druhém obsazení měkké zastavení je vyroben a můžete narazit na NullReferenceException později.

Odpovězeno 05/08/2008 v 18:46
zdroj uživatelem

hlasů
3

Rozšířit na Rytmis komentáři , nemůžete použít jako klíčové slovo pro structs (typy hodnota), protože nemají žádnou hodnotu null.

Odpovězeno 07/09/2008 v 09:08
zdroj uživatelem

hlasů
2

To vše platí i pro referenční typy mohou typy hodnot nelze použít asklíčové slovo, protože nemůže být null.

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


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

Syntaxe cast je rychlejší, ale pouze tehdy, když úspěšný, je to mnohem pomalejší k nezdaru.

Nejvhodnější je použít as, když nevíte typ:

//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
}

Nicméně, pokud jste si naprosto jisti, že someObjectje instance SomeClasspak použijte obsazení.

NET 2 nebo vyšší generika znamenat, že budete velmi zřídka potřebují mít un-napsaný instance referenční třídy, takže tento je méně často používán.

Odpovězeno 18/09/2008 v 12:10
zdroj uživatelem

hlasů
1

A pro úplnost, Eric Lippert má blogu o rozdílu a některými výhradami.

Odpovězeno 09/10/2009 v 01:04
zdroj uživatelem

hlasů
1

Pro ty z vás s VB.NET zkušeností (typ) je stejný jako DirectCast a „jako typ“ je stejná jako TryCast.

Odpovězeno 16/09/2008 v 22:55
zdroj uživatelem

hlasů
1

Je to jako rozdíl mezi analyzovat a TryParse. Používáte TryParse když předpokládám, že může selhat, ale když máte silný jistotu, že bude bez problémů použít analyzovat.

Odpovězeno 08/08/2008 v 13:00
zdroj uživatelem

hlasů
1

Budou házet různé výjimky.
(): NullReferenceException
jako: InvalidCastException
která by mohla pomoci při ladění.

„Zachování“ klíčové slovo pokusy o obsazení objektu av případě obsazení selže, null je vrácena bez zásahu uživatele. The) Provozovatel cast (okamžitě vyvolá výjimku v případě obsazení selže.

„Používejte pouze C #‚jako‘klíčové slovo, kde se očekávají obsazení selhání v non-výjimečném případě. Pokud se počítají na obsazení uspět a nejsou připraveni přijímat veškeré předměty, které by se nezdaří, je třeba použít () cast operátor tak, že je to vhodné a užitečné výjimka.“

Pro příklady kódu a další vysvětlení: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Odpovězeno 05/08/2008 v 16:49
zdroj uživatelem

hlasů
1

Závorce cast výjimku, pokud pokus o obsazení selže. „Zachování“ odlitek vrací null, pokud se pokus o obsazení selže.

Odpovězeno 05/08/2008 v 16:45
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more