空對於許多開發人員真是很虛無缥缈難以捉摸的一個概念
何為空
按照字面意思通俗的理解就是空洞無物沒有任何東西然而與程序開發中由此延伸的概念卻是非常豐富的
*從Web開發的展現頁面來看如果本可以有頁面呈現的對象卻沒有內容呈現在浏覽器中可以稱之為空從技術角度看就是沒有標簽屬性值或純文本內容或二進制數據從服務器端響應在Web頁面的可輸入區域如果沒有輸入任何內容這也是空在Server端接收這些可輸入區數據時都首先被作為SystemString類型然後會隱式或顯式的轉換為其他類型
浏覽器直接處理的數據包括HTML標簽純文本二進制流腳本HTML語法是無類型的描述性語言可見浏覽器處理的數據就可分為文本和二進制數據
*從NET托管代碼的角度來看空可有以下多種情況:
Nothing(VBNET中是NothingC#中等價的為NULL)
首先要明確Nothing是個引用類型其用途是釋放一個引用類型變量對引用類型實例的引用簡單的說就是讓原本指向一個引用類型實例的變量重新歸於未初始化把他存儲的引用類型實例的存儲地址釋放掉注意只要執行指針沒有跳出這個變量的生存范圍這個變量就依然存在於內存中(如果一個引用類型實例已經沒有變量指向他那麼他會被垃圾回收器立即回收銷毀注意GC有效管理的通常是托管資源但要明確的是非托管資源最終也還是要由GC來銷毀NET Framework 提供 ObjectFinalize 方法GC通在銷毀托管及非托管對象之前都會自動調用一下這個方法這是個可重寫的方法目的是在此方法中可以撰寫在對象被銷毀前進行必要的清理工作 Finalize方法只能由GC自動調用而不能撰寫代碼顯式調用所以調用的時間就不確定對於急需釋放清理的資源NET Framework又給出了Idispose接口此接口定義了可以顯式調用的Dispose()方法使得我們可以控制何時釋放不再使用的資源釋放以後再交給GC去處理 Finalize方法與Idispose接口是基於同樣目的互不包含可選其一使用的資源釋放方式
GC對於非托管資源例如文件窗口或網絡連接雖然可以跟蹤他們的生存期但它不了解具體如何清理這些資源所以需要使用自定義邏輯來輔助GC)
StringEmpty與托管值類型的空值
還是從托管代碼的角度來看如果一個String類型的變量賦值為或等價的StringEmpty或一個值變量定義以後沒有賦值 以上這些也可以空的另一種情況即值為空
注意因為String是引用類型所以值為空時也是需要賦值為或StringEmpty才能初始化
DBNull
SQL數據表中數據庫中的空 (特別注意在SQL的數據類型中文本類型的值為空和NET語言一樣都也是有兩種情況即有空值和什麼都沒有) 在SQL語法中對應SQL的Null對象NET Framework中為了與這個SQL的Null類型對應專門創建了SystemDBNull類型DBNullvalue就對應SQL數據表字段的空
如果NET托管代碼中把一個DBNullvalue賦值給SQL數據表中不能為空的字段就會引發異常如果從數據表某字段讀出空(在托管代碼中自動對應為DBNullvalue值)把它賦值給一個TextBox對象Text屬性同樣會拋出異常
為了解決以上會發生異常的狀況ASPNET中為不同的情景提供了不同的處理方式
寫入數據庫時如果賦值給SQL操作參數的托管值類型變量為空或String類型為StringEmpty時可以把這些空值轉換為DBNull
從數據庫讀取數據時如果讀出的是DBNullvalue可以轉換為StringEmpty或值類型的空值
Net Framework的服務器控件中數據源控件數據呈現空間通常都有涉及以上兩種情況處理的相關屬性
例如GridViewFormView和DetailsView都支持EmptyDataText或EmptyDataTemplate屬性當數據源沒有返回數據行的時候你可以使用這些屬性來指定控件顯示的內容我們只需要設置EmptyDataText和EmptyDataTemplate其中的一個(如果兩個都設置了EmptyDataTemplate會被重載)
對於數據呈現控件的綁定字段(和衍生的字段類型)模板字段或數據源參數對象上指定ConvertEmptyStringToNull屬性指明在向數據庫寫入數據之前來自客戶端的StringEmpty值將被轉換為DBNullvalue
綁定字段(和衍生的字段類型)的NullDisplayText屬性當數據源返回的某個字段的值為空的時候它指定顯示的內容如果在編輯模式中這個值沒有發生變化那麼在更新操作中這個值會以空值的形式返回給數據源而不是NullDisplayText設置的文本
ObjectDataSource也支持ConvertNullToDbNull屬性當相關的方法要求用DbNull代替空值(DataSet的TableAdapter類就有這個要求)的時候我們就可以把這個屬性設置為真
數據源SQL命令參數的DefaultValue屬性如果ConvertEmptyStringToNull和DefaultValue都被設置了那麼StringEmpty值會首先被轉換為DBNullvalue接著被賦予默認值
From:http://tw.wingwit.com/Article/program/net/201311/12281.html