Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#asp.net中有条件地创建类的新实例?_C#_Asp.net - Fatal编程技术网

如何在C#asp.net中有条件地创建类的新实例?

如何在C#asp.net中有条件地创建类的新实例?,c#,asp.net,C#,Asp.net,我有一个具有不同构造函数的类。一个构造函数不传递任何内容(创建新记录),另一个构造函数传递ID(用于更新)。我想测试一个条件,并根据结果创建类对象的新实例。我的问题是,对象不执行if语句 protected void Position() { if (Session["PositionID"] == null) { JobPosition p = new JobPosition(); } else { JobPositio

我有一个具有不同构造函数的类。一个构造函数不传递任何内容(创建新记录),另一个构造函数传递ID(用于更新)。我想测试一个条件,并根据结果创建类对象的新实例。我的问题是,对象不执行if语句

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赋值。是的,只要确保在所有分支中都指定了它,为其指定默认值是多余的。我有一些同事做那些事情,让我发疯。我想这只是一种习惯,停止你通常得到的编译器警告(只是在这个例子中没有)。