Aracılığıyla paylaş


Veri Türleri Sorunlarını Giderme (Visual Basic)

Bu sayfa, iç veri türleri üzerinde işlemler gerçekleştirdiğinizde oluşan bazı ortak sorunları listeler.

Kayan nokta ifade eşit karşılaştırmak değil

Kayan noktalı sayıları ile çalışırken (Single Veri Türü (Visual Basic) ve Double Veri Türü (Visual Basic)), ikili kesir olarak saklandıkları unutmayın.Bu ikili bir kesir değil herhangi bir miktar tam bir gösterimini otomarik yapamazsınız anlamına gelir (formun k / (2 ^ n) burada k ve n tamsayılardır).Yalnızca yaklaşık değerler 0,2 (= 1/5) ve (3/10 =) 0.3 olabilir ama örneğin 0.5 (= 1/2) ve (5/16 =) 0.3125 kesin değerleri tutulabilir.

Kayan nokta deðerlerinin üzerinde çalışır, bu nedenle imprecision, size kesin sonuçlar yeterli olmaz.Özellikle, teorik olarak eşit iki değer birbirinden biraz farklı sunularını olabilir.

Kayan nokta miktarlarını karşılaştırmak için

  1. Kullanarak kendi fark mutlak değerini hesaplamada Abs yöntemi, Math , sınıf System ad.

  2. Kabul edilebilir bir en büyük farkı, kendi fark büyük ise pratik amaçlar için eşit olacak şekilde iki miktarları dikkate almanız gerektiğini belirler.

  3. Kabul edilebilir bir değişikliğe farkının mutlak değerini karşılaştırın.

Aşağıdaki örnek, iki yanlış ve doğru karşılaştırma gösterir Double değerler.

Dim oneThird As Double = 1.0 / 3.0
Dim pointThrees As Double = 0.333333333333333

' The following comparison does not indicate equality. 
Dim exactlyEqual As Boolean = (oneThird = pointThrees)

' The following comparison indicates equality. 
Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)

MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &
    vbCrLf & "0.333333333333333 is represented as " &
    pointThrees.ToString("G17") &
    vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &
    vbCrLf & "Acceptable difference comparison generates " &
    CStr(practicallyEqual))

Yukarıdaki örnek ToString yöntemi, Double 'den daha iyi kesinlik belirtebilirsiniz böylece yapı CStr anahtar sözcüðünü kullanýr.15 Basamak varsayılandır ancak "G17" biçimi, 17 basamaklı genişletir.

Mod işleci doğru sonuç döndürmüyor

Kayan nokta depolama imprecision nedeniyle Mod İşleci (Visual Basic) işlenen en az bir kayan nokta olduğunda beklenmeyen bir sonuç döndürebilir.

Onluk Veri Türü (Visual Basic) Kayan noktalı gösterimi kullanmaz.İçinde tam olmayan birçok numaraları Single ve Double de kesin olan Decimal (örneğin, 0.2 ve 0,3).Aritmetik rağmen daha yavaş Decimal 'den kayan nokta, onu daha iyi kesinlik elde etmek için performans düşmesi olabilir.

Kayan nokta miktarları tamsayı kalanı bulmak için

  1. Değişkenler olarak bildirmek Decimal.

  2. Hazır karakteri kullanmak D için hazır zorlamak için Decimal, bunların değerleri için çok büyük olduğu durumlarda Long veri türü.

Aşağıdaki örnek kayan nokta işlenen imprecision potansiyeli göstermektedir.

Dim two As Double = 2.0
Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo

MsgBox("2.0 is represented as " & two.ToString("G17") &
    vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &
    vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &
    vbCrLf & "2.0 Mod 0.2 generates " &
    doubleRemainder.ToString("G17"))

Dim decimalRemainder As Decimal = 2D Mod 0.2D
MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))

Yukarıdaki örnek ToString yöntemi, Double 'den daha iyi kesinlik belirtebilirsiniz böylece yapı CStr anahtar sözcüðünü kullanýr.15 Basamak varsayılandır ancak "G17" biçimi, 17 basamaklı genişletir.

Çünkü zeroPointTwo olan Double, onun 0.2 sonsuza kadar yinelenen bir ikili kesir 0.20000000000000001 depolanan değeri değeridir.Bu miktardan 2.0 bölme 0.19999999999999991 kalanı ile 9.9999999999999995 üretir.

İfade için de decimalRemainder, hazır karakter D her iki işlenen zorlar Decimal, ve 0.2 kesin gösterimi vardır.Bu nedenle Mod operator 0.0 beklenen geri kalanı verir.

Bildirmek için yeterli olmadığını göz önünde bulundurun decimalRemainder olarak Decimal.Rakamları zorlamanız gerekir Decimal, ya da kullandıkları Double varsayılan olarak ve decimalRemainder aynı yanlış değeri alır doubleRemainder.

Boolean türü sayısal tür doğru olarak dönüştürmez

Boole Veri Türü (Visual Basic)değerleri sayı olarak saklanmaz ve depolanan değerleri sayılara eşdeğer olması amaçlanmamıştır.Önceki sürümlerle uyumluluk için Visual Basic dönüştürme anahtar sözcükler sağlar (CType İşlevi (Visual Basic), CBool, CInt, vb.) arasında dönüştürmek için Boolean ve sayısal türler.Ancak, başka dillerde bazen bu dönüşümleri gibi farklı şekilde gerçekleştirmek .NET Framework yöntemleri.

Hiçbir zaman için eşdeğer sayısal değerlere dayanan kod yazması gerektiğini True ve False.Mümkün olan her durumda, kullanımını kısıtlamak Boolean , bunlar tasarlanmıştır mantıksal değerleri değişkenlere.Karıştırmak gerekir, Boolean ve sayısal değerler seçtiğiniz dönüştürme yöntemi anladığınızdan emin olun.

Visual Basic'te dönüştürme

Kullandığınızda CType veya CBool dönüştürmek için sayısal veri türleri için dönüştürme anahtar sözcükler Boolean, 0 olur False ve diğer tüm değerler haline True.Dönüştürdüğünüzde Boolean dönüştürme anahtar sözcükleri kullanarak sayısal türleri için değerler False 0 olur ve True -1 olur.

Çerçevesindeki dönüştürme

ToInt32 Yöntemi, Convert , sınıf System ad dönüştürür True + 1 için.

Dönüştürmeniz gerekir, bir Boolean değer bir sayısal veri türü, dikkatli olun, hakkında hangi dönüştürme yöntemini kullanın.

Hazır bilgi karakteri derleyici hatası oluşturur.

Herhangi bir tür karakteri olmadığında Visual Basic varsayılan veri türleri için hazır varsayar.Karakter sabiti için varsayılan türü — tırnak işaretleri içine (" ") — olan String.

String Veri türü değil genişletmek için Char Veri Türü (Visual Basic).Bir sabit atamak istiyorsanız, yani bir Char değişken, daraltma dönüşümü yapmak veya zorlamak için hazır Char türü.

Bir değişken veya sabit atamak için hazır bir karakter oluşturmak için

  1. Değişken veya sabit olarak bildirmek Char.

  2. Karakter değeri tırnak işaretleri içine alın (" ").

  3. Hazır karakteri ile kapanış çift tırnak işareti izleyin C değişmez zorlamak için Char.Bu tür denetlemesi anahtarı gereklidir (Option Strict Deyimi) ise On, ve her durumda tercih edilir.

Aşağıdaki örnek, hem başarısız hem de başarılı bir literal atamalarını gösterir bir Char değişkeni.

Dim charVar As Char 
' The following statement attempts to convert a String literal to Char. 
' Because Option Strict is On, it generates a compiler error.
charVar = "Z" 
' The following statement succeeds because it specifies a Char literal.
charVar = "Z"c
' The following statement succeeds because it converts String to Char.
charVar = CChar("Z")

Her zaman bir riski yoktur daraltma dönüşümler kullanarak çalışma zamanında başarısız olabilir çünkü.Örneğin, dönüştürme String için Char , başarısız String değeri birden fazla karakter içeriyor.Bu nedenle, onu daha iyi kullanmak için programlama C karakter yazın.

Çalışma zamanında dize dönüştürme başarısız

Dize Veri Türü (Visual Basic) Çok az sayıda widening dönüşümler katılır.Stringyalnızca kendisini widens ve Objectve yalnızca Char ve Char() (bir Char dizisi) genişletmek için String.Bu, çünkü String değişkenleri ve sabitleri diğer veri türleri bulunamaz değerleri içerebilir.

Ne tür denetlemesi geçiş (Option Strict Deyimi) ise On, derleyici daraltma örtük dönüştürmeler izin vermez.Bu maddelerle ilgili olanlar içerir String.Kodunuzu dönüştürme anahtar sözcükler gibi kullanmaya devam edebilirsiniz CStr ve CType İşlevi (Visual Basic), hangi doğrudan .NET Framework dönüştürme girişimi için.

[!NOT]

Daraltmaya dönüştürme hatası türünden öğeleri için bastırılmış bir For Each…Next döngü denetim değişkeni koleksiyonu."Daraltmaya dönüşümlerini" bölümünde daha fazla bilgi ve örnekler için bkz: For Each...Next Deyimi (Visual Basic).

Daraltma dönüşümü koruma

Dönüşümleri daraltmaya dezavantajı bunlar zamanında başarısız olur.Örneğin, bir String değişkenini içeren, herhangi bir şey, "Doğru" veya "Yanlış," bunu dönüştürülemez dışında Boolean.Noktalama karakterleri içeriyorsa, herhangi bir sayısal tür dönüştürme başarısız olur.Bilmiyorsanız, bilgisayarınızın String değişken her zaman hedef türü kabul edebileceği değerler tutan, dönüştürme denememelisiniz.

Dönüştürmeniz gerekir, String başka bir veri türü için en güvenli Denenen dönüşüme içine yordamdır Try...Catch...Finally Deyimi (Visual Basic).Bu, bir çalışma zamanı hatası ile ilgilenme sağlar.

Karakter dizileri

Tek bir Char ve bir dizi Char öğeleri genişletmek için her ikisi de String.Ancak, String için genişletmek değil Char().Dönüştürmek için bir String değeri bir Char , dizi kullanabilirsiniz ToCharArray yöntemi, String sınıfı.

Anlamsız değerler

Genel olarak, String değerler diğer veri türleri anlamlı değildir ve dönüştürme, oldukça yapay ve tehlikeli değildir.Kullanımını mümkün olan her durumda kısıtlamak String , bunlar tasarlanmıştır, karakter dizileri değişkenleri.Hiçbir zaman diğer türleri eşdeğer değerlere dayanır kodu yazmanız gerekir.

Ayrıca bkz.

Başvuru

Veri Türü Özeti (Visual Basic)

Tür Dönüştürme İşlevleri (Visual Basic)

Kavramlar

Visual Basic'de Veri Türleri

Tür Karakterleri (Visual Basic)

Değer Türleri ve Başvuru Türleri

Veri Türlerinin Etkili Kullanımı (Visual Basic)

Diğer Kaynaklar

Visual Basic'de Tür Dönüştürmeleri