一个类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
应该怎么解决这个问题呢
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
应该怎么解决这个问题呢
比如if b == 0
return null;
或者if b == 0
{
object o = null;
// 然后把o作为b赋值给你需要的对象就是了呀,何必非要给整数类型赋空值呢??这根本不可能
}
数据库中有一个层次 0 表示 高中 1 初中 2 小学
我现在有个学生类,我输入学生ID去找这个学生的层次属性时,我并没有找到这个学生,自然就不要为这个属性负值,而你调用这个类实例时却返回个 0 (因为int无值负时就是0默认的)这样逻辑上不就错了吗
当被作为类成员,如果没有初始值的话,CLR默认将
其初始化为0。
建议使用string.
int 我当然知道他是值类型了,我的意思是有什么好方法能绕个弯子能解决我上面提出的问题哈
你说用string的确可以我也想到用他但是
1.他表示的语意不对
2.转换起来相当麻烦因为好多地方会碰到相是情况那样工作量会很大
呵呵如果我的系统以后扩展时用到-1怎么半,去改代码?
我考虑了系统以后的扩展能力所以没这样做,也许你回说-1不行你就写个-1000000000总行了吧。对这样的确可以但不符合软件开发要求是不合理的
Int32.MinValue作为特殊判断,
Int32.MinValue 为-2147483648
一般不会有人用到的。:D
这里谢谢 Kshatriya(无聊)兄的积极参与
数据库中有一个层次 0 表示 高中 1 初中 2 小学
我现在有个学生类,我输入学生ID去找这个学生的层次属性时,我并没有找到这个学生,自然就不要为这个属性负值,而你调用这个类实例时却返回个 0 (因为int无值负时就是0默认的)这样逻辑上不就错了吗还是拿lz举的这个例子来说,如果你并没有找到这个学生,那么应该将这个类实例设为null,然后通过判断类实例来确定,而不是返回一个新实例,再通过新实例的某个属性判断。
实际上,你这样做,设计的层次上就出了问题。
值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。所有的值类型均隐式派生自 Object 类。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型不可能包含 null 值。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表。
值类型的变量总是包含该类型的值。对值类型变量赋值将创建所赋的值的一个副本,而对引用类型变量赋值将创建引用的副本,而不是引用对象的副本。所有的值类型均隐式派生自 Object 类。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型不可能包含 null 值。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。有关值类型默认值的信息,请参见默认值表。>>与引用类型不同,值类型不可能包含 null 值。
对真实这样我才想用个变通的方法把只类型封装起来让他变成一个引用类型呀,我苦于不知道怎么做,但也不知道是不是最好的解决方法所以才开贴问大家哈
/// 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而且实例化这个类不能出错能调用到其他属性,就这么简单
我倾向于luxizhao(安)的做法,用Int32.MinValue来作判断,
考虑到扩展性和一致性,可以把判断放到一个函数里面,或者定一个条件判断的策略类。
关于这个问题,我想说得就这么多了。Over......
里面直接支持值类型为空值,加关键字?int? a = null;
int? b = 100;int c = a ?? 10;
int d = b ?? 10;结果:
c = 10
d = 100
鉴定完毕,OVER!
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 的值
虽然说SqlType有类似的处理既然你想返回int 又想返回 null
那为何你不用object做为返回?