if语句中的变量声明

本文关键字:变量 声明 语句 if | 更新日期: 2023-09-27 18:07:20

在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语句中的变量声明

如果bla1Windowbla2Window都共享一个基类或接口,您可以这样引用它们。在这种情况下,看起来你只是访问Window的属性,所以你可以这样做:

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语句之后使用的范围内。就是这么简单。然而,我还是建议你试着重构一下,或者至少把你的真实代码贴出来,这样我们就可以试一试了。当你有一堆代码在多个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();
    }
}

您真的想让它成为一个接口,并在if代码之前声明该接口。看起来下面bla上调用的所有方法都是通用的,这是接口(或抽象类,如果更合适的话)的绝佳候选。

实际上,如果你的代码在这个文件中根本没有切换,并且你在工厂或其他地方通过它,那将是最好的。如果你决定这么做的话,网上有很多关于这方面的信息

我认为你应该确保在if语句之前声明变量。这样你的问题就解决了。示例

public string IfStatement()
{   
    string myValue = null;
    bool condition = true;
    if (condition)
    {
        myValue  = "something";
    }
    else
    {
        myValue  = "something else";
    }
    return myValue;
}