Döküm: (newtype) newtype olarak Nesne vs

oy
79

Olası Çoğalt:
CLR anahtar kelime 'olarak' kullanarak vs Döküm

Aslında bu iki atmalarını arasındaki fark nedir?

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

Normalde, her ikisi de belirtilen türe açık yayınları olmalıdır?

Oluştur 05/08/2008 saat 16:42
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
82

Kaynak türü hedef tür atama edilemezse eski bir özel durum oluşturur. İkincisi Boş bir başvuru olması SC2, ancak hiçbir istisna sonuçlanacaktır.

[Düzenle]

Benim asıl cevap kesinlikle en belirgin fark, ancak Eric Lippert'ın olarak dikkat çekiyor , sadece bir tane değil. Diğer farklılıklar:

  • Bir değer olarak 'sıfır' kabul etmeyen bir tür atama için 'olarak' operatörünü kullanamazsınız
  • Sen hiç 'olarak' kullanamaz dönüştürmek (örneğin, int, kayan), farklı bir temsil numaraları gibi şeyler.

Ve son olarak, kullanarak döküm operatörü vs, ayrıca söylüyorsun 'olarak' "Ben bu başarılı olacaktır emin değilim."

Cevap 05/08/2008 saat 16:44
kaynak kullanıcı

oy
27

Ayrıca sadece bir referans türü veya bir null türü ile anahtar kelime olarak kullanabilirsiniz unutmayın

yani:

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

derlemek olmaz

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

derleyecek.

Cevap 05/08/2008 saat 17:15
kaynak kullanıcı

oy
9

Dökme başarısız olduğunda bunun bir istisna atma masrafını ortadan kaldırdığı, çok daha hızlı elbette "olarak" seçeneğini kullanarak typecasting.

Ama dökme başarılı değilken hızlıdır. Kısmındaki grafik http://www.codeproject.com/KB/cs/csharpcasts.aspx o ölçme sebebini açıklamak değil çünkü yanıltıcı.

Kısacası:

  • Eğer (yani bir başarısızlık istisnai olurdu) dönüştürmenin başarılı bekliyorsanız, bir döküm kullanın.

  • o başarılı olur eğer bilmiyorsanız "olarak" operatörünü kullanabilirsiniz ve boş sonucunu test edin.

Cevap 16/09/2008 saat 20:21
kaynak kullanıcı

oy
5

Iki yaklaşım arasındaki bir fark, birinci ((SomeClass) obj) bir neden olmasıdır türü dönüştürücü çağrılacak.

Cevap 08/11/2008 saat 00:46
kaynak kullanıcı

oy
4

Eh 'olarak' operatörü senin sorunun yolu alt gömmek "yardımcı" 'da size nihayet başkasına geçmek ve benzeri olacak ve bunun uyumsuz bir örneğini temin edildiğinde o boş dönecektir çünkü, belki bir yönteme o geçmek olacak ll zor senin hata ayıklama yapacak bir NullReferenceException olsun.

Bunu kötüye kullanma. direkt döküm operatörü vakaların% 99 daha iyidir.

Cevap 28/10/2010 saat 10:21
kaynak kullanıcı

oy
4

İşte bunların her zaman durum için daha iyi olduğuna karar vermek çalışırken kullandıkları izleyin süreci hatırlamak için iyi bir yoldur.

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

ve bir sonraki ne yaptığını tahmin etmek kolay olmalı

DateTime i = value as DateTime;

değeri döküm edilemezse bir istisna dışında döküm edilemez değeri ikinci durumda atılmış ise birinci durumda, ben boş olarak ayarlanır.

Dökme yumuşak durma yapılır ikinci alçıda başarısız olur ve daha sonra bir NullReferenceException karşılaşabileceğiniz Yani birinci durumda sert bir durma yapılır.

Cevap 05/08/2008 saat 18:46
kaynak kullanıcı

oy
3

Genişletmek için Rytmis yorumuyla , kullanmak olamaz olarak onlar boş bir değere sahip olduğu, yapılar (Değer Türleri) için anahtar kelime.

Cevap 07/09/2008 saat 09:08
kaynak kullanıcı

oy
2

Bu her türlü, değer türleri kullanamaz başvurmak için geçerlidir asonlar boş olamaz olarak anahtar kelimeyi.

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


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

Dökme sözdizimi hızlıdır, fakat sadece zaman başarılı, başarısız çok yavaştır.

En iyi uygulama kullanmaktır asEğer türünü bilmiyorum:

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

Ancak bu kesinlikle eminseniz someObjectbir örneğidir SomeClasssonra döküm kullanın.

Net 2'de veya jenerik Yukarıdaki çok nadiren bir başvuru sınıfının bir un-daktilo örneği olması gerekir, bu nedenle ikinci az sıklıkla kullanılır anlamına gelir.

Cevap 18/09/2008 saat 12:10
kaynak kullanıcı

oy
1

Ve bütünlük uğruna, Eric Lippert'ın bir blog yazısı vardır fark ve bazı uyarılar hakkında.

Cevap 09/10/2009 saat 01:04
kaynak kullanıcı

oy
1

VB.NET tecrübesi, (tip) ile olanlar için DirectCast aynıdır ve "türü olarak" TryCast aynıdır.

Cevap 16/09/2008 saat 22:55
kaynak kullanıcı

oy
1

Bu Parse ve TryParse arasındaki fark gibi. Eğer başarısız olabilir beklemek zaman TryParse kullanır, ancak güçlü bir güvence olduğunda bunu Ayrıştırma kullanmak başarısız olmaz.

Cevap 08/08/2008 saat 13:00
kaynak kullanıcı

oy
1

Farklı istisnalar atmak gerekir.
(): NullReferenceException
ınvalidcastexception: olarak
hata ayıklama için yardımcı olabilir.

"Olarak" anahtar kelime girişimleri nesne artığını ve döküm başarısız olursa, boş sessizce döndürülür. Dökme başarısız olursa () dökme operatörü hemen bir özel durum oluşturur.

olmayan bir istisnai durumlarda başarısız döküm bekliyoruz anahtar kelime 'olarak "Yalnızca C # kullanmak'. Eğer başarılı olmak için bir döküm güveniyor ve hazırlıksız Eğer başarısız olur herhangi bir nesne almak için, kullanmak gerekir () uygun ve yararlı istisnası atılır, böylece operatörü attı."

Kod örnekleri ve daha ayrıntılı bir açıklaması için: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Cevap 05/08/2008 saat 16:49
kaynak kullanıcı

oy
1

Dökme girişimi başarısız olursa parantez döküm bir istisna atar. Dökme girişimi başarısız olursa "olarak" dökme null döndürür.

Cevap 05/08/2008 saat 16:45
kaynak kullanıcı

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