Чтобы понять это, сначала нужно немного разобраться с областью действия и областью объявления:
Область действия определяет, где вы можете использовать имя, а область объявления фокусируется на том, где это имя уникально.Область действия и область объявления тесно связаны, но есть несколько тонких различий.
Более формальное определение заключается в том, что область действия - это включающий контекст или область, которая определяет, где имя может использоваться без квалификации.
В C # область видимости и область объявления определяются блоком операторов, заключенным в фигурные скобки.Это означает, что пространства имен, классы, методы и свойства определяют как область действия, так и пространство объявления.В результате области могут быть вложенными и перекрывать друг друга.
Семантика языка для блока try (правильно называемого защищенной областью) заключается в том, что защищенная область определяет область действия.Это означает, что любые переменные, определенные внутри этой области видимости, видны только по имени в этой области (и любые вложенные области видимости).
Следующее, с чем вы столкнетесь, это то, что .NET Framework обеспечивает безопасность типов:запретить унифицированные переменные.В результате, поскольку вы объявляете HttpWebRequest request;
как локальную переменную, ему не было предоставлено начальное значение.Кроме того, поскольку единственное место, которое фактически предоставляет значение, находится внутри защищенной области, компилятор «достаточно умен», чтобы понимать, что код внутри защищенной области может не работать (в результате возникновения исключения), он можетубедитесь, что путь выполнения может привести к тому, что request
никогда не будет присвоено значение, и выдаст ошибку.
Правильный способ справиться с этим - использовать такой код:
HttpWebRequest request = null;
try
{
request = (HttpWebRequest) WebRequest.Create(url);
}
catch (UriFormatException)
{
statusLabel.Text = "The address you entered was malformed, please correct it.";
statusLabel.ForeColor = Color.Red;
}
if (request != null)
{
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
}