Đánh dấu một lớp tĩnh trong VB.NET


85

Như vừa nêu trong một câu hỏi và câu trả lời gần đây , bạn không thể kế thừa từ một lớp tĩnh. Làm thế nào để thực thi các quy tắc đi cùng với các lớp tĩnh bên trong VB.NET? Vì khung công tác tương thích giữa C # và VB nên sẽ có cách để đánh dấu một lớp tĩnh, nhưng dường như không có cách nào.

Câu trả lời:


121

Mô-đun == lớp tĩnh

Nếu bạn chỉ muốn một lớp mà bạn không thể kế thừa, hãy sử dụng một NotInheritablelớp; nhưng nó sẽ không tĩnh / Được chia sẻ. Bạn có thể đánh dấu tất cả các phương thức, thuộc tính và thành viên là Shared, nhưng điều đó không hoàn toàn giống với một lớp tĩnh trong C # vì nó không được trình biên dịch thực thi.

Nếu bạn thực sự muốn VB.Net tương đương với một lớp tĩnh C #, hãy sử dụng a Module. Nó không thể được kế thừa và tất cả các thành viên, thuộc tính và phương thức là tĩnh / được chia sẻ.


2
Tôi rút lại nhận xét trước đây của tôi. Tôi đang xem xét một mô-đun trong gương phản xạ và IL cho thấy nó được niêm phong.
— MagicKat

27
Bạn là VBer? Một mô-đun giống như một không gian tên. Tất cả các chức năng VB được nhập từ các mô-đun của VB và chúng có sẵn trong phạm vi chung. Đối với ý kiến ​​của tôi, một lớp tĩnh trong vb không phải là một mô-đun, nó có hành vi khác. nếu bạn muốn hành vi 'static class' trong vb, bạn nên có NotInhenking và khai báo tất cả các thành viên của nó là 'Shared', giống như bạn sẽ phải làm trong lớp static của C #, họ sẽ cư xử CÙNG nhau. Một mô-đun KHÔNG.
— Shimmy Weitzhandler

2
@Shimmy Tôi không biết làm thế nào mà tôi đã bỏ lỡ bình luận này trước đây, nhưng bạn đã nhầm. Nhìn vào IL được tạo và các mô-đun được xử lý giống hệt như lớp tĩnh. VB chỉ thực hiện thêm công việc cho các hàm tiêu chuẩn cũ để làm cho chúng xuất hiện trong phạm vi toàn cầu.
— Joel Coehoorn

2
@JoelCoehoorn Mô-đun ≈≈ lớp tĩnh vì Mô-đun phải được khai báo trực tiếp trong không gian tên. Điều này có nghĩa là không thể khai báo Mô-đun trong Mô-đun hoặc Lớp.
— LosManos

20
@JoelCoehoorn Thực tế là các mô-đun và các lớp tĩnh kết thúc với cùng một IL là điều tốt nên biết, nhưng VB cũng thúc đẩy các thành viên của mô-đun vào vùng tên chứa. Các chương trình khuyến mãi khía cạnh là nơi các module và các lớp học tĩnh khác nhau trong sử dụng thực tế và IMHO đó là một sự khác biệt lớn. Tôi thích NotInherily - phương thức khởi tạo riêng trống - tất cả các thành viên được chia sẻ giải pháp bởi vì các thành viên chỉ có thể được tiếp cận thông qua lớp, đây là hành vi đúng hơn nhiều nếu bạn đang cố gắng có được sự tương đương của lớp tĩnh. IL có thể khác, nhưng đó thực sự là học thuật.
— misha256

51

Sắp xong rồi. Bạn cũng phải ngăn chặn việc khởi tạo.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared giống như phương thức của lớp tĩnh.
  • NotInherites giống như được niêm phong.
  • Private New giống như lớp tĩnh không thể được khởi tạo.

Xem:
MSDN - Lớp tĩnh và thành viên lớp tĩnh


2
tại sao đây không phải là câu trả lời được chấp nhận? Cám ơn các mã snip
— ArcherBird

6

Nếu bạn chỉ muốn tạo một lớp mà bạn không thể kế thừa, trong C # bạn có thể sử dụng Sealed và trong VB.Net sử dụng NotInherily.

VB.Net tương đương với static được chia sẻ.


bạn đánh dấu các biến và chức năng của nó là được chia sẻ, giống như bạn sẽ phải làm trong lớp tĩnh C #. Đánh dấu là Không ghi được làm cho nó được niêm phong.
— Shimmy Weitzhandler

5

Bạn có thể tạo lớp tĩnh trong vb.net. Giải pháp là

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

Biến AGE là biến tĩnh công khai, bạn có thể sử dụng nó trong mã khác giống như thế này

 Dim myage As Integer = DB.AGE

Bạn bè = công khai, Không ghi nhớ = tĩnh


3
Bạn bè! = Công khai, Bạn bè = nội bộ
— Altair

1
! NotInheritable = tĩnh, NotInheritable == kín
— Magnus

myage! = 20 (buồn hơn nữa)
— Grim

2

Theo quan điểm của CLR, lớp tĩnh C # chỉ là lớp "niêm phong" và "trừu tượng". Bạn không thể tạo một cá thể, vì nó là trừu tượng và bạn không thể kế thừa từ nó vì nó bị niêm phong. Phần còn lại chỉ là một số phép thuật biên dịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.