2016-02-22 47 views
3

包含實用方法的類在整個地方都是需要的。所以,我想讓它成爲一個靜態類。C#的靜態與VB.NET中的NotInheritable相同嗎?

爲什麼靜態正在轉換爲不可繼續

public static class MyClass 
{ 
    public static string MyProperty { get; set; } 

    public static void MyMethod() 
    { 

    } 
} 

Public NotInheritable Class Employee 
    Private Sub New() 
    End Sub 
    Public Shared Property MyProperty() As String 
     Get 
      Return m_MyProperty 
     End Get 
     Set 
      m_MyProperty = Value 
     End Set 
    End Property 
    Private Shared m_MyProperty As String 

    Public Shared Sub MyMethod() 
    End Sub 
End Class 

在我看來,這看起來更像是一個密封類,不是嗎?

+3

「NotInheritable」與c#中的「sealed」等價。 https://msdn.microsoft.com/en-us/library/h278d2d4.aspx。看起來「共享」等同於「靜態」? http://stackoverflow.com/questions/1980207/static-shared-in-vb-net-and-c-sharp-visibility – AndyJ

+0

靜態意味着密封,這意味着你不能繼承他們....也不能包含一個實例構造函數,但是是一個靜態的... – Codexer

+0

@Codexer,它有點複雜。在C#中,你可以繼承一個靜態類,但它不是「正確的」繼承,它是「假的」。 http://stackoverflow.com/questions/2281775/c-sharp-static-member-inheritance-why-does-this-exist-at-all – AndyJ

回答

8

爲什麼static被轉換爲NotInheritable?

它沒有得到直接轉換。這staticsealed事實是什麼使等價類在VB.NET NonInheritable

在我看來,這看起來更像是一個密封類,不是嗎?

是的,但它不是「錯誤的」,因爲靜態類也是密封的。

VB.NET沒有「靜態類」的概念。它最接近的是模塊,它不是確切等效於static,因爲它不能在其中嵌套另一個模塊,而您可以在C#中的另一個靜態類中定義一個靜態類。所以轉換器可能只是在謹慎的方面犯錯,因爲沒有將static類翻譯成Module。由於C#中的靜態類是無法實例化的密封類,因此最接近於VB.NET中的等效類的是NotInheritable類,所有Shared方法和屬性都帶有私有默認實例構造函數,所以類不能實例化。

所以生成的VB類具有源類的所有特徵,但提供這些特徵的機制有些不同。

+0

檢查編輯。我已經添加了一個方法。 – Richard77

+0

你說得對,VB中最接近的是'Module',但你爲什麼會說它不能用純代碼轉換來表示呢? –

+0

@DaveDoknjas:這很有道理。爲了安全起見,「共享」和「模塊」之間的爭議怎麼樣?例如,我不應該寫一個來表明我的真實意圖嗎?我想要一個靜態類,而不是密封類本身,即使靜態意味着密封? – Richard77

6

我不確定你用什麼來將static轉換爲NotInheritable,但它們並不等同。

NotInheritable在VB.NET中相當於sealed在C#中。
C#的static在VB.NET中被稱爲Shared

值得注意的是,Shared不能應用於類,只能應用於類的成員。這是在VB.NET specification

Class Declarations概述:

ClassDeclaration ::= 
    [ Attributes ] [ ClassModifier+ ] Class Identifier LineTerminator 
    [ ClassBase ] 
    [ TypeImplementsClause+ ] 
    [ ClassMemberDeclaration+ ] 
    End Class LineTerminator 
ClassModifier ::= AccessModifier | Shadows | MustInherit | NotInheritable 

(注意:ClassModifier ::=下顯着缺乏Shared

正如其他用戶所提到的,Module是一個更好的等同於一個C#static類。

+0

我已經使用'http:// converter.telerik.com /'進行轉換。 – Richard77

+0

有什麼令人困惑的是,在一些在線文章中,據說'shared'是由編譯器執行的 - 無論如何。其他一些文章說靜態的等價物應該是'Module'。然而,其他人批評'模塊',因爲它應該是一個VBScript文物。我迷路了。 – Richard77

+0

telerik轉換工具看起來不正確。嘗試轉換C# - > VB,取出結果並將其轉換回c# –

1

的任擇議定書要求(在評論)使用「模塊」的一個版本 - 那就是:

Public Module [MyClass] 
    Public Property MyProperty() As String 

    Public Sub MyMethod() 
    End Sub 
End Module 

注意模塊的成員被稱爲要麼資質:

Dim s As String = [MyClass].MyProperty 

或者沒有任何資格(這就是我在評論中稱爲'VB魔術') - 我不推薦這個 - 只是表示完整性:

Dim s As String = MyProperty 

是的,這是一個較舊的功能,但它仍然是VB中最接近C#靜態類的功能 - 在VB(尚未)中沒有「共享類」。

+0

所以VB.NET中沒有共享類。而模塊的成員是隱式共享的。 – Richard77

+0

@ Richard77:正確(模塊成員可以在不使用模塊名稱的情況下調用,但這是一種常見的錯誤做法)。 –