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

  • 问题

  • /*************************************
     * 让我空欢喜的 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
          //万分感谢
        }
      }
    }
    
    2010年6月25日 3:03

答案

  • 首先我要声明,C# 4.0 中并没有有关安全的 Null 传递的特性。您是从哪里得到这个信息的?

    关于这个问题,可以用 Nullable<T> 类型来实现。但 Nullable<T> 仅针对于值类型。对于任何引用类型,NullReferenceException 是一定要抛出的。因为如果没有这个限制,C# 就没有所谓的类型安全。

    在程序中捕获 NullReferenceException 并阻止其向外抛出的设计方案是不可取的,否则,任何代码引起的空引用都将无法被调试,并且,这会导致程序产生奇怪的行为。


    Mark Zhou
    2010年6月25日 6:35
  • 您好,我认为这不是语言的问题,而是设计的问题。如果C#推出这项新特性的话,恐怕之前有一半的代码要重写吧。

    首先本来该显示一个公司名称的地方,如果由于员工为空而希望显示一片空白,这就是非常奇怪的设计。应该以某种更友好的方式显示提示才对。

    再者,对于Employee不存在的情形,为何还会在页面显示呢?这本身就是一个错误。

    因此我建议您修改一下设计。

    不过,就我了解,事实上对于您所述的情况,WPF/Silverlight中的数据绑定确实做得更灵活一些。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 12:17

全部回复

  • 我的想法是:
    首先创建一个类 IgnoreNullReferenceException
    然后我的Employee 继承IgnoreNullReferenceException
    再找出.NET中哪个类来最先访问我的Employee
    然后,
    然后用注入的方法修改掉这个类为:
    他原来发现为null就报错的我们就修改为判断对像是否继承于IgnoreNullReferenceException
    如果是,返回null
    如果不是,报错
    像上面这个想法能不能实现
    谢谢
    2010年6月25日 3:15
  • 首先我要声明,C# 4.0 中并没有有关安全的 Null 传递的特性。您是从哪里得到这个信息的?

    关于这个问题,可以用 Nullable<T> 类型来实现。但 Nullable<T> 仅针对于值类型。对于任何引用类型,NullReferenceException 是一定要抛出的。因为如果没有这个限制,C# 就没有所谓的类型安全。

    在程序中捕获 NullReferenceException 并阻止其向外抛出的设计方案是不可取的,否则,任何代码引起的空引用都将无法被调试,并且,这会导致程序产生奇怪的行为。


    Mark Zhou
    2010年6月25日 6:35
  • 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 %>

    这样写实现在太麻烦了

    2010年6月28日 3:00
  • 您好,我认为这不是语言的问题,而是设计的问题。如果C#推出这项新特性的话,恐怕之前有一半的代码要重写吧。

    首先本来该显示一个公司名称的地方,如果由于员工为空而希望显示一片空白,这就是非常奇怪的设计。应该以某种更友好的方式显示提示才对。

    再者,对于Employee不存在的情形,为何还会在页面显示呢?这本身就是一个错误。

    因此我建议您修改一下设计。

    不过,就我了解,事实上对于您所述的情况,WPF/Silverlight中的数据绑定确实做得更灵活一些。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 12:17