2013-02-25 35 views
0

有沒有一門課完全等於這門課?在.NET中是否有內置的通用類?

Class X(Of T) 
    Public value As T 
End Class 

注意,無論是Nullable(Of T)也不Tuple(Of T)等於這個類,因爲他們不允許你設置的成員值。該類應具有以下特性:

  1. 當作爲參數傳遞,被調用的方法所做的任何更改應該不會影響發送對象,也就是因爲它的固有類型不應該創建對象的副本。
  2. 應該允許使用的語法x.value = <some value>其中x是X
+0

我相信你知道這件事,但萬一你不是,或者以後別人在這個頁面上絆倒的人不是......你熟悉'ByRef'修飾符關鍵字, 對? – 2013-02-25 13:49:27

+0

是的,我是。但這對我來說不起作用。我需要將該變量傳遞給QueueUserWorkItem的回調委託,後者恰好具有「委託子WaitCallback(狀態爲對象)」的定義。所以發送ByRef不是一個選項。我將修改回調函數中的變量,然後在回調完成後在主線程中檢查其值。即使發送一個對象(這是一個ref類型)也不是一個解決方案,但是在回調函數中爲狀態變量賦值會使原始對象保持不變。所以我需要一個包含VAL類型的REF類型。 – dotNET 2013-02-25 14:23:00

+0

好的。你聽起來像一個知道你在做什麼的人,但我覺得有必要提及它。繼續:) – 2013-02-25 14:25:25

回答

1

沒有一個定論的對象成員value設定的值,但我給它一個去。

我個人從未見過這種類型的課程。即使在仿製藥的文件顯示正在創建示例中使用與你相似的示例類:

msdn generics in the .net framework.

這裏的例子:

Public Class Generic(Of T) 
    Public Field As T 

End Class 

.... 

Public Shared Sub Main() 
    Dim g As New Generic(Of String) 
    g.Field = "A string" 
    '... 
    Console.WriteLine("Generic.Field   = ""{0}""", g.Field) 
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName) 
End Sub 
+0

是的。這看起來像一些證據。謝謝。在標記「否」作爲答案之前,我會等待更多的輸入。 – dotNET 2013-02-25 10:46:18

+0

夠公平的。我也想知道這一點。 – Ric 2013-02-25 11:19:52

1

我有時會創建這樣一類,幾乎逐字,雖然我叫Holder<T>Value;有兩個很好的使用情況對於這樣一類:

  • 鑑於Holder<someValueType>的集合,它是可以執行的集合的內容方便就地修改。例如,給出List<Holder<Point>>,可以說MyList[3].Value.X += 5;

  • 如果T是一種允許進行原子操作的類型,那麼即使該集合不是線程安全,也可以對Holder<T>集合的內容執行線程安全的原子操作。例如,在我事先知道字典所需的所有密鑰的情況下,我創建了一個Dictionary<String, Holder<Integer>>,然後可以使用多個線程使用Interlocked.Increment來計算每個字符串出現的次數。儘管Dictionary不是線程安全的,但該程序是線程安全的,不會鎖定,因爲存儲在字典中的Holder<Integer>項的集合從未必須更改。

如果你想使用內置型,有一個將工作:一T[]與尺寸之一。這種類型的主要缺點是,類型中沒有內在的東西可以確保元素零實際存在(即它不會是一個空數組)。

+0

+1用於使用場景。 – dotNET 2013-02-25 17:52:45

相關問題