c# переключают проблему

Я плохо знаком с программированием и наличием проблемы со следующим кодом:

    private string alphaCoords(Int32 x)
    {
        char alphaChar;

        switch (x)
        {
            case 0: alphaChar = 'A'; break;
            case 1: alphaChar = 'B'; break;
            case 2: alphaChar = 'C'; break;
            case 3: alphaChar = 'D'; break;
            case 4: alphaChar = 'E'; break;
            case 5: alphaChar = 'F'; break;
            case 6: alphaChar = 'G'; break;
            case 7: alphaChar = 'H'; break;
            case 8: alphaChar = 'I'; break;
            case 9: alphaChar = 'J'; break;
        }

        return alphaChar.ToString();
    }

В компиляторе говорится: Использование неназначенной локальной переменной 'alphaChar'

Но я присваиваю его в своем блоке переключателя.

Я уверен, что это - мой отказ, поскольку я не знаю достаточно о программировании.

Советуйте.

Спасибо.

8
задан Ruben Bartelink 18 March 2010 в 23:54
поделиться

8 ответов

Вы назначаете его , если x равно 0-9. А что бы Вы ожидали, если бы x было 123? В то время как you может знать, что будут передаваться только значения между 0 и 9, компилятор не знает - поэтому it должен учитывать, что в противном случае произойдет.

Один из способов избежать этого - наличие в операторе switch оператора по умолчанию default, который можно использовать для выброса исключения, если значение не находится в ожидаемом диапазоне:

switch (x)
{
    case 0: alphaChar = 'A'; break;
    case 1: alphaChar = 'B'; break;
    case 2: alphaChar = 'C'; break;
    case 3: alphaChar = 'D'; break;
    case 4: alphaChar = 'E'; break;
    case 5: alphaChar = 'F'; break;
    case 6: alphaChar = 'G'; break;
    case 7: alphaChar = 'H'; break;
    case 8: alphaChar = 'I'; break;
    case 9: alphaChar = 'J'; break;
    default: throw new ArgumentOutOfRangeException();
}

Вот несколько более простая альтернатива, которая полностью удаляет оператор switch:

if (x < 0 || x > 9)
{
    throw new ArgumentOutOfRangeException();
}
char alphaChar = (char)('A' + x);

Обратите внимание, что вам do нужно проявлять осторожность при использовании арифметики, подобной этой. В Java и C# базовым представлением гарантированно является Unicode, что значительно облегчает жизнь. Я считаю, что это нормально для таких вещей (и гекс-парсинг/форматирование), но когда вы отважитесь на более экзотические сценарии, это не удастся. Опять же, это верно для многих техник упрощения кода... если они применяются неправильно, то в итоге вы получаете беспорядок.

.
35
ответ дан 3 November 2019 в 12:27
поделиться

Компилятор жалуется, потому что alphaChar является возможно неопределенным -- если это не одно из значений в Вашем переключателе , то оно не будет определено. Вы можете сделать одну из следующих вещей:

  • Установить начальное значение char, которое будет передано, если ни одно из условий переключателя не является истинным.
  • Добавьте пункт "по умолчанию" в оператор переключателя.
2
ответ дан 3 November 2019 в 12:27
поделиться

Перед первым использованием локальная переменная должна быть определенно присвоена (в соответствии с правилами спецификации на языке C#). В данном случае конструкция ключа не гарантирует, что alphaChar будет определённо назначен, что является ошибкой компилятора. Можно задать начальное значение alphaChar, и она обязательно будет присвоена.

.
2
ответ дан 3 November 2019 в 12:27
поделиться

Компилятор не имеет возможности узнать, что переменная x может содержать только числа до 9 (это то, что Вы проверяете в своем переключателе ). Так как случай по умолчанию отсутствует в Вашем переключателе, то может случиться, что alphaChar останется неприсвоенным. Вы можете либо добавить регистр по умолчанию , либо присвоить переменной значение перед переключателем .

.
0
ответ дан 3 November 2019 в 12:27
поделиться

Вам нужно добавить в оператор switch значение по умолчанию.

Компилятор говорит, что есть случаи, когда переменной не присваивается значение. Поэтому добавление

default:
  alphaChar = 'x'
break;

скажет компилятору "так что если я пропущу какой-нибудь сценарий, сделайте значение this"

или в случае, если Вы не хотите присваивать значение по умолчанию:

  default: throw new Exception();

Это не обязательно лучше, но другой способ сделать это:

 private string alphaCoords(Int32 x)
    {
      if(x >= 0 && x =< 9)
           return ((char)(x + 65)).ToString();
      else
        throw new ArgumentException();
    }
2
ответ дан 3 November 2019 в 12:27
поделиться

После объявления переменной char alphaChar необходимо "присвоить" ей значение (установить, что она равна чему-то), даже если вы ожидаете, что она получит значение в операторе коммутатора.

Можно присвоить ей 'A' или '0', или практически что угодно.

Это можно сделать в подобном объявлении

char alphaChar = 'A';

Или можно сделать отдельно

char alphaChar;    
alphaChar = 'A';
0
ответ дан 3 November 2019 в 12:27
поделиться

Добавьте значение по умолчанию к вашему коммутатору, потому что если x равно 10, то альфа-чар никогда не будет назначен.

0
ответ дан 3 November 2019 в 12:27
поделиться

Я думаю, что точка в том, что нет необходимости выходить из приложения, если у вас нет программного обеспечения для багги. Android выходит из приложения, когда пользователь не использует его и устройству требуется больше памяти. Если у вас есть приложение, которое должно запускать службу в фоновом режиме, вам, скорее всего, понадобится способ отключить службу.

Например, Google Listen продолжает воспроизводить подкаст, когда приложение не видно. Но всегда есть кнопка паузы, чтобы отключить подкаст, когда пользователь закончит с ним. Если я правильно помню, слушайте, даже поместите ярлык в панель уведомлений, чтобы вы всегда могли быстро перейти к кнопке паузы. Другим примером является приложение типа Twitter, например, которое постоянно опрашивает сервис в Интернете. Эти типы приложений должны действительно позволять пользователю выбирать, как часто опрашивать сервер или даже опрашивать в фоновом потоке.

Если при выходе требуется код, можно переопределить onPause (), onStop () или onDestroy (). http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

-121--1756807-

Это зависит от того, что вы хотите. Если вы хотите быстрый класс, то данные должны быть защищены и использовать защищенные и общедоступные методы. Потому что я думаю, вы должны предположить, что ваши пользователи, которые получают из вашего класса, знают ваш класс достаточно хорошо или, по крайней мере, они прочитали ваше руководство по функции, которую они собираются переопределить.

Если ваши пользователи связываются с вашим классом, это не ваша проблема. Каждый злонамеренный пользователь может добавить следующие строки при переопределении одного из ваших виртуалов:

(C #)

static Random rnd=new Random();
//...
if (rnd.Next()%1000==0) throw new Exception("My base class sucks! HAHAHAHA! xD");
//...

Вы не можете запечатать каждый класс, чтобы предотвратить это.

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

Но я лично не люблю придерживаться принципов упа любой ценой. Особенно создание свойств с единственной целью сделать членов данных закрытыми.

(C #):

private _foo;
public foo
{
   get {return _foo;}
   set {_foo=value;}
}

Таково было мое личное мнение.

Но делайте, что требует ваш босс (если он хочет частные поля, чем это.)

-121--2428073-

Значение переменной alphaChar присваивается на основе некоторого условия. Представьте себе сценарий, в котором переменная x содержит значение, отличное от 0 к 9. Предположим, что он содержит 10. Тогда ни одно из условий случая не будет удовлетворено x , поэтому alphaChar не будет присвоено никакого значения, в результате оно будет полностью неинициализировано. Поэтому при преобразовании alphaChar в строку оно преобразует некоторое значение мусора в строку и возвращает его вызывающему методу. Это причина, по которой вы получаете это сообщение.

Если вы хотите получить простое решение, то добавьте следующий код ниже

case 9: alphaChar = 'J'; 
        break; 

-

default: return null;

и проверьте методы вызова, возвращает ли эта функция alphaCoords значение null, как это -

if(alphaCooord(10) == null)
{
    // x contains value other than 0 to 9
}
else
{
    // x contains value between 0 to 9, so the returned value will be the string
    // representation of the corresponding character
}

В этом пути ваш код не будет слишком сложным,или вам не нужно будет бросать или обрабатывать какие-либо исключения или что-то подобное.

Надеюсь, что это поможет:).

1
ответ дан 3 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: