>我有一个如下代码
txtbox1.Text = dtDetails.Rows[0]["columnName"] == null ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
上行总是not null
即使dtDetails.Rows[0]["columnName"] is null
而
txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
完美地工作。 这是为什么呢? 以及null
与DBNull.Value
有何不同
ADO.NET(DataSet
、DataTable
和DataRow
(表示带有DBNull.Value
的SQLNULL
值 - 这是为了区分运行时(C#/.NET(null
和SQLNULL
。
我强烈建议阅读此QA:DBNull的意义何在?
您可以简化代码,顺便说一句,使用DataRowExtensions
- (添加对System.Data.DataSetExtensions.dll
的引用(
txtbox1.Text = dtDetails.Rows[0]["columnName"] == DBNull.Value ? "--": dtDetails.Rows[0]["columnName"].ToString().Trim();
可以更改为:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName")?.Trim() ?? "--";
DataRowExtensions.Field<T>( this DataRow row, String name )
扩展方法检查DBNull.Value
并返回null
- 否则它将返回所需的字段,而不会像代码当前那样两次查找DataRow
值。
Visual Studio 2010 更新
OP表示他们正在使用Visual Studio 2010(在2019年?!(,因此有几个选择:
- 升级到 Visual Studio 2019。与从VS2008跳到VS2010不同,没有 VS2010中删除了VS2019中仍然不可用的重要功能 - 例如,您仍然可以在VS2019中面向.NET Framework 2.0和Windows XP。
- 免费(如啤酒(Visual Studio 2019社区与VS2010一样,现在是免费的。您还可以使用免费的开源Visual Studio Code来处理Visual C#项目。
- (VS2010从VS2008中删除了有用的东西,如文档资源管理器,对.NET Compact Framework的支持,对象测试台功能,运行速度变慢,并永久改变了编辑器缩进的工作方式(更糟糕的是,imo((
如果你必须使用VS2010(但为什么?(,你可以破解你的MSBuild项目文件以使用更现代的C#编译器 - 但这是一个复杂的过程 - 并且没有IDE编辑器支持(所以即使项目可以正常构建,你也会得到红色波浪线(。
Visual Studio- 2012 及更高版本在使用 Visual Studio 2010 SP1 或更高版本文件时不再需要单向项目和解决方案文件升级 - 因此您可以将 VS2019 与 VS2010 文件一起使用,而无需任何仍在使用 VS2010 的人抱怨。
您可以将表达式更改为在
?? "--"
子句之后执行Trim()
:txtbox1.Text = ( dtDetails.Rows[0].Field<String>("columnName") ?? "--" ).Trim();
您可以将扩展方法用作 lambda 中的黑客条件运算符:
static class Extensions { public static TOut N<TIn,TOut>( this TIn value, Func<TIn,TOut> whenNotNull ) where TIn : class where TOut : class { if( value == null ) return null; return whenNotNull( value ); } }
像这样使用:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( v => v.Trim() ) ?? "--";
或进一步扩展:
static class Extensions { public static TOut N<TIn,TOut>( this TIn value, Func<TOut> whenNull, Func<TIn,TOut> whenNotNull ) where TIn : class where TOut : class { if( value == null ) return whenNull(); return whenNotNull( value ); } }
像这样使用:
txtbox1.Text = dtDetails.Rows[0].Field<String>("columnName").N( () => "--", v => v.Trim() );
您必须检查SQLNULL
而不是网络框架null
。它们是两个不同的东西