Tanımlama grupları (Visual Basic)
Visual Basic 2017 ' den itibaren Visual Basic dili, tanımlama gruplarını oluşturmayı ve tanımlama gruplarının öğelerine erişimi kolaylaştıran tanımlama grupları için yerleşik destek sunar. Kayıt düzeni, belirli bir sayı ve değer dizisi olan basit bir veri yapısıdır. Kayıt kümesini örneklediğinizde, her bir değerin (veya öğesinin) numarasını ve veri türünü tanımlarsınız. Örneğin, 2 demet (veya çift) iki öğeye sahiptir. İlki Boolean bir değer, ikincisi ise bir değer olabilir String . Tanımlama grupları birden çok değeri tek bir nesnede depolamayı kolaylaştırdığından, genellikle bir yöntemden birden çok değer döndürmenin hafif bir yolu olarak kullanılırlar.
Önemli
Tanımlama grubu desteği ValueTuple türü gerektirir. .NET Framework 4,7 yüklü değilse, NuGet galerisinde bulunan NuGet paketini eklemeniz gerekir System.ValueTuple . Bu paket olmadan şuna benzer bir derleme hatası alabilirsiniz, "önceden tanımlanmış tür ' ValueTuple (Of,,,) ' tanımlanmamış veya içeri aktarılmaz."
Tanımlama grubu örneği oluşturma ve kullanma
Virgülle ayrılmış değerleri parantez içine alarak bir tanımlama grubu örnekleyebilirsiniz. Bu değerlerin her biri, kayıt düzeni alanı haline gelir. Örneğin, aşağıdaki kod, Date birinci değeri,, String ikincisinin ve üçüncü olarak bir ile bir üçlü (veya 3-kayıt) tanımlar Boolean .
Dim holiday = (#07/04/2017#, "Independence Day", True)
Varsayılan olarak, bir tanımlama grubu içindeki her alanın adı, dizenin Item kayıt düzeninde tek tabanlı konumuyla birlikte dizeden oluşur. Bu 3 tanımlama grubu için alan, alanı Date Item1 String Item2 ve Boolean alanıdır Item3 . Aşağıdaki örnek, önceki kod satırında oluşturulan kayıt kümesi alanlarının değerlerini görüntüler
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 7/4/2017 12:00:00 AM Is Independence Day, a national holiday
Visual Basic bir tanımlama grubu alanları okuma-yazma; bir tanımlama grubu örnekledikten sonra, değerlerini değiştirebilirsiniz. Aşağıdaki örnek, önceki örnekte oluşturulan kayıt düzeninin üç alanının ikisini değiştirir ve sonucu görüntüler.
holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday
Adlandırılmış bir tanımlama grubu örneği oluşturma ve kullanma
Bir tanımlama grubu alanları için varsayılan adları kullanmak yerine, kendi adlarınızı kayıt düzeni öğelerine atayarak adlandırılmış bir tanımlama grubu örneğini oluşturabilirsiniz. Kayıt düzeni alanlarına, kendilerine atanan adlarıyla veya varsayılan adlarıyla erişilebilir. Aşağıdaki örnek, ilk alanı EventDate , ikincisini ve üçüncü kez açıkça isimlendiren şekilde, daha önceden aynı 3 kayıt hattı oluşturur Name IsHoliday . Ardından alan değerlerini görüntüler, değiştirir ve alan değerlerini yeniden görüntüler.
Dim holiday = (EventDate:=#07/04/2017#, Name:="Independence Day", IsHoliday:=True)
Console.WriteLine($"{holiday.EventDate} Is {holiday.Name}" +
$"{If(holiday.IsHoliday, ", a national holiday", String.Empty)}")
holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
$"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' The example displays the following output:
' 7/4/2017 12:00:00 AM Is Independence Day, a national holiday
' 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday
Gösterilen demet öğesi adları
Visual Basic 15,3 ' den başlayarak, Visual Basic demet öğelerinin adlarını çıkarabilir; Bunları açıkça atamanız gerekmez. Çıkarsanan tanımlama grubu adları, bir dizi değişkenden bir tanımlama grubu başlattığınızda ve demet öğesi adının değişken adıyla aynı olmasını istediğinizde faydalıdır.
Aşağıdaki örnek, stateInfo açıkça adlandırılmış üç öğe,, state , ve içeren bir tanımlama grubu oluşturur stateName capital . Öğeleri adlandırırken, demet başlatma bildiriminin adlandırılmış öğeleri, aynı adlı değişkenlerin değerlerini atadığını unutmayın.
Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state:=state, stateName:=stateName, capital:=capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.state}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing
öğeler ve değişkenler aynı ada sahip olduğundan, aşağıdaki örnekte gösterildiği gibi Visual Basic derleyici alanların adlarını çıkarsalabilir.
Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing
gösterilen demet öğesi adlarını etkinleştirmek için, Visual Basic projesi ( * . vbproj) dosyanızda kullanmak üzere Visual Basic derleyicisinin sürümünü tanımlamanız gerekir:
<PropertyGroup>
<LangVersion>15.3</LangVersion>
</PropertyGroup>
sürüm numarası, 15,3 ile başlayan Visual Basic derleyicisinin herhangi bir sürümü olabilir. belirli bir derleyici sürümünü sabit kodlamak yerine, LangVersion sisteminizde yüklü Visual Basic derleyicisinin en son sürümüyle derlemek için "en son" değerini de belirtebilirsiniz.
daha fazla bilgi için, Visual Basic dil sürümünü ayarlamabölümüne bakın.
bazı durumlarda Visual Basic derleyici, aday adından demet öğesi adını çıkarsamaz ve demet alanına yalnızca varsayılan adı kullanılarak başvurulabilir, örneğin, Item1 Item2 vb. Bunlar şunları içerir:
Aday adı,, veya gibi bir demet üyesinin adı ile aynıdır
Item3RestToString.Aday adı kayıt düzeninde yinelenir.
alan adının çıkarımı başarısız olduğunda, Visual Basic bir derleyici hatası oluşturmaz veya çalışma zamanında oluşturulan bir özel durumdur. Bunun yerine, demet alanlarına, ve gibi önceden tanımlanmış adlarıyla başvurulmalıdır Item1 Item2 .
Tanımlama grupları ve yapılar
Visual Basic tanımlama grubu, System. valuetuple genel türlerinden birinin bir örneği olan bir değer türüdür. Örneğin, holiday Önceki örnekte tanımlanan kayıt düzeni yapının bir örneğidir ValueTuple<T1,T2,T3> . Veriler için hafif bir kapsayıcı olacak şekilde tasarlanmıştır. Kayıt düzeni, birden fazla veri öğesiyle bir nesne oluşturmayı kolaylaştıran bir özel yapının sahip olabileceği bazı özelliklerden oluşur. Bu modüller şunlardır:
Özel Üyeler. Tanımlama grubu için kendi özelliklerinizi, yöntemlerinizi veya olaylarını tanımlayamazsınız.
Doğrulamasına. Alanlara atanan verileri doğrulayamazsınız.
Değiştirilemezlik. Visual Basic tanımlama grupları değişebilir. Buna karşılık, özel bir yapı, bir örneğin değişebilir mi yoksa sabit mi olduğunu denetlemenize olanak tanır.
özel üyeler, özellik ve alan doğrulama veya imlik kullanılabilirliği önemliyse, bir özel değer türü tanımlamak için Visual Basic yapısı ifadesini kullanmanız gerekir.
Visual Basic bir tanımlama grubu, değer etuple türünün üyelerini devralınır. Alanlarına ek olarak, bunlar aşağıdaki yöntemleri içerir:
| Yöntem | Açıklama |
|---|---|
| CompareTo | Geçerli tanımlama grubunu aynı sayıda öğeye sahip başka bir tanımlama grubu ile karşılaştırır. |
| Eşittir | Geçerli tanımlama grubunun başka bir demet veya nesneye eşit olup olmadığını belirler. |
| GetHashCode | Geçerli örnek için karma kodu hesaplar. |
| ToString | Bu tanımlama grubunun dize gösterimini döndürür. Bu, formunu alır (Item1, Item2...) Item1 ve Item2 kayıt düzeni alanlarının değerlerini temsil eder. |
Ayrıca, Valuetuple türleri IStructuralComparable IStructuralEquatable , ve arabirimlerini özel Karşılaştırıcılar tanımlamanızı sağlayacak şekilde uygular.
Atama ve tanımlama grupları
Visual Basic, aynı sayıda alana sahip demet türleri arasında atamayı destekler. Aşağıdakilerden biri doğruysa alan türleri dönüştürülebilir:
Kaynak ve hedef alanı aynı türde.
Kaynak türü için bir genişletme (veya örtük) hedef türüne dönüştürme tanımlanır.
Option Strict``On, ve kaynak türün hedef türüne bir daraltma (veya açık) dönüştürmesi tanımlanmıştır. Bu dönüştürme, kaynak değer hedef türü aralığının dışındaysa bir özel durum oluşturabilir.
Diğer dönüşümler atamalar için değerlendirilmez. Demet türleri arasında izin verilen atama türlerine bakalım.
Aşağıdaki örneklerde kullanılan değişkenleri göz önünde bulundurun:
' The number and field types of all these tuples are compatible.
' The only difference Is the field names being used.
Dim unnamed = (42, "The meaning of life")
Dim anonymous = (16, "a perfect square")
Dim named = (Answer:=42, Message:="The meaning of life")
Dim differentNamed = (SecretConstant:=42, Label:="The meaning of life")
İlk iki değişken unnamed ve anonymous , alanlar için belirtilen semantik adlara sahip değildir. Alan adları varsayılan Item1 ve ' dir Item2 . Son iki değişken named ve differentName anlamsal alan adlarına sahip. Bu iki tanımlama alanının alanlar için farklı adlara sahip olduğunu unutmayın.
Bu başlıkların dördü, aynı sayıda alana sahiptir (' parametre sayısı ' olarak adlandırılır) ve bu alanların türleri aynıdır. Bu nedenle, bu atamaların hepsi çalışır:
' Assign named to unnamed.
named = unnamed
' Despite the assignment, named still has fields that can be referred to as 'answer' and 'message'.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output: 42, The meaning of life
' Assign unnamed to anonymous.
anonymous = unnamed
' Because of the assignment, the value of the elements of anonymous changed.
Console.WriteLine($"{anonymous.Item1}, {anonymous.Item2}")
' Output: 42, The meaning of life
' Assign one named tuple to the other.
named = differentNamed
' The field names are Not assigned. 'named' still has 'answer' and 'message' fields.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output: 42, The meaning of life
Başlıkların adlarının atanmadığından emin olun. Alanların değerleri, kayıt grubundaki alanların sırasını izleyerek atanır.
Son olarak, named conversion ilk alanı named bir, Integer ve ' nin ilk alanı bir olan olan ' a sahip olsa da, kayıt kümesini tanımlama grubu conversion atayabiliriz Long . Bu atama başarılı oldu çünkü bir Integer öğesine dönüştürme Long , genişleyen bir dönüştürme.
' Assign an (Integer, String) tuple to a (Long, String) tuple (using implicit conversion).
Dim conversion As (Long, String) = named
Console.WriteLine($"{conversion.Item1} ({conversion.Item1.GetType().Name}), " +
$"{conversion.Item2} ({conversion.Item2.GetType().Name})")
' Output: 42 (Int64), The meaning of life (String)
Farklı sayıda alan içeren diziler atanamaz:
' Does not compile.
' VB30311: Value of type '(Integer, Integer, Integer)' cannot be converted
' to '(Answer As Integer, Message As String)'
var differentShape = (1, 2, 3)
named = differentShape
Yöntem dönüş değerleri olarak tanımlama grubu
Bir yöntem yalnızca tek bir değer döndürebilir. Genellikle, bir yöntem çağrısını birden çok değer döndürecek şekilde istersiniz. Bu kısıtlamayı geçici olarak çözmek için birkaç yol vardır:
Özellikleri veya alanları yöntemi tarafından döndürülen değerleri temsil eden özel bir sınıf veya yapı oluşturabilirsiniz. Bu nedenle ağır bir çözümdür; yalnızca amacı bir yöntem çağrısından değerleri almak olan özel bir tür tanımlamanızı gerektirir.
Yönteminden tek bir değer döndürebilir ve diğer değerleri yöntemine başvuruya göre geçirerek döndürebilirsiniz. Bu, başvuruya göre geçirdiğiniz değişkenin değerinin yanlışlıkla üzerine yazılması için bir değişken ve riskleri örnekleyerek oluşan ek yükünü içerir.
Birden çok dönüş değerini almak için basit bir çözüm sağlayan bir tanımlama grubu kullanabilirsiniz.
Örneğin, .NET 'teki Tryparo yöntemleri Boolean ayrıştırma işleminin başarılı olup olmadığını gösteren bir değer döndürür. Ayrıştırma işleminin sonucu, metoduna verilen başvuruya göre geçirilen bir değişkende döndürülür. Normalde, gibi bir ayrıştırma yöntemine yapılan çağrı Int32.TryParse aşağıdaki gibi olur:
Dim numericString As String = "123456"
Dim number As Integer
Dim result = Int32.TryParse(numericString, number)
Console.WriteLine($"{If(result, $"Success: {number:N0}", "Failure")}")
' Output: 123,456
Çağrıyı kendi yöntemimizde yöntemine sarmalarsanız ayrıştırma işleminden Int32.TryParse bir tuple geri dönebilirsiniz. Aşağıdaki örnekte yöntemini NumericLibrary.ParseInteger çağıran Int32.TryParse ve iki öğeli adlandırılmış bir tuple döndürür.
Imports System.Globalization
Public Module NumericLibrary
Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
Dim number As Integer
Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module
Ardından aşağıdakine benzer bir kodla yöntemini çağırabilirsiniz:
Dim numericString As String = "123,456"
Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
' Output: Success: 123,456
Visual Basic içinde .NET Framework
Örnek Visual Basic, 4.7'de tanıtmış olan System.ValueTuple genel türlerinden .NET Framework örneğidir. Bu .NET Framework bir dizi genel System.Tuple sınıfı da içerir. Ancak bu sınıflar, Visual Basic ve System.ValueTuple genel türlerinden farklı olabilir:
Tuple sınıflarının öğeleri , ve gibi
Item1Item2özelliklerdir. Bu Visual Basic ve ValueTuple türleri için, tuple öğeleri alanlardır.Bir Tuple örneğinin veya ValueTuple örneğinin öğelerine anlamlı adlar atayamazsiniz. Visual Basic, alanların anlamını iletir adlar atamaya olanak sağlar.
Bir Tuple örneğinin özellikleri salt okunur; uples sabittir. Bu Visual Basic ve ValueTuple türleri için, tuple alanları okuma-yazmadır; uples, tarifelidir.
Genel Tuple türleri başvuru türleridir. Bu Tuple türlerinin kullanımı, nesnelerinocating anlamına gelir. Bu durum, sıcak yollarda, uygulama performansının ölçülebilir bir etkisi olabilir. Visual Basic ve ValueTuple türleri değer türleridir.
sınıfındaki uzantı TupleExtensions yöntemleri, grup ve .NET Visual Basic arasında dönüştürmeyi kolaylaştırır. ToTuple yöntemi bir Visual Basic bir .NET Tuple nesnesine dönüştürür ve ToValueTuple yöntemi bir .NET Tuple nesnesini bir .NET Tuple nesnesine Visual Basic dönüştürür.
Aşağıdaki örnek bir kayıtple oluşturur, bir .NET Tuple nesnesine dönüştürür ve bir kayıt Visual Basic dönüştürür. Örnek daha sonra eşit olduğundan emin olmak için bu tuple'ı özgün ile karşılar.
Module Example
Sub Main()
Dim cityInfo = (name:="New York", area:=468.5, population:=8_550_405)
Console.WriteLine($"{cityInfo}, type {cityInfo.GetType().Name}")
' Convert the Visual Basic tuple to a .NET tuple.
Dim cityInfoT = TupleExtensions.ToTuple(cityInfo)
Console.WriteLine($"{cityInfoT}, type {cityInfoT.GetType().Name}")
' Convert the .NET tuple back to a Visual Basic tuple and ensure they are the same.
Dim cityInfo2 = TupleExtensions.ToValueTuple(cityInfoT)
Console.WriteLine($"{cityInfo2}, type {cityInfo2.GetType().Name}")
Console.WriteLine($"{NameOf(cityInfo)} = {NameOf(cityInfo2)}: {cityInfo.Equals(cityInfo2)}")
Console.ReadLine()
End Sub
End Module
' The example displays the following output:
' (New York, 468.5, 8550405), type ValueTuple`3
' (New York, 468.5, 8550405), type Tuple`3
' (New York, 468.5, 8550405), type ValueTuple`3
' cityInfo = cityInfo2 : True