如何在C#asp.net中有条件地创建类的新实例?
我有一个具有不同构造函数的类。一个构造函数不传递任何内容(创建新记录),另一个构造函数传递ID(用于更新)。我想测试一个条件,并根据结果创建类对象的新实例。我的问题是,对象不执行if语句如何在C#asp.net中有条件地创建类的新实例?,c#,asp.net,C#,Asp.net,我有一个具有不同构造函数的类。一个构造函数不传递任何内容(创建新记录),另一个构造函数传递ID(用于更新)。我想测试一个条件,并根据结果创建类对象的新实例。我的问题是,对象不执行if语句 protected void Position() { if (Session["PositionID"] == null) { JobPosition p = new JobPosition(); } else { JobPositio
protected void Position()
{
if (Session["PositionID"] == null)
{
JobPosition p = new JobPosition();
}
else
{
JobPosition p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
p.positionTitle= pTitle.text;
p.positionMission= pMission.text;
p.positionDepartment= pDept.text;
Session["PositionID"] = Convert.ToString(p.SaveDB());
}
p不能在当前上下文中使用。我可以将我的代码复制到每个条件中,似乎我不需要这样做
如何使用
p
?将JobPosition
声明移到条件之外。将p从if/else范围移到方法范围之外
protected void Position()
{
JobPosition p; // No need for null;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
// Don't need to check if p is null again here too
p.positionTitle= pTitle.text;
p.positionMission= pMission.text;
p.positionDepartment= pDept.text;
Session["PositionID"] = Convert.ToString(p.SaveDB());
}
JobPosition p = null;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
将代码更改为:
JobPosition p = null;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
null
不是严格需要的。您需要将p
的声明移到if语句上方:
protected void Position()
{
JobPosition p = null; //declare only once
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
p.positionTitle= pTitle.text;
p.positionMission= pMission.text;
p.positionDepartment= pDept.text;
Session["PositionID"] = Convert.ToString(p.SaveDB());
}
JobPosition p;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
如果在局部作用域内声明变量,则在离开该作用域时无法访问该变量。也许我误解了您的问题,但您似乎希望:
protected void Position()
{
JobPosition p;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
p.positionTitle= pTitle.text;
p.positionMission= pMission.text;
p.positionDepartment= pDept.text;
Session["PositionID"] = Convert.ToString(p.SaveDB());
}
在if块外声明JobPosition:
JobPosition p;
if (Session["PositionID"] == null)
{
p = new JobPosition();
}
else
{
p = new JobPosition(Convert.ToInt32(Session["PositionID"]));
}
我更倾向于做以下事情
protected void Position()
{
const string positionIdKey = "PositionID";
var positionId = Session[positionIdKey];
var p = positionId == null
? new JobPosition()
: new JobPosition(Convert.ToInt32(positionId));
p.Update(pTitle.text, pMission.text, pDept.text);
Session[positionIdKey] = p.SaveDB();
}
记住要考虑(也可以)(每个人都发布了答案,我也可以解释为什么它是答案)。你可以安全地删除第二块代码,在那里处理事物的SQL方面。它不适用于你的问题,只会把问题弄得一团糟。:)不需要设置为空;事实上,不将它设置为任何值都更好,因为编译器会确保所有分支都会分配它(假设以后使用它)。您能解释一下为什么他会将它设置为null吗?在他的二进制方法中,这是一个无用的任务。Marc还就不设置它的好处提出了一个很好的观点。不需要初始化为null(另请参见我对George答案的评论)@MarcGravell不会给出编译时错误,如果你不这样做,请注意would@kd7不会的。编译器可以看到您在
if
和else
中分配了它,因此它可以证明p
已分配且不会引发错误。如果代码是If(a){p=…;}或者如果(b){p=…;}
,那么就不能证明任何明确的赋值,因为a
和b
都可能是错误的。正确答案(IMO)的向上投票不会在声明中为p赋值。是的,只要确保在所有分支中都指定了它,为其指定默认值是多余的。我有一些同事做那些事情,让我发疯。我想这只是一种习惯,停止你通常得到的编译器警告(只是在这个例子中没有)。