Шаблоны использования C # для ключевого слова "is" - PullRequest
6 голосов
/ 02 ноября 2009

Что такое общие и не очень распространенные модели использования для C # keywork 'is'. Недавно я использовал его для подсчета количества используемых ячеек в типизированном массиве (все еще застрявшим внизу с классами, сгенерированными xsd, поскольку xsd2code имел ряд проблем с разработанной IETF схемой, следовательно, без универсальных элементов).

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

Ответы [ 5 ]

14 голосов
/ 02 ноября 2009

Ключевое слово 'is' полезно для определения того, может ли объект быть преобразован в тип посредством преобразования по ссылке, в бокс или распаковку (C # lang spec 7.9.10). Он похож на «как» за исключением того, что он на самом деле не выполняет преобразование, просто возвращает, если это возможно.

Это полезно в любом сценарии, когда полезно знать, можно ли преобразовать объект в тип, но не нужно иметь объект через ссылку на этот тип.

if ( o is SomeType ) {
  TakeSomeAction();
}

Если полезно иметь ссылку на указанный тип для значения, то вместо этого более эффективно использовать оператор «как».

// Wrong
if ( o is SomeType ) {
  SomeType st = (SomeType)o;
  st.TakeSomeAction();
}

// Right
SomeType st = o as SomeType;
if ( st != null ) {
  st.TakeSomeAction();
}
6 голосов
/ 02 ноября 2009

На самом деле, я почти никогда не использую его. Когда мне это нужно, это обычно потому, что я все равно приведу значение к требуемому типу, поэтому я предпочитаю использовать вместо него

Сравнить:

if (x is MyType)
{
    MyType y = (MyType)x;
    ...
}

А:

MyType y = x as MyType;
if (y != null)
{
    ...
}

В первом случае: 2 операции (1 проверка типа + 1 приведение)

Во втором случае: 1 операция (проверка типа + приведение в один выстрел)

1 голос
/ 02 ноября 2009

Я не помню, чтобы когда-либо использовал is. В большинстве случаев, если вам нужно знать, принадлежит ли экземпляр определенному типу, вам нужно использовать его как таковой.

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

Я пытаюсь написать код, который не нужно приводить, или найти информацию о типе более одного раза. Поэтому написание is перед приведением типа ссылки, безусловно, не рекомендуется.

0 голосов
/ 02 ноября 2009

Это зависит от того, нужна ли вам ссылка на тип, если это is тип данного типа. Если это так, вы должны использовать `as keyworkd.

MyObject mo = obj as MyObject;
if (mo == null) {
    // do something.
} else {
    // do something else.
}

, который даст ссылку, которую вы можете проверить на ноль. В противном случае, с помощью оператора as вам в любом случае потребуется выполнить приведение.

0 голосов
/ 02 ноября 2009

С выходом v4 вместо использования есть и так как есть другой возможный подход.

void somemethod(dynamic o)
{
DoStuff(o);
}

DoStuff(neededType o){}
DoStuff(object o){}

, который, однако, может иметь успех, но обеспечивает хорошую читаемость

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...