深入瞭解ASP.NET中的“空”

iDotNetSpace發表於2010-04-14

空對於許多開發人員真是很虛無縹緲,難以捉摸的一個概念。

何為空

按照字面意思,通俗的理解就是空洞無物,沒有任何東西。然而與程式開發中,由此延伸的概念卻是非常豐富的。

 

l   從Web開發的展現頁面來看,如果本可以有頁面呈現的物件,卻沒有內容呈現在瀏覽器中,可以稱之為“空”。從技術角度看,就是沒有標籤屬性值或純文字內容,或二進位制資料從伺服器端響應。在Web頁面的可輸入區域,如果沒有輸入任何內容,這也是“空”,在Server端接收這些可輸入區資料時,都首先被作為System.String型別,然後會隱式或顯式的轉換為其他型別。

瀏覽器直接處理的資料包括,HTML標籤,純文字,二進位制流,指令碼。HTML語法是無型別的描述性語言。可見瀏覽器處理的資料就可分為文字和二進位制資料。

l   從.NET託管程式碼的角度來看,“空”可有以下多種情況:

1.          Nothing(VB.NET中是NothingC#中等價的為NULL)

首先要明確Nothing是個引用型別,其用途是釋放一個引用型別變數對引用型別例項的引用。簡單的說就是讓原本指向一個引用型別例項的變數重新歸於未初始化,把他儲存的引用型別例項的儲存地址釋放掉。注意:只要執行指標沒有跳出這個變數的生存範圍,這個變數就依然存在於記憶體中。(如果一個引用型別例項,已經沒有變數指向他,那麼他會被垃圾回收器立即回收銷燬。注意:GC有效管理的通常是託管資源,但要明確的是,非託管資源最終也還是要由GC來銷燬。.NET Framework 提供 Object.Finalize 方法,GC通在銷燬託管及非託管物件之前,都會自動呼叫一下這個方法,這是個可重寫的方法,目的是在此方法中可以撰寫在物件被銷燬前進行必要的清理工作。 Finalize方法只能由GC自動呼叫,而不能撰寫程式碼顯式呼叫,所以呼叫的時間就不確定,對於急需釋放清理的資源,.NET Framework又給出了Idispose介面,此介面定義了可以顯式呼叫的Dispose()方法,使得我們可以控制何時釋放不再使用的資源,釋放以後再交給GC去處理。 Finalize方法與Idispose介面是基於同樣目的,互不包含,可選其一使用的資源釋放方式。

GC對於非託管資源,例如檔案、視窗或網路連線。雖然可以跟蹤他們的生存期,但它不瞭解具體如何清理這些資源。所以需要使用自定義邏輯來輔助GC)

 

2.         String.Empty與託管值型別的空值

還是從託管程式碼的角度來看,如果一個String型別的變數賦值為””或等價的String.Empty。或一個值變數定義以後沒有賦值。 以上這些也可以空的另一種情況,即值為“空”

注意:因為String是引用型別,所以值為空時,也是需要賦值為””或String.Empty,才能初始化。

 

3.         DBNull

SQL資料表中,資料庫中的空 (特別注意:在SQL的資料型別中,文字型別的值為空和NET語言一樣都,也是有兩種情況,即有空值和什麼都沒有) ,在SQL語法中,對應SQL的Null物件。NET Framework中為了與這個SQL的Null型別對應,專門建立了System.DBNull型別。DBNull.value就對應SQL資料表欄位的空。

如果NET託管程式碼中把一個DBNull.value賦值給SQL資料表中不能為空的欄位,就會引發異常;如果從資料表某欄位讀出空(在託管程式碼中自動對應為DBNull.value值),把它賦值給一個TextBox物件Text屬性,同樣會丟擲異常。

為了解決以上會發生異常的狀況,ASP.NET中為不同的情景提供了不同的處理方式:

  • 寫入資料庫時,如果賦值給SQL操作引數的託管值型別變數為空,或String型別為String.Empty時,可以把這些空值轉換為DBNull
  • 從資料庫讀取資料時,如果讀出的是DBNull.value,可以轉換為String.Empty或值型別的空值。
  • Net Framework的伺服器控制元件中,資料來源控制元件,資料呈現空間,通常都有涉及以上兩種情況處理的相關屬性。

例如,GridView、FormView和DetailsView都支援EmptyDataText或EmptyDataTemplate屬性,當資料來源沒有返回資料行的時候,你可以使用這些屬性來指定控制元件顯示的內容。我們只需要設定EmptyDataText和EmptyDataTemplate其中的一個(如果兩個都設定了,EmptyDataTemplate會被過載)。

 

對於資料呈現控制元件的繫結欄位(和衍生的欄位型別)、模板欄位或資料來源引數物件上指定ConvertEmptyStringToNull屬性,指明在向資料庫寫入資料之前,來自客戶端的String.Empty值將被轉換為DBNull.value。

繫結欄位(和衍生的欄位型別)的NullDisplayText屬性,當資料來源返回的某個欄位的值為空的時候,它指定顯示的內容。如果在編輯模式中這個值沒有發生變化,那麼在更新操作中這個值會以空值的形式返回給資料來源,而不是NullDisplayText設定的文字。

 

ObjectDataSource也支援ConvertNullToDbNull屬性,當相關的方法要求用DbNull代替空值(DataSet的TableAdapter類就有這個要求)的時候,我們就可以把這個屬性設定為真。

資料來源SQL命令引數的DefaultValue屬性,如果ConvertEmptyStringToNull和DefaultValue都被設定了,那麼String.Empty值會首先被轉換為DBNull.value,接著被賦予預設值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-659708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章