空对于许多开发人员真是很虚无缥缈难以捉摸的一个概念
何为空
按照字面意思通俗的理解就是空洞无物没有任何东西然而与程序开发中由此延伸的概念却是非常丰富的
*从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接着被赋予默认值