一个类A
class a
{
  int b;
  public int B
  {
     get{return b;}
  }
}
class b
{
   a A=new a();
   int bb=a.B;
}
因为a 中 b没有复值这事系统默认是0,但我在b中调用时并不想bb返回0;而希望他能返回NULL
应该怎么解决这个问题呢

解决方案 »

  1.   

    可是int bb=null;不合法啊!
      

  2.   

    你在需要null的地方,作个判断就是了啊
    比如if b == 0
    return null;
    或者if b == 0
    {
     object o = null;
    // 然后把o作为b赋值给你需要的对象就是了呀,何必非要给整数类型赋空值呢??这根本不可能
    }
      

  3.   

    在OOP对象开发中需要用他打个比方:
    数据库中有一个层次  0  表示 高中  1 初中 2 小学
    我现在有个学生类,我输入学生ID去找这个学生的层次属性时,我并没有找到这个学生,自然就不要为这个属性负值,而你调用这个类实例时却返回个 0 (因为int无值负时就是0默认的)这样逻辑上不就错了吗
      

  4.   

    你要知道int是简单类型是值类型,不是引用类型。
    当被作为类成员,如果没有初始值的话,CLR默认将
    其初始化为0。
    建议使用string.
      

  5.   

    TO: fangxinggood(JustACoder) 
    int 我当然知道他是值类型了,我的意思是有什么好方法能绕个弯子能解决我上面提出的问题哈
    你说用string的确可以我也想到用他但是
    1.他表示的语意不对
    2.转换起来相当麻烦因为好多地方会碰到相是情况那样工作量会很大
      

  6.   

    TO: pupo(泡泡) 
    呵呵如果我的系统以后扩展时用到-1怎么半,去改代码?
    我考虑了系统以后的扩展能力所以没这样做,也许你回说-1不行你就写个-1000000000总行了吧。对这样的确可以但不符合软件开发要求是不合理的
      

  7.   

    还要如果你说考虑扩展,可以加入到配置文件里面,加入一个<nullValue>然后在代码里面读它,之后就可以扩展了呀,这个根本不是问题
      

  8.   

    int 不能为Null的可以用
    Int32.MinValue作为特殊判断,
    Int32.MinValue 为-2147483648
    一般不会有人用到的。:D
      

  9.   

    呵呵如果就一个例子来说的话的确大家的方法都可以解决,但至多说你完成了这个项目的需求暂时不会有错,但正真的好项目他可以自己揪错我们要把自己想到的问题能用代码动态的解决这才是正真的健壮型代码,通过配置文件的确也可以呀,我没说不可以哈我只是想找个最佳解决方案哈
    这里谢谢  Kshatriya(无聊)兄的积极参与
      

  10.   

    在OOP对象开发中需要用他打个比方:
    数据库中有一个层次  0  表示 高中  1 初中 2 小学
    我现在有个学生类,我输入学生ID去找这个学生的层次属性时,我并没有找到这个学生,自然就不要为这个属性负值,而你调用这个类实例时却返回个 0 (因为int无值负时就是0默认的)这样逻辑上不就错了吗还是拿lz举的这个例子来说,如果你并没有找到这个学生,那么应该将这个类实例设为null,然后通过判断类实例来确定,而不是返回一个新实例,再通过新实例的某个属性判断。
    实际上,你这样做,设计的层次上就出了问题。
      

  11.   

    int32 我想过用他的但还是不行比如说我这里Int32.MinValue 最小值射为1,当我取到0时复给他时他包错这样还是不可以为NULL呀呵呵,你在编译时就包错了:)
      

  12.   

    MSDN上的原文:值类型的主要功能
    值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。所有的值类型均隐式派生自 Object 类。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型不可能包含 null 值。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表。
      

  13.   

    MSDN上的原文:值类型的主要功能
    值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。所有的值类型均隐式派生自 Object 类。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型不可能包含 null 值。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表。>>与引用类型不同,值类型不可能包含 null 值。
    对真实这样我才想用个变通的方法把只类型封装起来让他变成一个引用类型呀,我苦于不知道怎么做,但也不知道是不是最好的解决方法所以才开贴问大家哈
      

  14.   

    /// <summary>
    /// ExamOrganization 考试机构。
    /// </summary>
    public class ExamOrganization
    {
    #region 私有字段
    //机构ID
    private string id;
    //机构名称
    private string name;
    //该机构属于第几层
    private int layer;
    //数据操作类
    private SqlHelp sqlHelp=new SqlHelp();
    #endregion #region 构造函数
    private ExamOrganization()
    {

    } /// <summary>
    /// 考试机构
    /// </summary>
    /// <param name="id">考试机构ID</param>
    public ExamOrganization(string id)
    {
    this.id=id;
    } #endregion #region 属性
    /// <summary>
    /// 获取机构ID
    /// </summary>
    public string Id
    {
    get
    {
    return this.id;
    }
    } /// <summary>
    /// 获取/设置机构名称
    /// </summary>
    public string Name
    {
    get
    {
    return this.name;
    }
    set
    {
    this.name=value;
    }
    } /// <summary>
    ///  获取/设置该机构所在的层次
    /// </summary>
    public int Layer
    {
    get
    {
    if(this.layer==0)
    {
    sqlHelp.SqlText="select I_Layer from ExamOrganization where C_Id='"+this.id+"'";
    DataTable dt=sqlHelp.ReadData();
    if(dt.Rows.Count==1)
    {
    this.layer=(int)dt.Rows[0][0];
    }
    else
    {
    // System.Int32 i=new Int();
    }
    }
    // else
    return this.layer;
    }
    set
    {
    this.layer=value;
    }
    }
    #endregion #region 方法

    /// <summary>
    /// 获取该机构的上级机构
    /// </summary>
    /// <returns>ExamOrganization</returns>
    public ExamOrganization ParentPrganization()
    {
    //获得上级机构的ID号
    ExamOrganization eo=null;
    sqlHelp.SqlText="select U_ParentGuid from ExamOrganization where C_ID='"+this.id+"'";
    DataTable dt=sqlHelp.ReadData();
    if(dt.Rows.Count==1)
    {
    sqlHelp.SqlText="select C_ID,C_Name,I_Layer from ExamOrganization where C_ID='"+dt.Rows[0][0].ToString()+"'";
    DataTable dt_EO=sqlHelp.ReadData();
    if(dt_EO.Rows.Count==1)
    {
    eo=new ExamOrganization(dt_EO.Rows[0]["C_ID"].ToString());
    eo.Name=dt_EO.Rows[0]["C_Name"].ToString();
    eo.Layer=(int)dt_EO.Rows[0]["I_Layer"];
    return eo;
    }
    else
    {
    return null;
    }
    }
    else
    {
    return null;
    }
    } /// <summary>
    /// 根据条件获取该机构所有的下级机构
    /// </summary>
    /// <param name="condition">条件</param>
    /// <returns>ExamOrganization[]</returns>
    public ExamOrganization[] ChildrenOrganization(string condition)
    {
    sqlHelp.SqlText="select C_ID,C_Name,I_Layer from ExamOrganization where C_ID='"+this.id+"' and "+condition.ToString();
    DataTable dt=sqlHelp.ReadData();
    if(dt.Rows.Count>0)
    {
    ExamOrganization[] eo=new ExamOrganization[dt.Rows.Count];
    for(int i=0;i<dt.Rows.Count;i++)
    {
    eo[i]=new ExamOrganization(dt.Rows[i]["C_ID"].ToString());
    eo[i].Name=dt.Rows[i]["C_Name"].ToString();
    eo[i].Layer=(int)dt.Rows[i]["I_Layer"];
    }
    return eo;
    }
    else
    {
    return null;
    }
    } /// <summary>
    /// 根据机构的ID获取一个考试机构的实例
    /// </summary>
    /// <param name="id">机构ID</param>
    /// <returns></returns>
    public static ExamOrganization GetInstance(string id)
    {
    SqlHelp sh=new SqlHelp();
    sh.SqlText="select C_ID,C_Name from ExamOrganization where C_ID='"+id+"'";
    DataTable dt=sh.ReadData();
    if(dt.Rows.Count==1)
    {
    ExamOrganization eo=new ExamOrganization(dt.Rows[0]["C_ID"].ToString());
    eo.Name=dt.Rows[0]["C_Name"].ToString();
    eo.Layer=(int)dt.Rows[0]["I_Layer"];
    return eo;
    }
    else
    return null; } /// <summary>
    /// 根据条件获取一组考试机构信息
    /// </summary>
    /// <param name="condition">条件</param>
    /// <returns>ExamOrganization[]</returns>
    public static ExamOrganization[] Find(string condition)
    {
    SqlHelp sh=new SqlHelp();
    sh.SqlText=""+condition;
    DataTable dt=sh.ReadData();
    if(dt.Rows.Count>0)
    {
    ExamOrganization[] eo=new ExamOrganization[dt.Rows.Count];
    for(int i=0;i<dt.Rows.Count;i++)
    {
    eo[i]=new ExamOrganization(dt.Rows[i]["C_Id"].ToString());
    eo[i].Name=dt.Rows[i]["C_Name"].ToString();
    eo[i].Layer=(int)dt.Rows[i]["I_Layer"];
    }
    return eo;
    }
    else
    return null;
    } #endregion
    }
    这是一个考试机构类这里的有个Layer的属性,在实例化这个类的时候我没没有取到这个属性值时就要返回一个NULL而不是返回一个0而且实例化这个类不能出错能调用到其他属性,就这么简单
      

  15.   

    想来想去也不知道说什么好了,如果lz一定要null,要不就定义一个Layer类吧。
    我倾向于luxizhao(安)的做法,用Int32.MinValue来作判断,
    考虑到扩展性和一致性,可以把判断放到一个函数里面,或者定一个条件判断的策略类。
    关于这个问题,我想说得就这么多了。Over......
      

  16.   

    升级到.NET Framework 2.0,VS2005
    里面直接支持值类型为空值,加关键字?int? a = null;
    int? b = 100;int c = a ?? 10;
    int d = b ?? 10;结果:
    c = 10
    d = 100
      

  17.   

    LZ属于看到死胡同还要往里钻的一类
    鉴定完毕,OVER!
      

  18.   

    class a{
    object b  ;//b = 10 ;
    public object B
    {
    get
    {
    if(b == null)
    {
    return 0 ;
    }
    else
    {
    return b ;
    }
    }
    }
    }
    class b
    {
    a A=new a();
    int bb=(int)A.B ;
    Console.WriteLine(bb);
    }如果b为null,则返回0 否则就返回 b 的值
      

  19.   

    呵呵我已经有了解决的方法用SqlType的类型值来定义一个字段变量他支持ISNULL的检查大家认为怎么样哈
      

  20.   

    其实没这样就没什么意义了
    虽然说SqlType有类似的处理既然你想返回int 又想返回 null
    那为何你不用object做为返回?
      

  21.   

    object 来回装箱撤箱很好系统资源尽量不用哈