积极答复者
|zyciis| C#4.0传说中的新特性:安全的null延迟赋值操作符,但真实出来没有,那我们如何来实现这个功能呢?有点变态 谢谢

问题
-
/************************************* * 让我空欢喜的 C#4.0的4个新特性:安全的null延迟赋值操作符 * 但真正的VS2010我分现不支持这个特性,在Microsoft论坛里面询问他们说没有这个新功能 * 但这个功能是我对4.0最看中的,其他的新特性我感觉对我没有必要 * 那现在没有这个特性,我如何更改我的类,来实现这个功能呢? * 谢谢 * 以下为示例 * ***********************************/ using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication3 { /// <summary> /// 如生明一个员工类 /// </summary> public class Employee { public string Code { get; set; } public string Name { get; set; } } public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Employee jerry = null; Employee tom = null; jerry = new Employee() { Code = "107", Name = "Jerry Zhang", }; object jerryName = jerry.Name; object tomName = tom.Name; //object tomName = tom.Name; //这一行会报未将对象引用设置到对象的实例。 //那我更改我的Employee类,最好是承继于某个类后 //访问tom.Name,如果tom没有实现的话不是报错,而是反回null //万分感谢 } } }
答案
-
首先我要声明,C# 4.0 中并没有有关安全的 Null 传递的特性。您是从哪里得到这个信息的?
关于这个问题,可以用 Nullable<T> 类型来实现。但 Nullable<T> 仅针对于值类型。对于任何引用类型,NullReferenceException 是一定要抛出的。因为如果没有这个限制,C# 就没有所谓的类型安全。
在程序中捕获 NullReferenceException 并阻止其向外抛出的设计方案是不可取的,否则,任何代码引起的空引用都将无法被调试,并且,这会导致程序产生奇怪的行为。
Mark Zhou- 已标记为答案 KeFang Chen 2010年7月1日 7:17
-
您好,我认为这不是语言的问题,而是设计的问题。如果C#推出这项新特性的话,恐怕之前有一半的代码要重写吧。
首先本来该显示一个公司名称的地方,如果由于员工为空而希望显示一片空白,这就是非常奇怪的设计。应该以某种更友好的方式显示提示才对。
再者,对于Employee不存在的情形,为何还会在页面显示呢?这本身就是一个错误。
因此我建议您修改一下设计。
不过,就我了解,事实上对于您所述的情况,WPF/Silverlight中的数据绑定确实做得更灵活一些。
Tech Blog: http://gildor.cnblogs.com- 已标记为答案 KeFang Chen 2010年7月1日 7:17
全部回复
-
首先我要声明,C# 4.0 中并没有有关安全的 Null 传递的特性。您是从哪里得到这个信息的?
关于这个问题,可以用 Nullable<T> 类型来实现。但 Nullable<T> 仅针对于值类型。对于任何引用类型,NullReferenceException 是一定要抛出的。因为如果没有这个限制,C# 就没有所谓的类型安全。
在程序中捕获 NullReferenceException 并阻止其向外抛出的设计方案是不可取的,否则,任何代码引起的空引用都将无法被调试,并且,这会导致程序产生奇怪的行为。
Mark Zhou- 已标记为答案 KeFang Chen 2010年7月1日 7:17
-
Emplyee 中有 Department
department 中有 Company
然后我在cs中得到一个Emplyee 然后要在前台显示的时候本来为
<%= Emplyee.Department.Compnay.Name %>
如果职员在的话就不会报错,但职员不在就找错
然后我只能写为
<%
object compnayName = null;
if(Emplyee!=null)
{
if(Emplyee.Department!=null)
{
if(Emplyee.Department.Compnay!=null)
{
compnayName = Emplyee.Department.Name
}
}
}
%><%= compnayName %>
这样写实现在太麻烦了
-
您好,我认为这不是语言的问题,而是设计的问题。如果C#推出这项新特性的话,恐怕之前有一半的代码要重写吧。
首先本来该显示一个公司名称的地方,如果由于员工为空而希望显示一片空白,这就是非常奇怪的设计。应该以某种更友好的方式显示提示才对。
再者,对于Employee不存在的情形,为何还会在页面显示呢?这本身就是一个错误。
因此我建议您修改一下设计。
不过,就我了解,事实上对于您所述的情况,WPF/Silverlight中的数据绑定确实做得更灵活一些。
Tech Blog: http://gildor.cnblogs.com- 已标记为答案 KeFang Chen 2010年7月1日 7:17