C# if语句中的变量声明

C# if语句中的变量声明,c#,xaml,variables,if-statement,C#,Xaml,Variables,If Statement,在C#中,对于我正在编写的一个相对简单的程序,我试图创建一个事件处理函数,该函数将处理多个源,如下所示: private void fooHandler(object sender, RoutedEventArgs e) { fooObject objectFoo = (fooObject)sender; if (objectFoo.name == "bla1"){ bla1Window bla = new bla1Window(); } if (

在C#中,对于我正在编写的一个相对简单的程序,我试图创建一个事件处理函数,该函数将处理多个源,如下所示:

private void fooHandler(object sender, RoutedEventArgs e)
{
    fooObject objectFoo = (fooObject)sender;
    if (objectFoo.name == "bla1"){
        bla1Window bla = new bla1Window();
    }
    if (objectFoo.name == "bla2"){
        bla2Window bla = new bla2Window();
    }
    .
    .
    .
    else{
        //default stuff happens
    }
bla.Left = this.Left
bla.Top = this.Top
bla.Show();
this.Close();
}
该功能用于窗口切换。
问题是,只要退出if语句,变量就不在范围内。我这样做是因为,看看我定义的一系列单独处理每个事件的函数,除了单变量声明之外,它们都是相同的。有什么方法可以让它工作,还是我只需要为每个事件处理程序使用一个函数?

解决方案是简单地将变量提升到它需要的范围内,以便在if语句之后使用。就这么简单。不过,我建议您尝试重构这个,或者至少发布您的真实代码,这样我们就可以试一试了。当您有一堆代码在多个if语句中一个接一个地重复时,通常可以将其简化为一个或两个方法

private void fooHandler(object sender, RoutedEventArgs e)
{
    fooObject objectFoo = (fooObject)sender;

    // use the base class and work with that.
    // all windows have the properties you use 
    // below, so there is no need to declare it
    // as a more specific type.
    blahWindow bla = null; 
    if (objectFoo.name == "bla1"){
        bla = new bla1Window();
    }
    if (objectFoo.name == "bla2"){
        bla = new bla2Window();
    }
    .
    .
    .
    else{
        //default stuff happens
        bla = new BlahDefault();
    }

    // 'bla' cannot be nbull here if each branch above assigns it
    bla.Left = this.Left
    bla.Top = this.Top
    bla.Show();
    this.Close();
}

所有窗口都应该有一个共享的父窗口。使用子构造函数并将其分配给父对象,该父对象可以在“if”语句之外单独声明

private void fooHandler(object sender, RoutedEventArgs e)
{
    Window bla = null;
    fooObject objectFoo = (fooObject)sender;
    if (objectFoo.name == "bla1"){
        bla = new bla1Window();
    }
    if (objectFoo.name == "bla2"){
        bla = new bla2Window();
    }
    .
    .
    .
    else{
        //default stuff happens
    }
    if(bla != null)
    {
        bla.Left = this.Left
        bla.Top = this.Top
        bla.Show();
        this.Close();
    }
}

如果
bla1Window
bla2Window
都共享一个基类或接口,则可以这样引用它们。在本例中,看起来您只是在访问
窗口的属性,因此可以执行以下操作:

Window window = null;
fooObject objectFoo = (fooObject)sender;
if (objectFoo.name == "bla1"){
    window = new bla1Window();
}
else if (objectFoo.name == "bla2"){
    window = new bla2Window();
}
.
.
.
else{
    //default stuff happens
}

window.Left = this.Left
window.Top = this.Top
window.Show();
this.Close();
考虑:

private void fooHandler(object sender, RoutedEventArgs e)
{
    fooObject objectFoo = (fooObject)sender;
    Window bla; // a super-type or interface, don't assign a value here
                // so there will be a compile error if it was
                // forgotten below
    if (objectFoo.name == "bla1"){
        bla = new bla1Window();
    } else if (objectFoo.name == "bla2"){
        bla = new bla2Window();
    } else {
        // just make sure to assign to bla
        // or there will a compiler error later
    }
    bla.Left = this.Left
    bla.Top = this.Top
    bla.Show();
    this.Close();
}
不过,我通常会这样写:

Window CreateFromName(string name) {
    if (name == "bla1"){
        return new bla1Window();
    } else if (name == "bla2"){
        return new bla2Window();
    } else {
        // just make sure to return a value
        // or there will a compiler error later
    }
}

private void fooHandler(object sender, RoutedEventArgs e)
{
    fooObject objectFoo = (fooObject)sender;
    Window bla = CreateFromName(objectFoo.name);
    bla.Left = this.Left
    bla.Top = this.Top
    bla.Show();
    this.Close();
}

愉快的编码。

您真的希望将其作为一个接口,并在
if
代码之前声明接口。看起来下面在
bla
上调用的所有方法都是通用的,这是接口(或者更合适的抽象类)的最佳候选方法


事实上,如果您的代码在这个文件中根本没有切换,并且您可以在工厂或其他地方通过它,这将是最好的。如果你决定这样做,互联网上有很多信息。

我认为你应该确保在if语句之前声明变量。 那应该能解决你的问题。 范例


这也行得通,但为什么它比只使用var窗口要好呢?@Will,因为它行得通;-)<代码>变量
需要为其分配初始值,以便它“知道类型”<代码>var objectFoo=(object)null仅如此有用;-)
dynamic
没有这个问题,但是…@pst-虽然我认为只使用Window是正确的方法,但是使用var objectFoo=(Window)null;将完成同样的事情。@Chris:那只是因为您仍然通过cast为编译器提供类型。就我个人而言,我会在任何代码审查中拒绝这一行代码(并与编写它的开发人员进行认真的交谈),因为它比只执行
windowobjectfoo=null更容易键入,也不太清晰@Reed:我完全同意,我只是指出它会起作用。
public string IfStatement()
{   
    string myValue = null;

    bool condition = true;
    if (condition)
    {
        myValue  = "something";
    }
    else
    {
        myValue  = "something else";
    }
    return myValue;
}