Вопрос

Недавно я начал работать с JSON и фреймворком ExtJS и наткнулся на следующий код в примере.

мы извлекаем информацию из интерфейса, используя это:

object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);

Затем в приведенном примере они делают следующее:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

Я никогда раньше не видел, чтобы ключевое слово "as" использовалось подобным образом.Является ли это просто еще одной формой явного боксирования переменной updatedConfig как JavaScriptObject или есть что-то, чего я не понимаю в этом?

Спасибо

Это было полезно?

Решение

Это известно как безопасный бросок.Что делает is, так это пытается выполнить преобразование из одного типа в другой, и если приведение завершается неудачей, оно возвращает null вместо того, чтобы бросать InvalidCastException.

На самом деле существуют две отдельные инструкции IL для обработки разницы между "as"литье и обычное статическое литье.Следующий код C # содержит оба типа приведения:

using System;

class Program
{
    static void Main()
    {
        Object o = null;

        String s0 = (String)o;
        String s1 = o as String;
    }
}

Первый бросок использует castclass Инструкция IL, и второе приведение использует isinst инструкция.

Пожалуйста, посмотрите Приведение по сравнению с использованием ключевого слова 'as' в среде CLR для более подробного объяснения.

Другие советы

В как ключевое слово это более безопасный способ приведения объектов в C #.

SomeType a = obj as SomeType;

Означает , что если obj относится к типу SomeType, obj будет приведен к этому типу.Если obj имеет значение null или не имеет типа SomeType, a будет равно нулю.

Другим преимуществом ключевого слова as является то, что оно вызовет исключение во время компиляции, если тип не может быть приведен, где as (приведение) не прерывается до времени выполнения.

Кроме того, важно помнить, что "as" действует в ссылке, а не в самом объекте.Вот почему он может возвращать null вместо того, чтобы выдавать исключение, потому что объект останется нетронутым.И именно поэтому вы можете сделать это только для ссылочных типов.

Обычно это не имеет большого значения, но если вы реализуете функцию приведения (как здесь в MSDN) это будет не вызывается с помощью оператора as.

Итак, оператор as полезен для "перемещения вверх и вниз по иерархии наследования".:Если у вас есть классный Руководитель, вы можете сделать:Персона p = новый Персона();ojbect o = p как объект;p = o как Личность;Но во всех случаях объект в памяти никоим образом не будет изменен, только ссылка на него.

Надеюсь, это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top