成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解.NET 4.0中的類型和元組

原創
開發 后端
微軟最新的.NET框架4.0版本開發庫中包括了通用元組類,希望通過本文能幫助大家更加了解.NET 4.0。

【51CTO獨家特稿】在.NET 4.0框架中元組是一組屬性,為了你提供了一種更容易將數據塊拼湊在一起的方法,而不必編寫自己的類。有不同大小的元組,從一個單一類型屬性的元組Tuple(Of T1)到有八個或更多類型的元組。例如,雙重和三重元組的類型定義縮寫看起來象下面這樣。51CTO曾報道過《.NET 4.0中任務與線程關系談

  1. Class Tuple(Of T1, T2)  
  2.    ReadOnly Property Item1 As T1  
  3.    ReadOnly Property Item2 As T2  
  4.    ...  
  5. End Class 
  6.  
  7. Class Tuple(Of T1, T2, T3)  
  8.    ReadOnly Property Item1 As T1  
  9.    ReadOnly Property Item2 As T2  
  10.    ReadOnly Property Item3 As T3  
  11.    ...  
  12. End color=#006699>Class 

三重元組(Tuple(Of T1, T2, T3))允許你分組三個不同的任意類型的數據塊:你可以存儲三個字符串,或者一個字符串、一個整數和一個日期等組合。元組的名稱據說來自序列:如單,雙,三,四,五,六,七,八….n元組。在編程語言,如Python和F#中,你會發現也有元組,現在在.NET 4.0的mscorlib庫中也有元組了,在未來你可能會在Visual Basic(VB)和C#代碼中發現它們的蹤跡。

因為元組的數據屬性是只讀的,.NET中的元組被認為是不可修改的,如果你要修改一個值,必須創建另一個元組。要創建一個新的元組,你可以指定泛型參數類型,然后將數據值傳遞給構造函數。

  1. Dim person As New Tuple
  2. (Of StringStringDate) ("John""Citizen", #1/1/1980#) 

一個簡單的語法是在元組類上使用Create工廠方法,并利用VB的類型推斷:

  1. Dim person = Tuple.Create("John""Citizen",#1/1/1980#) 

調用Tuple.Create依賴于類型推斷,如果沒有類型推斷,你必須編寫自己的方法進行調用,并需要明確泛型參數,這樣就完成否決了Share工廠方法的優勢。

  1. Dim person As Tuple(Of StringStringDate)
  2.  = tuple.Create("John""Citizen", #1/1/1980#) 

注意,即使類型推斷選項被關閉了 ,調用Create方法時仍然不需要指定泛型參數。

使用元組的一個問題是你的代碼變得不好描述,因為元組沒有描述屬性名稱,如person.Item1和person.Item2,在你的項目中快速添加一個簡單類定義會更有意義,在Visual Studio 2010中創建一個簡單的類比以前容易多了。

以我們的Person類和FirstName,LastName和DateOfBirth字段為例,在VB 10中,你可以使用自動屬性減少代碼量。

  1. Class Person  
  2.     Property FirstName As String  
  3.     Property LastName As String  
  4.     Property DateOfBirth As Date  
  5. End Class 

你不用再為一個屬性聲明后備字段,如getter和setter塊,只需要屬性名和它的類型即可。

VB和C#中的自動屬性有很大的不同,在VB和C#中,編譯器生成后備字段,以及與屬性相關的get和set代碼塊,C#為后備字段產生一個名字,但在你的代碼中卻不能使用它,而在VB卻允許你訪問這些后備字段。以FirstName屬性作為例子,在C#中后備字段名字可能是k__BackingField,由于有尖括號,因此它會被認為是非法的,而VB會產生一個后備字段named _FirstName。

在VB語言規范中明確指出可以通過名字可以訪問后備字段,因此你可以放心使用,它是安全的,一個很好的例子是當添加一個參數到你類的構造函數中時,在VB中這是一個非常簡單的任務。

  1. Sub New(ByVal firstName As String, _   
  2.           ByVal lastName As String, _  
  3.           ByVal dateOfBirth As Date)  
  4.       _FirstName = firstName  
  5.       _lastName = lastName  
  6.       _dateOfBirth = dateOfBirth  
  7.   End Sub 

要在C#中實現同樣的功能,你必須將所有自動屬性修改為標準屬性,并自行聲明后備字段,并在后備字段上添加get和set代碼塊。

注意在VB中的代碼實際上是不需要逗號后面的連接符“_”,我這么做只是為了使代碼更易讀。

Visual Studio IDE也可以幫你生成類,它們的屬性和構造函數,如果你的代碼引用了一個不存在的類型,會有錯誤更正功能幫助你生成類。

  1. Dim person As New _  
  2.   Person(FirstName:="John",  
  3.     LastName:="Citizen",   
  4.     DateOfBirth:=#1/1/1980#) 

錯誤更正功能為你生成了Person類,包括一個參數的構造函數。生成的代碼如下:

  1. Class Person  
  2.     Private _lastName As String 
  3.     Private _dateOfBirth As Date 
  4.     Private _firstName As String 
  5.  
  6.     Sub New(ByVal FirstName As String, _  
  7.              ByVal LastName As String, _   
  8.              ByVal DateOfBirth As Date)  
  9.         _firstName = FirstName  
  10.         _lastName = LastName  
  11.         _dateOfBirth = DateOfBirth  
  12.     End Sub 
  13. End Class 

如果你現在退回去使用With {. }語法修改你的變量聲明初始化屬性,更正向導會建議你添加屬性,雖然你可以使用通用代碼功能快速創建一個類,但仍然需要自己編寫屬性,要么使用代碼片段要么使用自動屬性語法。通用代碼功能的幾大亮點是當你向類中增加一個方法時,你可能不想停下來,然后自己添加一個方法或屬性,而是希望將注意力放在當前的代碼流中,但在添加屬性時應謹慎使用,因為添加屬性時有很多其它代碼需要修改。

#T#

在聲明只讀屬性時,無論是通用代碼功能還是自動屬性都可以幫到你。為了創建一個不可修改的類,你仍然需要自己動手在Visual Studio 2010中寫幾行代碼。

為了使你的類和元組類有相同的功能,你也需要基于你的后備字段添加同等的ToString和GetHashCode代碼。ToString方法非常適合調式和測試,GetHashCode方法重點在排序、比較和字典式存儲上,Equals方法也應該重寫,此外,你需要實現IComparable和它的CompareTo函數以允許排序。

元組類代碼已經到位,它們甚至實現了兩個新的接口:IStructuralComparable 和 IStructuralEquatable。這些接口提供了CompareTo函數和一個額外的IComparer參數,以及Equals和參數為IEqualityComparer 的GetHashCode函數,它允許自定義排序。

自己動手編寫所有的代碼工作量非常大,至少你應該考慮將GetHashCode添加到你的類中,如果你使用代碼生成功能,它會向你的類添加一個屬性,你可以繼續編你的碼,但可以忘掉你要打開的文件,它可以修復你的GetHashCode和其它方法。

元組的優點

當你完全了解了元組后,你就會知道它的好處,盡管它們有不倫不類的Item1,Item2,Item3等屬性。元組類是固定的,你不能修改它。你也不必處理跨機器邊界和分布式類型信息的問題,因為在.NET 4.0中,元組在mscorlib庫中,甚至還有一些不錯的嘗試,如TargetedPatchingOptOut屬性修飾,因此允許屬性是跨本地圖形生成器的圖像。

毫無疑問,使用元組可以減少代碼量,當你在VB10中將元組和lambda表達式結合使用時,可以大大減少代碼量。下面是我最近一篇文章中使用到的代碼,是在VB10中完成的,但如果在VB9中代碼量要多出一倍。使用元組和lambda表達式完全去除了我之前需要的PropertyChangedEventContext類。元組為事件處理程序和同步上下文提供了基本的數據存儲,剩下需要做的事情是能夠將事件處理程序傳遞給同步上下文的Post方法。

代碼段1:在Visual Studio 2010中使用元組和lambda方法簡化你的代碼

  1. Private _propChangedEvents As New List(  
  2.             Of Tuple(Of PropertyChangedEventHandler,   
  3.                                  SynchronizationContext))  
  4.  
  5.  
  6. Public Custom Event PropertyChanged As _  
  7.                          PropertyChangedEventHandler Implements   
  8.                          INotifyPropertyChanged.PropertyChanged  
  9.     AddHandler(ByVal value As _ PropertyChangedEventHandler)  
  10.        _propChangedEvents.Add(Tuple.Create(value,   
  11.                                          SynchronizationContext.Current))  
  12.     End AddHandler 
  13.  
  14.     RemoveHandler(ByVal value As _ PropertyChangedEventHandler)  
  15.       For i As Int32 = _propChangedEvents.Count - 1 To 0 Step -1  
  16.             If _propChangedEvents(i).Item1 = value Then 
  17.                 _propChangedEvents.RemoveAt(i)  
  18.                 Return 
  19.             End If 
  20.         Next 
  21.     End RemoveHandler 
  22.  
  23.     RaiseEvent(ByVal sender As Object,  
  24.                         ByVal e As PropertyChangedEventArgs)  
  25.         For Each listener In _propChangedEvents  
  26.             If listener.Item2 Is Nothing Then 
  27.                 ' no context so raise the event directly  
  28.                 listener.Item1.Invoke(sender, e)  
  29.             Else 
  30.                 Dim oneListener = listener  
  31.                 listener.Item2.Post(Sub(state As Object)  
  32.                                      oneListener.Item1.Invoke(sender, e)  
  33.                                 End Sub,  
  34.                                 Nothing)  
  35.             End If 
  36.         Next 
  37.     End RaiseEvent 
  38. End Event 

雖然元組看起來可能比較簡單和優點不倫不類的樣子,但它提供了強大的類型和重要的比較功能,元組在跨方法、類甚至機器邊界時非常有用,合理地使用它們將會節省你大量的編碼時間。

原文出處:http://visualstudiomagazine.com/Articles/2009/12/01/Types-and-Tuples-in-NET-4.aspx

原文名:Types and Tuples in .NET 4

作者:Bill McCarthy

責任編輯:彭凡 來源: 51CTO
相關推薦

2009-03-23 10:54:12

.NET契約式編程編程思想

2009-10-26 09:16:08

BigInteger類

2009-07-24 10:00:38

.NET 4.0內存映

2009-12-28 10:04:59

.NET 4.0數組

2010-01-05 09:26:13

.NET 4.0

2009-12-30 10:21:36

.NET 4.0

2010-07-02 09:25:37

.NET 4.0可擴展

2009-12-18 09:38:27

.NET 4.0并行計

2009-03-04 09:52:35

代碼契約組件接口

2009-02-03 09:33:26

動態類型動態編程C# 4.0

2021-01-13 05:18:50

數據類型性能

2011-06-08 13:50:39

C#類型轉換

2009-10-20 15:03:29

ExpandoObje

2010-01-14 14:12:14

Visual Stud

2009-08-10 18:16:33

ICustomQuer.NET 4.0

2013-08-21 17:09:03

.Net屬性

2009-08-17 09:30:28

.NET 4.0

2010-05-20 08:50:45

UrlRoutingASP.NET 4.0

2009-07-10 09:41:08

WCF服務配置.NET 4.0

2023-06-30 17:56:31

Scala元組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内精品视频在线 | 在线免费观看成年人视频 | 亚洲精品成人在线 | 九九伦理电影 | 国产精品免费大片 | 欧美4p | 国产三级日本三级 | 色先锋影音 | 国产精品久久精品 | 亚洲成人精选 | 国产精品区二区三区日本 | 精品视频一区二区三区 | 国产高清av免费观看 | 丁香五月缴情综合网 | 91在线视频一区 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 精品久久久久久久 | 国产精品久久久久久久久免费相片 | 国产精品视频在线观看 | 99re6在线| 久久青| 中文字幕人成乱码在线观看 | 日本中文字幕在线观看 | 精品一二三区视频 | 成人久久18免费 | 久久精品a| 毛片网站在线观看 | 久久久久久久久一区 | 亚洲国产精品一区 | 亚洲三区视频 | 亚洲成av | 日本精品在线观看 | 国产成人精品网站 | 亚洲国产精久久久久久久 | 蜜桃视频成人 | 国产成人精品一区二 | 久久夜夜| 久久久久久久久久久国产 | 精品一区av | 精品一区电影 | 国产精品美女久久久免费 |