การทำเครื่องหมาย Class Static ใน VB.NET


85

ตามที่ระบุไว้ในคำถามและคำตอบล่าสุดคุณไม่สามารถสืบทอดจากคลาสคงที่ได้ เราบังคับใช้กฎที่ไปพร้อมกับคลาสแบบคงที่ภายใน VB.NET อย่างไร เนื่องจากเฟรมเวิร์กเข้ากันได้ระหว่าง C # และ VB มันจึงสมเหตุสมผลที่จะมีวิธีทำเครื่องหมายคลาสแบบคงที่ แต่ดูเหมือนจะไม่มีทาง

คำตอบ:


121

โมดูล == คลาสคงที่

ถ้าคุณต้องการแค่คลาสที่สืบทอดไม่ได้ให้ใช้NotInheritableคลาส แต่จะไม่เป็นแบบคงที่ / แชร์ คุณสามารถทำเครื่องหมายวิธีการคุณสมบัติและสมาชิกทั้งหมดเป็นSharedแต่นั่นไม่ใช่สิ่งเดียวกับคลาสแบบคงที่ใน C # อย่างเคร่งครัดเนื่องจากคอมไพเลอร์ไม่ได้บังคับใช้

หากคุณต้องการให้ VB.Net เทียบเท่ากับคลาสคงที่ C # ให้ใช้ไฟล์Module. ไม่สามารถสืบทอดได้และสมาชิกคุณสมบัติและวิธีการทั้งหมดเป็นแบบคงที่ / ใช้ร่วมกัน


2
ฉันถอนความคิดเห็นก่อนหน้านี้ ฉันกำลังดูโมดูลในตัวสะท้อนแสงและ IL แสดงว่าปิดสนิท
MagicKat

27
คุณเป็น VBer หรือไม่? โมดูลก็เหมือนกับเนมสเปซ ฟังก์ชัน VB ทั้งหมดนำเข้าจากโมดูลของ VB และมีอยู่ในขอบเขตทั่วไป สำหรับความเห็นของฉันคลาสคงที่ใน vb ไม่ใช่โมดูล แต่ก็มีพฤติกรรมที่แตกต่างกัน หากคุณต้องการพฤติกรรม 'คลาสคงที่' ใน vb คุณควรมี NotInheritable และประกาศทั้งหมดว่าเป็นสมาชิก 'Shared' เช่นเดียวกับที่คุณต้องทำในคลาสคงที่ของ C # พวกมันจะทำงานเหมือนกัน โมดูลไม่
Shimmy Weitzhandler

2
@Shimmy ฉันไม่รู้ว่าฉันพลาดความคิดเห็นนี้มาก่อนได้อย่างไร แต่คุณเข้าใจผิด ดูที่ IL ที่สร้างขึ้นและโมดูลจะได้รับการปฏิบัติเช่นเดียวกับคลาสคงที่ VB ทำงานพิเศษสำหรับฟังก์ชันมาตรฐานเดิมเพื่อให้ฟังก์ชันเหล่านี้ปรากฏในขอบเขตทั่วโลก
Joel Coehoorn

2
@JoelCoehoorn Module ≈≈คลาสแบบคงที่เนื่องจากโมดูลต้องถูกประกาศโดยตรงในเนมสเปซ ซึ่งหมายความว่าเราไม่สามารถประกาศโมดูลในโมดูลหรือคลาสได้
LosManos

20
@JoelCoehoorn ความจริงที่ว่าโมดูลและคลาสแบบคงที่ลงเอยด้วย IL เดียวกันเป็นสิ่งที่ดี แต่ VB ยังส่งเสริมสมาชิกของโมดูลไปยังเนมสเปซที่มีอยู่ โปรโมชั่นด้านคือที่โมดูลและการเรียนแบบคงที่แตกต่างกันในการใช้งานจริงและ IMHO ที่แตกต่างมาก ฉันชอบNotInheritable - ตัวสร้างส่วนตัวที่ว่างเปล่า -โซลูชันที่ใช้ร่วมกันของสมาชิกทั้งหมดเนื่องจากสมาชิกสามารถเข้าถึงได้ผ่านคลาสเท่านั้นซึ่งเป็นพฤติกรรมที่ถูกต้องกว่ามากหากคุณพยายามที่จะได้รับความเท่าเทียมกันของคลาสคง IL อาจแตกต่างกัน แต่เป็นเรื่องวิชาการจริงๆ
misha256

51

เกือบจะมี. คุณต้องป้องกันการสร้างอินสแตนซ์ด้วย

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared เป็นเหมือนวิธีการของคลาสคงที่
  • NotInheritable เหมือนปิดผนึก
  • ส่วนตัวใหม่เป็นเหมือนคลาสคงที่ไม่สามารถสร้างอินสแตนซ์ได้

ดู:
MSDN - Static Classes and Static Class Members


2
เหตุใดจึงไม่เป็นคำตอบที่ยอมรับ ขอบคุณสำหรับการตัดโค้ด
ArcherBird

6

หากคุณต้องการสร้างคลาสที่คุณไม่สามารถสืบทอดได้ใน C # คุณสามารถใช้ Sealed และใน VB.Net ใช้ NotInheritable

VB.Net เทียบเท่ากับแบบคงที่ถูกแชร์


คุณทำเครื่องหมายว่าตัวแปรและฟังก์ชันการทำงานเป็นแชร์เช่นเดียวกับที่คุณต้องทำในคลาส C # static การทำเครื่องหมายว่า NotInheritable ทำให้ปิดผนึก
Shimmy Weitzhandler

5

คุณสามารถสร้างคลาสแบบคงที่ใน vb.net วิธีแก้คือ

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

ตัวแปร AGE เป็นแบบคงที่สาธารณะคุณสามารถใช้ในรหัสอื่นได้เช่นนี้

 Dim myage As Integer = DB.AGE

Friend = public, NotInheritable = static


3
Friend! = public, Friend = internal
Altair

1
NotInheritable! = static, NotInheritable == ปิดผนึก
Magnus

myage! = 20 (อีกแล้วเศร้า)
Grim

2

จากมุมมองของ CLR คลาสคงที่ C # เป็นเพียงคลาส "ปิดผนึก" และ "นามธรรม" คุณไม่สามารถสร้างอินสแตนซ์ได้เนื่องจากมันเป็นนามธรรมและคุณไม่สามารถสืบทอดจากอินสแตนซ์ได้เนื่องจากมันถูกปิดผนึก ส่วนที่เหลือเป็นเพียงเวทมนตร์คอมไพเลอร์บางส่วน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.