Nullable Int Тип, который будет связан со значением в цикле. Какой ваш любимый подход? - PullRequest
1 голос
/ 16 июня 2011

Я использую C # и ASP.NET.

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

Что мне нужно сделать:

Мне нужно установить переменную int imageId, используя цикл. Переменная imageId находится вне цикла, поэтому может использоваться в другой части моего кода.

Мои вопросы:

  • Почему, если я использую только int imageId; жалобу компилятора (ОШИБКА: использование неназначенной локальной переменной 'imageId')?
  • Я использую nullable int type вместо int imageId = 0;, поэтому я могу установить для него нулевое значение ... (мне кажется, семантически правильно) вы бы порекомендовали? Если нет, то почему.
  • Какой ваш любимый подход к решению этой проблемы?

Спасибо, ребята, за вашу поддержку !!!!

           int? imageId = null;
            foreach (DictionaryEntry valueEntry in e.Keys)
            {
                if (valueEntry.Key.Equals("ImageContentId"))
                {
                    imageId = Convert.ToInt32(valueEntry.Value.ToString());
                    break;
                }
            }

Пожалуйста, дайте мне пример вашего кода спасибо!

Ответы [ 4 ]

4 голосов
/ 16 июня 2011

Вы можете использовать метод IOrderedDictionary Содержит .Это позволит вам вообще отказаться от конструкции цикла.например,

if( e.Keys.Contains("ImageContentId") )
{
    imageId = Convert.ToInt32( e.Keys["ImageContentId"].ToString() );
}

Также, если вы знаете, что значение является строкой, вас может заинтересовать метод Int32.TryParse , например,

int imageId ;
if( Int32.TryParse(e["ImageContentId"].ToString(), out imageId ) )
{ }

Единственная причина, по которойвам следует использовать int?, если данные, которыми вы манипулируете, могут быть неинициализированы.Если вы анализируете данные, и это мусор, у вас есть 2 варианта: (NB: Это предполагает, что вы не хотите, чтобы исключения генерировали RE плохих данных).

1) Используйте значение по умолчанию - Это имеетпреимущество того, что по своей природе терпимо относится к неверным данным.

2) Используйте конструкцию int? - это дает преимущество в информировании остальной части кода о том, что данные известны как неверные, и гарантирует, что они разработанысправиться с нулевыми значениями.

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

Что касается ошибки компилятора: если вы инициализируете imageId в операторе if, будут случаи, когда ветвь инициализации не будет принята, например, неверное значение.Чтобы гарантировать, что imageId всегда инициализируется, компилятор заставит вас инициализировать его вне условного пути кода.Обычно я всегда пытаюсь инициализировать переменную, когда объявляю ее.например,

int imageId = 0;
1 голос
/ 16 июня 2011

Ответы на ваши вопросы

  • Все типы значений в .net реализованы в виде структуры.И вся структура должна быть инициализирована перед использованием.
  • Если вы хотите проверить, существует ли это значение или нет, тогда nullable - это правильный выбор.В противном случае никаких проблем с int imageId = 0
  • Вы можете использовать ниже код
 int imageId = 0;
 if( e.Contains("ImageContentId") )
 {
     //If you are sure value is int
     imageId = (int)e["ImageContentId"];
 }
0 голосов
/ 16 июня 2011

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

bool value_present = false;
int imageId;

foreach (DictionaryEntry valueEntry in e.Keys)
{
    if (valueEntry.Key.Equals("ImageContentId"))
    {
        value_present = true;
        imageId = Convert.ToInt32(valueEntry.Value.ToString());
        break;
    }
}

А затем протестируйте value_present перед использованием imageId.

Тем не менее, как уже отмечали другие, это безумие.

  • Не зацикливайтесь, просто звоните e.Keys.Contains()
  • Не преобразовывать в строку, а затем обратно в int. Если это int, разыграй его.
0 голосов
/ 16 июня 2011

вы можете использовать Linq, чтобы найти запись:

var foundKey = e.Keys.FirstOrDefault(k => k.Key.Equals('ImageContentId'));

Затем троичное выражение для получения значения:

int? imageId = foundKey == null ? (int?)null : Convert.ToInt32(foundKey.Value);

Однако, какой тип является значением?Если вы уверены, что это int, вы можете разыграть его, вместо того, чтобы звонить Convert.ToInt32.Кроме того, Convert.ToInt32 возвращает 0 для некоторых случаев, когда вы можете захотеть (int?)null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...