Вы можете использовать метод 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;