Создайте ключевое слово "AS" - PullRequest
2 голосов
/ 04 марта 2009

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

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

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

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

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 04 марта 2009

Это известно как безопасный бросок. Что он делает, он пытается привести от одного типа к другому, и если произойдет сбой, он возвращает 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 для более подробного объяснения.

3 голосов
/ 04 марта 2009

The в качестве ключевого слова надежный способ бросить объекты в C #.

SomeType a = obj as SomeType;

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

0 голосов
/ 04 марта 2009

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

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

Итак, оператор as полезен для «перемещения вверх и вниз по иерархии наследования»: если у вас есть класс Person, вы можете сделать: Person p = new Person (); ojbect o = p как объект; р = о как личность; Но во всех случаях объект в памяти не будет изменен каким-либо образом, только ссылка на него.

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

0 голосов
/ 04 марта 2009

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

...