VB.NET'te nasıl yayın yapmalıyım?


151

Bunların hepsi eşit mi? Hangi şartlar altında birbirlerini seçmeliyim?

  • var.ToString ()

  • CStr (et var)

  • CType (var, Dize)

  • DirectCast (var, String)


DÜZENLEME: NotMyself'tan öneri

  • TryCast (var, String)

Yanıtlar:


156

Bunların hepsi biraz farklıdır ve genellikle kabul edilebilir bir kullanıma sahiptir.

  • var.ToString()ne tür olduğuna bakılmaksızın size bir nesnenin dize olarak temsilini verecektir. varZaten bir dize değilse bunu kullanın .
  • CStr(var)VB string döküm operatörüdür. Ben bir VB adamı değilim, bu yüzden bundan kaçınmayı öneririm, ama gerçekten hiçbir şeye zarar vermeyecek. Bence temelde aynı CType.
  • CType(var, String) verilen türü, sağlanan dönüştürme işleçlerini kullanarak bir dizeye dönüştürür.
  • DirectCast(var, String)bir nesneyi bir dizeye yükseltmek için kullanılır. Bir nesne değişkeninin aslında bir dize olduğunu biliyorsanız, bunu kullanın. Bu, (string)varC # ile aynıdır .
  • TryCast(@ NotMyself tarafından belirtildiği gibi) gibidir DirectCast, ancak Nothingdeğişken bir istisna atmak yerine bir dizeye dönüştürülemezse geri döner . Bu, var as stringC # ile aynıdır . TryCastMSDN'deki sayfa çok iyi bir karşılaştırma vardır.

15
CStr (var) yerine CType (var, String) kullanmak için hiçbir neden yoktur, aynı şeyi yaparlar.
Jonathan Allen

2
@Maslow TryCastsadece olabilir bir tür olması gerekir, çünkü değer türleri için çalışan Nothingbir değer olarak
bdukes

1
@Martinho oldukça doğru. Bu "sadece referans türü için çalışır" demek gerekir
bdukes

3
CStr(var)var DBNull.Value ise boğulur ve istisna oluşturur, ancak alternatif Convert.ToString(var)boş bir dize döndürür.
MCattle

Dim myList AS ArrayList=new ArrayListYazdığınızda (From e In myList select CType(e.Name,String)).ToArray()işe yaramıyor. Yazmaya geldim ... select CType(e.Name.ToString,String)).ToArray()ve gülüşümü aldım.
Bellash

13

Cstr() daha iyi performans için satır içi olarak derlenmiştir.

CType bir dönüşüm operatörü tanımlanmışsa türler arasında yayın yapılmasına izin verir

ToString() Taban tipi ve dize arasında dönüştürme mümkün değilse bir istisna atar.

TryParse()Dize'den tabana typeifmümkün aksi takdirde false döndürür

DirectCasttürler miras yoluyla ilişkilendirilirse veya ortak bir arabirimi paylaşırsa kullanılır, döküm mümkün değilse bir istisna atar trycast, bu örnekte hiçbir şey döndürmez


8

MSDN , belirli türler için Cxxx dökümlerinin satır içi koda dönüştürüldüğünden VB .NET'teki performansı artırabileceğini belirtiyor. Nedense, o da anlaşılacağı DirectCast CType hep kullanır oysa ben döküm aklı derleme zamanında kontrol edilir ve optimizasyonlar uygulanabilir demek olduğunu düşünüyoruz; (dokümantasyon miras ilişkisi varken bu kadar devletler bazı durumlarda CType aksine VB çalışma zamanı.)

VB .NET kod yazarken, kullandığım ne yaptığım bağlıdır. Eğer prototip kodunu atacaksam yazacağım şeyi kullanacağım. Eğer kod ciddiysem, bir Cxxx döküm kullanmaya çalışıyorum. Biri yoksa, kalıtım ilişkisi olduğuna dair makul bir inancım varsa DirectCast kullanıyorum. Oyuncunun başarılı olması gerektiği konusunda hiçbir fikrim olmadığı bir durumsa (örneğin, kullanıcı girişi -> tamsayılar), o zaman TryCast'i kullanıcıda bir istisna atmaktan daha kolay bir şey yapmak için kullanırım.

Sallayamadığım bir şey, CStr yerine ToString kullanma eğilimindeyim, ancak sözde Cstr daha hızlı.


8

Aşağıdaki sözdizimini tercih ederim:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Hah genellikle C # kod yazabilirsiniz söyleyebilirim. 8)

TryCast'ı tercih etmemin nedeni, döküm istisnalarının ek yükü ile uğraşmak zorunda kalmamanızdır. Oyuncunuz başarılı olur veya değişkeniniz null olarak başlatılır ve buna göre ilgilenirsiniz.


2
Bence hatalısın. TryCast kullanmak hiç de iyi bir fikir değil. sizinki gibi bir durumda, number.ToString () veya CStr (sayı) kullanılmalıdır.
Shimmy Weitzhandler

4
@Shimmy: TryCast'ı hiç kullanmamanın nedeni nedir? DirectCast'in belirli senaryolarda istisnadan kaçınması daha iyi değil mi?
Dienekes

3
@Dienekes ve NotMyself. TryCast sadece REFERENCE türleri içindir. Burada, bir VALUE türü olan bir Tamsayı var. Derleyici TryCast'i reddeder. Ayrıca, hedef bir dizedir. Hiçbir şey dışında herhangi bir .Net varlığı desteklemez .ToString(). Tamsayı gibi bir değer türü Hiçbir Şey olamaz. Bu durumda, CStr (sayı) veya sayı.ToString () güvenlidir. Genel durumda (sadece değer türleri değil), CStr (her ne olursa olsun) güvenlidir, çünkü Nothing (İşe Almaz) 'ı işleyebilir - sonuç String değişkeninde Nothing olur. TryCast çok faydalı - burada değil.
ToolmakerSteve

4

-1 çünkü DirectCast burada bahsetmek için uğraşmadığınız çok sınırlı bir durum dışında burada açıkça uygun DEĞİLDİR. İki İLGİLİ REFERANS TÜRÜNÜZ olduğunu bildiğinizde ve aralarında verimli bir döküm yapmak istediğinizde DirectCast iyidir. Soru a elde Stringetmekle ilgili olduğundan, OP'nin DirectCast'in uygun olduğu bir durumu tartışması pek olası değildir.
ToolmakerSteve

... Sorudan bahsetmemiş olsaydı Stringve ToStringşikayetim geçerli olmaz. Konuyu genel DÖNÜŞÜM'den daraltıncaya kadar DirectCast'i savunmamalısınız.
ToolmakerSteve

1

Sertifika sınavına göre, basit dönüşümler için mümkün olduğunda Convert.ToXXX () yöntemini kullanmalısınız çünkü performansı CXXX dönüşümlerinden daha iyi optimize eder.


1
FYI, Microsoft'taki Paul Vick'e göre, Cxxx operatörleri en azından 2004'te Convert.Toxxx işlevlerinden daha hızlıydı, çünkü Cxxx bir işlevi çağırmak yerine doğrudan IL'ye derliyor. Gerçeği şüpheli görünse de, işlev çağrılarını JIT-optimize etme yeteneği verildiğinde. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

Bir keresinde, daha hızlı olduğu için CStr () kullanmak için MSDN kitaplığı durumunu gördüğümü hatırlıyorum. Bunun doğru olup olmadığını bilmiyorum.


2
DirectCast, CStr'den daha hızlıdır, ancak bunu yalnızca bir dize nesnesini bir dize değişkenine dönüştürürken kullanabilirsiniz. Başka bir nesneyi dizeye dönüştürmeye çalışırsanız başarısız olur.
Jonathan Allen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.