VB.NET'teki Sınıflar ve Modüller


157

VB.NET'te Paylaşılan üye işlevlerine sahip Sınıflar yerine Modüller kullanmak kabul edilebilir bir uygulama mıdır?

Modüllerden kaçınma eğilimindeyim, çünkü artık Visual Basic 6.0'dan artık kalıyorlar ve artık gerçekten sığmıyor gibi görünüyorlar. Öte yandan, bir Modül ve sadece Paylaşılan üyelerin bulunduğu bir Sınıf kullanmak arasında pek bir fark yok gibi görünüyor. Her ikisine de gerçekten çok ihtiyaç duyduğum kadar sık ​​değil, ancak bazen basit bir çözüm sundukları durumlar var.

Herhangi bir şekilde bir fikriniz veya tercihiniz olup olmadığını duymak isterim.


10
Modüller hakkında ilginç olan, varsayılan olarak, içinde bildirilen yöntem ve işlevlerin modülün koruma düzeyine sahip olmasıdır, bu da Privateniteleyiciyi açıkça eklemeyi unutursanız, istemeden yöntemleri kullanılabilir hale getirebileceğiniz anlamına gelir . Bir sınıfta, varsayılan koruma düzeyi özeldir ve farkında olmadığınız sürece kafa karıştırıcı olabilir.
yu_ominae

Yanıtlar:


207

Modules, C # staticsınıflarının VB karşılığıdır . Sınıf yardımcı işlevlerini ve uzatma yöntemleri için yalnızca tasarlanmıştır ve zaman yok izin vermek istediğiniz miras ve örnekleme , bir kullanın Module.

Bu arada, kullanmak Modulegerçekten öznel değildir ve kullanımdan kaldırılmamıştır . Gerçekten de Moduleuygun olduğunda bir kullanmalısınız . .NET Framework kendisi bunu birçok kez yapar ( System.Linq.Enumerableörneğin). Bir uzatma yöntemi bildirmek için Modules kullanılması gerekir .


7
Oldukça doğru, ancak örneklemeyi ve NotInheritable değiştiricisini önlemek için özel bir kurucu kullanabilirim. Eski bir Modülden biraz daha çirkin ama aynı etkiye sahip. Framework'te Modüllerin kullanımıyla ilgili işaretçi için teşekkürler; Buna bakacağım.
Tom Juergens

8
Kaputun altında, sadece [StandardModule] özniteliğine sahip sınıflara derlenirler. Ayrıca, Modül'ü kullanmak sizi Paylaşılmayan şeylere sahip olmamaya zorlar, bu da iyi bir şeydir.
Mehrdad Afshari

18
Modüller C # 'daki statik sınıflarla aynı değildir. Bir modüldeki yöntemler, içe aktarılmış bir ad alanındaysa etkin bir şekilde küreseldir.
JaredPar

2
@JaredPar: İfadelerim muhtemelen kötü. C # statik sınıflar için VB muadilleri söylemeliydim. Bu ifadeden, bir modül kullanmanın, C # 'da statik bir sınıf yazacağınız mantıklı olduğunu söylemek istedim.
Mehrdad Afshari

3
@Chiwda bakınız msdn.microsoft.com/en-us/library/bb384936.aspx : "Uzatma yöntemleri yalnızca modülleri içinde bildirilebilir."
Mehrdad Afshari

34

Ayrı ad alanlarına yapışmadıkça modüllerden kaçınmaya devam etmek iyi bir fikirdir. Çünkü Intellisense'de modüllerde kullanılan yöntemler bu ad alanının her tarafından görülebilir.

Yani bunun yerine her yerde pop-up'larla ModuleName.MyMethod()sonuçlanır MyMethod()ve bu tür kapsüllemeyi geçersiz kılar. (en azından programlama seviyesinde).

Bu yüzden her zaman paylaşılan yöntemlerle Class oluşturmaya çalışıyorum, çok daha iyi görünüyor.


7
Kabul ediyorum, şu anda sınıflar ve modüller ile eski bir program üzerinde çalışıyorum (muhtemelen bir VB6'dan VB.NET 1 bağlantı noktasına). Yaklaşık on farklı modülde yüzlerce küresel değişken, alt birim ve fonksiyon vardır ve neyin nereden ve nasıl değiştirildiğini bulmak cehennemdir.
yu_ominae

tamam bu çok eski, ama sorumla alakalı. Ben değil bir VB adam, ama onunla çalışmak için var. IntelliSense / ReSharper sadece öldüğü için büyük bir sınıfı (> 46.000 satır) parçalamaya çalışıyorum. Modülleri kullanarak buldum ve sadece kendi modül içine büyük fonksiyon parçaları riping işe yarıyor gibi görünüyor, ama ben de her modül kendi ad alanı vermek gerekir merak ediyorum. Bu gerekli mi? yani IntelliSense'i sadece Modüller ile hızlandırabilir mi, yoksa Ad Alanları daha fazla yardımcı olur mu?
codah

27

Modüller kesinlikle kullanılmaz ve VB dilinde yoğun olarak kullanılır. Örneğin, VB.Net'te bir uzantı yöntemi uygulamak için tek yol budur.

Statik Üyeli Modüller ve Sınıflar arasında büyük bir fark vardır. Modül üzerinde tanımlanan herhangi bir yönteme, Modül geçerli ad alanında mevcut olduğu sürece küresel olarak erişilebilir. Aslında bir Modül global yöntemleri tanımlamanıza izin verir. Bu, yalnızca paylaşılan üyeleri olan bir sınıfın yapamayacağı bir şeydir.

İşte ham COM arabirimleri ile birlikte çalışan VB kodu yazarken çok kullandığım hızlı bir örnek.

Module Interop
  Public Function Succeeded(ByVal hr as Integer) As Boolean
    ...
  End Function

  Public Function Failed(ByVal hr As Integer) As Boolean
    ...
  End Function
End Module

Class SomeClass
  Sub Foo()
    Dim hr = CallSomeHrMethod()
    if Succeeded(hr) then
      ..
    End If
  End Sub
End Class

4
Genişletme yöntemleri ... her zaman kullanmak istediğim başka bir ince özellik, ama asla gerçekten uğraşmayın - bu bana başka bir iyi fırsat sunuyor. Ben küresel kapsam hakkında biraz olsun, ve küresel olarak kullanılabilir yöntemler kesinlikle uygun olabilir, ama onları aşırı kullanmak konusunda biraz rahatsız hissediyorum. Her halükarda, şu ana kadar tüm cevaplar bana modülleri elden çıkarmamam gerektiğini söylüyor; bunları doğru koşullarda kullanmak için iyi nedenler vardır.
Tom Juergens

12

Kullanmak kabul edilebilir Module. Moduleyerine geçmez Class. Modulekendi amacına hizmet eder. Amacı Moduleetmek üzere bir kap olarak kullanımı

  • uzatma yöntemleri,
  • herhangi birine özgü olmayan değişkenler Classveya
  • hiçbirine uygun olmayan değişkenler Class.

Modulegibi değil Classçünkü yapamazsın

  • bir miras Module,
  • bir Interfaceile bir uygulamak Module,
  • ne de bir örneği oluşturmaz Module.

A içindeki herhangi bir şeye adından bahsetmeden Moduledoğrudan Modulemontaj içinden erişilebilir Module. Varsayılan olarak, bir erişim seviyesi Moduleolan Friend.


11

Sınıflar

  • sınıflar nesne olarak somutlaştırılabilir
  • Nesne verileri, her başlatılan nesne için ayrı ayrı bulunur.
  • sınıflar arabirimler uygulayabilir .
  • Bir sınıf içinde tanımlanan üyeler , sınıfın belirli bir örneği içinde kapsanır ve yalnızca nesnenin ömrü boyunca vardır .
  • Sınıf üyelerine bir sınıfın dışından erişmek için, Object.Member biçiminde tam nitelikli adlar kullanmanız gerekir .

Modüller

  • Modüller nesne olarak başlatılamaz , çünkü standart bir modülün verilerinin yalnızca bir kopyası olduğundan, programınızın bir kısmı standart bir modülde ortak bir değişkeni değiştirdiğinde, tüm program tarafından görülebilir.
  • Bir modül içinde bildirilen üyelere varsayılan olarak herkes erişebilir .
  • Modüle erişebilen herhangi bir kodla erişilebilir.
  • Bu, standart bir modüldeki değişkenlerin etkin bir şekilde global değişken olduğu anlamına gelir, çünkü bunlar projenizin herhangi bir yerinden görülebilir ve programın ömrü boyunca mevcuttur.

6

VB.NET sınıflarımdan biri paylaşılan tüm üyelere sahip olduğunda, onu eşleşen (veya başka bir şekilde uygun) ad alanına sahip bir Modüle dönüştürür veya sınıfı miras alınamaz ve yapıcı olmaz:

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class

3
Ve burada bir isim alanlı modülü için sözdizimi var: Imports <whatever>Eğer herhangi bir ithalat varsa, Namespace MyCoolModule, Public Module MyCoolModule, <üyeleri olmadan Shared >, End Module, End Namespace.
Rory O'Kane

0

Modüller, numaralandırmaları ve bazı global değişkenleri, sabitleri ve paylaşılan işlevleri depolamak için uygundur. çok iyi bir şey ve sık sık kullanıyorum. Bildirilen değişkenler projenin tamamında görülebilir.


0

Sen gerekir Eğer Uzatma yöntemleri oluşturuyorsanız (yerine bir sınıf yerine) bir Modülü kullanın. VB.NET'te başka bir seçeneğin farkında değilim.

Modüllere karşı kendimi dirençli olarak, gömülü montajları bir arada çözmek için bazı kazan plakası kodunu nasıl ekleyeceğimizi denemek için değersiz birkaç saat geçirdim, sadece Sub New()(Modül) ve Shared Sub New()(Sınıf) 'ın eşdeğer olduğunu bulmak için. (Hatta orada bilmiyordum oldu bir çağrılabilir Sub New()bir Modülünde!)

Yani sadece attı EmbeddedAssembly.Loadve AddHandler AppDomain.CurrentDomain.AssemblyResolveorada hatları ve Bob amcam oldu.

Zeyilname : Henüz% 100 kontrol etmedim, ancak Sub New()bir Modülde bir Sınıftan farklı bir sırayla çalışan bir mürekkep püskürtüm var , sadece önlemek için bazı beyanları dışarıdan yöntemlere taşımak zorunda kaldım hatalar.

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.