#c#
#c#
Вопрос:
У меня есть небольшой метод, который разбивает строку на две части, извлекает одну часть и использует ее для установления соединения с сервером:
private void RetrieveData(string vesselCode)
{
string[] splitSelectedVessel = vesselCode.Split('_');
int selectedVessel = int.Parse(splitSelectedVessel[1]);
// URL of server to retrieve data.
// constructed with vesselCode.
string baseUrl = ".../vehicle/";
string jsonUrl = baseUrl selectedVessel;
PtVehicle currentVessel = DownloadAndDeserialize<PtVehicle>(jsonUrl);
}
VesselCode содержит две части, объединенные символом ‘_’ между ними:
- код компании
- vesselnumber
Оба имеют поля ввода из проекта Xamarin и изначально хранятся в виде строк.
Всякий раз, когда часть VesselNumber становится слишком большой, она просто останавливается сразу после int selectedVessel = int.Parse(splitSelectedVessel[1]);
. Кажется, что он выходит из описанного выше метода, не выдавая предупреждения или чего-либо еще. Я протестировал это с точками останова в каждой строке. Он просто прекращает выполнение этого метода и продолжает делать то, что делал, часто позволяя приложению завершать работу позже (поскольку ему нужно это значение). Что здесь происходит?
Комментарии:
1. Самое время начать использовать обработку исключений C #!! Также
string jsonUrl = baseUrl selectedVessel;
выглядит подозрительно. Разные типы, передаваемые в операнд
2. как долго? получение числовой части может вызвать исключение
int.Parse(splitSelectedVessel[1]);
, если она выходит за пределы диапазона int, но не должно вызывать проблем при разделении строки.3. Числа могут быть сколь угодно большими, используемые заполнения, на это нет ограничения.
4. @sjsam Я немного переработал, чтобы вместо этого разобрать selectedVessel как строку (проблема также исправлена).
string jsonUrl = baseUrl selectedVessel;
Все равно будет ли таким образом плохой код?5. максимальное значение int в c # равно 2,147,483,647 ..попробуйте long.
Ответ №1:
Я полагаю, что ваше число слишком длинное для int
. Я не знаю, каким может быть максимальное число, но вы можете попробовать long
вместо этого. Вероятно, этого достаточно.
Если это не так, то вам нужно что-то сделать с обработкой слишком больших чисел. Вы можете написать
if (long.TryParse(myString, out myValue)
{
// Your logic here
}
else
{
// Do something if the value is too large
}
Комментарии:
1. Ах, это имеет большой смысл (по ссылке Михая). Действительно, кажется, что число было слишком большим для сохранения в int. Зная это, я исправил проблему, проанализировав его как строку вместо этого (мне не нужно ничего вычислять с ним, просто используя его для подключения и тому подобное).
Ответ №2:
В итоге я исправил проблему с помощью @Ilya Chernomordik и документации, предоставленной @Mihai.
Проблема заключалась в том, что int selectedVessel = int.Parse(splitSelectedVessel[1]);
значение этой строки преобразуется в значение int. Когда значение было больше, чем максимальный размер int, произошел сбой. Поскольку VesselNumber — это идентификатор, и мне не нужно его вычислять, я просто решил проблему, сохранив его в виде строки:
string selectedVessel = splitSelectedVessel[1];
Другой способ — сохранить его как long (int) из 64 бит, но это только «переносит» проблему на гораздо большее число.
Ответ №3:
Здесь происходит то, что вы создаете исключение. Рассмотрим следующий код…
try
{
string s1 = "2147483649";
int j = int.Parse(s1);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
2147483649 равно int.MaxValue 1
Этот код генерирует следующее сообщение:
Value was either too large or too small for an Int32.
Комментарии:
1. Это не очень хорошее решение, есть
int.TryParse
способ избежать возникновения исключений2. @IlyaChernomordik это вообще не решение. Я просто отвечаю на вопрос «что здесь происходит?»
3. Верно, я полагаю, вопрос был о том, что происходит 🙂
Ответ №4:
Он должен выдавать System.OverflowException
, если число слишком велико, чтобы быть проанализировано как int. Согласно документации Microsoft long
/ ulong
имеет самый большой диапазон.
Возможно, у вас отключена функция прерывания для исключений, если вы используете Visual Studio, поэтому вы можете захотеть включить их, чтобы увидеть, в чем реальная проблема Debug->Windows->Exception Settings
, и убедиться, что проверяются исключения Common Language Runtime.
С другой стороны, наилучшей практикой является использование .TryParse
подхода при преобразовании в целочисленный тип.