Объявление переменной в операторе if - PullRequest
5 голосов
/ 01 сентября 2011

В 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. Я делаю это так, потому что, глядя на ряд функций, которые я определил для обработки каждого события по отдельности, они все одинаковы, за исключением объявления одной переменной. Есть ли способ заставить это работать, или мне просто нужно придерживаться функции для каждого обработчика событий?

Ответы [ 6 ]

9 голосов
/ 01 сентября 2011

Если bla1Window и bla2Window оба совместно используют базовый класс или интерфейс, вы можете обращаться к ним таким образом. В этом случае, похоже, вы просто получаете доступ к свойствам 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();
2 голосов
/ 01 сентября 2011

Рассмотрим:

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();
}

Удачного кодирования.

0 голосов
/ 30 июля 2014

Я думаю, вы должны просто объявить переменную перед оператором if. Это должно решить вашу проблему. Пример

public string IfStatement()
{   
    string myValue = null;

    bool condition = true;
    if (condition)
    {
        myValue  = "something";
    }
    else
    {
        myValue  = "something else";
    }
    return myValue;
}
0 голосов
/ 01 сентября 2011

Вы действительно хотите сделать это интерфейсом и объявить интерфейс перед кодом if.Похоже, что все методы, которые вызываются на bla ниже, являются общими, что является отличным кандидатом на интерфейс (или абстрактный класс, если это более уместно).

На самом деле было бы лучше, если бы ваш код вообще не переключался в этом файле, а вы проходили через него внутри фабрики или что-то в этом роде.В интернете много информации об этом, если вы решите пойти по этому пути.

0 голосов
/ 01 сентября 2011

Все ваши окна должны иметь общего родителя. Используйте дочерний конструктор и назначьте его родительскому объекту, который может быть объявлен отдельно вне оператора 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();
    }
}
0 голосов
/ 01 сентября 2011

Решение состоит в том, чтобы просто поднять переменную в область, в которой она должна быть использована для использования после оператора (ов) 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...