2012-04-06 27 views
1

如何在VB.NET或C#中對別名進行別名,以便在函數中將別名用作參數類型時,意外地使用不別名類型會出錯?在VB.NET中強制實現類型別名

Imports AccessSpecifier = System.String 

Module Accessors 
    Delegate Function IoOper(ByRef strm As System.IO.Stream) As Action 
    Public Function accessMethod(ByRef spec As AccessSpecifier) As IoOper 
     ' implementation 
     ' ... 
    End Function 
End Module 

Module Main 
    Public Sub Main() 
     Dim spec As AccessSpecifier = New AccessSpecifier(CType("READ_WRITE", Char())) 
     Dim val = Accessors.accessMethod(spec) 
     System.Console.WriteLine(val.GetType()) 
     Dim shouldFail = Accessors.accessMethod("FAIL_ME") 
     System.Console.WriteLine(shouldFail.GetType()) 
    End Sub 
End Module 

或者,也許有更好的方法去嗎?

總體來說,我想的IDE逼我知道我在做什麼,如果我扔Ints周圍意味着Flag S,或State S和Strings周圍意味着Name S,Property S和Record小號。

幫助?

+1

只需將Option Strict On放在源代碼文件的頂部即可。 – 2012-04-06 20:24:04

+0

'Option Strict'防止隱式轉換。這裏沒有轉換髮生,因爲類型是相同的。 – 2012-04-06 20:44:38

+0

Erm,不,整數與字符串不相同。這不是你想要避免的嗎?使用Option Strict Off時,編譯器很樂意生成* try *將字符串轉換爲整數的代碼。在運行時,kaboom無法工作。否則,vb程序員傾向於在語言中喜歡的那種動態類型。把C#看作是一種非常嚴格的語言。 – 2012-04-06 20:57:18

回答

3

我從來不喜歡.NET中的類型別名。它使得代碼不精確,並且不清楚發生了什麼。正如在你的例子中,當一個人去尋找AccessSpecifier.vb文件(或類)時,他們不會找到它。

此外,別名只能在您的項目中使用,並且只能在單個代碼文件中使用。所以你必須在所有使用它的代碼文件中定義這個別名。

更好的(因爲更容易閱讀,更容易維護,更清晰的意圖)選項是創建一個類並重載類型轉換運算符以自動轉換爲String。通過這種方式,您可以像使用字符串一樣使用新班級,但您可以獲得嚴格的類型檢查。

+0

我完全忘了.NET框架中的隱式轉換。謝謝你。 – 2012-04-09 17:37:57