VB.NET'te A Sınıfı Statiğini İşaretleme


85

Yeni bir soru ve cevapta belirtildiği gibi , statik bir sınıftan miras alamazsınız. VB.NET içindeki statik sınıflarla birlikte gelen kurallar nasıl uygulanır? Çerçeve C # ve VB arasında uyumlu olduğundan, bir sınıfı statik olarak işaretlemenin bir yolu olacağı mantıklı olacaktır, ancak bir yolu yok gibi görünüyor.

Yanıtlar:


121

Module == statik sınıf

Yalnızca miras alamayacağınız bir sınıf istiyorsanız, bir sınıf kullanın NotInheritable; ancak statik / Paylaşımlı olmayacak. Tüm yöntemleri, özellikleri ve üyeleri olarak işaretleyebilirsiniz Shared, ancak bu, derleyici tarafından uygulanmadığı için C # 'daki statik sınıfla kesinlikle aynı şey değildir.

Gerçekten VB.Net'in bir C # statik sınıfına eşdeğer olmasını istiyorsanız, bir Module. Devralınamaz ve tüm üyeler, özellikler ve yöntemler statiktir / paylaşılır.


2
Önceki yorumumu geri çekiyorum. Reflektördeki bir modüle bakıyordum ve IL onu kapalı olarak gösteriyor.
MagicKat

27
VBer mısınız? Modül, bir ad alanı gibidir. Tüm VB fonksiyonları, VB'nin modüllerinden içe aktarılır ve genel kapsamda mevcuttur. Bence vb'deki statik bir sınıf bir modül değildir, farklı davranışları vardır. vb 'de' statik sınıf 'davranışını istiyorsanız, NotInheritable'a sahip olmalısınız ve tüm üyelerini' Shared 'olarak bildirmelisiniz, tıpkı C #' ın statik sınıfında yapmanız gerektiği gibi, AYNI davranacaklardır. Bir modül DEĞİL.
Shimmy Weitzhandler

2
@Shimmy Bu yorumu daha önce nasıl kaçırdım bilmiyorum ama yanılıyorsun. Oluşturulan IL'ye bakın ve modüller statik sınıfla tam olarak aynı muameleyi görür. VB, eski standart işlevlerin genel kapsamda görünmelerini sağlamak için fazladan iş yapar.
Joel Coehoorn

2
@JoelCoehoorn Module - Statik sınıf çünkü bir Modül doğrudan bir isim alanında bildirilmelidir. Bu, bir Modül veya Sınıf içinde bir Modül ilan edilemeyeceği anlamına gelir.
LosManos

20
Aynı IL bilmek iyidir, ama VB ek modüller ve statik sınıflar sona gerçeğini @JoelCoehoorn teşvik içeren ad alanına bir modülün üyeleri. Tanıtım modülleri ve statik sınıfları büyük bir fark var, pratik kullanımı ve IMHO farklılık nerede yönüdür. Ben çok daha fazla NotInheritable - boş özel kurucu - tüm üyelerin paylaştığı çözümü tercih ederim çünkü üyelere yalnızca sınıf aracılığıyla ulaşılabilir, bu da statik sınıf eşdeğerliği elde etmeye çalışıyorsanız çok daha doğru bir davranış. IL farklı olabilir, ama bu gerçekten akademik.
misha256

51

Neredeyse. Siz de somutlaştırmayı önlemelisiniz.

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Paylaşılan, statik sınıf yöntemi gibidir.
  • Devralınamaz, mühürlenmiş gibidir.
  • Özel Yeni, statik sınıfın somutlaştırılamayacağı gibidir.

Bakınız:
MSDN - Statik Sınıflar ve Statik Sınıf Üyeleri


2
neden bu kabul edilen cevap değil? Kod
parçacığı

6

Yalnızca miras alamayacağınız bir sınıf oluşturmak istiyorsanız, C # 'da Sealed' ı ve VB.Net 'te NotInheritable' u kullanabilirsiniz.

Statik VB.Net eşdeğeri paylaşılır.


C # statik sınıfında yapmanız gerektiği gibi değişkenlerini ve işlevlerini paylaşılan olarak işaretlersiniz. Devralınamaz olarak işaretlemek, onu mühürlü hale getirir.
Shimmy Weitzhandler

5

Vb.net'te statik sınıf oluşturabilirsiniz. Çözüm şudur

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

AGE değişkeni genel statiktir, bunu başka bir kodda bunun gibi kullanabilirsiniz

 Dim myage As Integer = DB.AGE

Arkadaş = genel, Devralınamaz = statik


3
! Arkadaş = kamu, Arkadaş iç =
Altair

1
Devralınamaz! = Statik, Devralınamaz == mühürlü
Magnus

myage! = 20 (artık, ne yazık ki)
Grim

2

CLR bakış açısına göre, C # statik sınıfı sadece "mühürlenmiş" ve "soyut" sınıftır. Soyut olduğu için bir örnek oluşturamazsınız ve mühürlendiği için ondan miras alamazsınız. Gerisi sadece biraz derleyici sihri.

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.