Разница между ключевым словом is и as


121

Расскажите , пожалуйста , в чем разница между isи asключевым словом в C #


7
Есть как есть или как есть? blogs.msdn.com/b/ericlippert/archive/2010/09/16/…
LukeH

3
Если вас интересует эта тема, вы, вероятно, также захотите узнать, в чем разница между операторами as и cast: blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Эрик Липперт

7
Отметить ответ принятым? Это поможет другим, ищущим аналогичный ответ.
KMån

Ответы:


151

является

В isоператоре проверяет , является ли объект может быть приведен к типу конкретного.

Пример:

if (someObject is StringBuilder) ...

так как

В asоператоре пытается привести объект к типу конкретного, и возвращает нулевое значение , если она выходит из строя.

Пример:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

Также связанные:

Кастинг

Оператор приведения пытается привести объект к определенному типу и в случае неудачи выдает исключение.

Пример:

StringBuilder b = (StringBuilder)someObject.

4
Это не так. isне проверяет, можно ли привести объект к определенному типу. Целое число приводит к длительному штрафу, но 10 is longявляется ложным.
Мартин Смит

9
@MartinSmith: Вы смешиваете преобразование типов с приведением типов. Целое число может быть преобразовано в long, но не может быть преобразовано в long, потому что оно не длинное.
Guffa

2
Вы говорите мне, что целое число не может быть преобразовано в long? Это (long)some_integerне удастся? Я почти уверен, что мы оба знаем, что это неправда, даже не запустив его, поэтому, пожалуйста, объясните, что вы имеете в виду.
Мартин Смит

12
@MartinSmith: Вы все еще путаете кастинг с конверсией. Вы не преобразуете целое число в long, вы преобразуете целое число в long. Хотя они используют один и тот же синтаксис, ссылки приводятся и значения преобразуются.
Guffa

2
Примечание оis : « Обратите внимание, что оператор is учитывает только ссылочные преобразования, преобразования упаковки и преобразования распаковки. Другие преобразования, такие как пользовательские преобразования, не рассматриваются » (msdn.microsoft.com/en-us/library/scekt9xw .aspx). О программеas : « Обратите внимание, что оператор as выполняет только преобразования ссылок, преобразования, допускающие значение NULL, и преобразования упаковки. Оператор as не может выполнять другие преобразования, такие как пользовательские преобразования, которые вместо этого должны выполняться с использованием выражений приведения. » ( Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567,

33

Разница между IS и As в том, что ..

IS - Оператор Is используется для проверки совместимости объекта с заданным типом и возвращает результат в виде логического значения (истина или ложь).

AS - Оператор As используется для приведения объекта к заданному типу или классу.

Ex.

Student s = obj as Student;

эквивалентно:

Student s = obj is Student ? (Student)obj : (Student)null;

1
Эквивалентность ясно показывает, кто из двоих более примитивен, и элегантно лежит в основе их отношений! Спасибо за равноценность!
Муса Аль-Хасси 01

1
@ MusaAl-hassy На самом деле это не показывает, что более примитивно. isможно выразить с помощью asи asможно выразить с помощью is. Вот как сделать isс asключевым словом. Bool b = obj is Student; эквивалентно: Bool b = (obj as Student) != null; Подробнее об этом здесь
Alex

8

Как isи asключевые слова используются для типа литья в C #.

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

Код C #:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

Код IL (приведенный выше код C # находится на прикрепленном изображении):

Код IL для вышеуказанного кода C # Код IL для isиспользования ключевого слова содержит инструкции IL isinstaи castclass.
Но код IL для asиспользования ключевого слова имеет только isinsta.

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

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

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

isи asключевые слова будут использоваться в зависимости от необходимости.


6

Ключевое слово is проверяет, является ли значение с левой стороны экземпляром типа с правой стороны. Например:

if(obj is string)
{
     ...
}

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

Ключевое слово as используется для приведения типов, допускающих значение NULL. Если указанное значение не является экземпляром указанного типа, возвращается null. Например:

string str = obj as string;
if(str != null)
{
     ...
}

+1 за «Ключевое слово as используется для приведения типов, допускающих значение NULL».
user2330678

3

Я бы сказал: читайте MSDN онлайн, но вот он:

Оператор is проверяет, совместим ли объект с заданным типом, и результатом оценки является логическое значение: истина или ложь.

Оператор as никогда не вызовет исключения.


Оператор «as» также не вызовет исключения, он просто вернет null.
Пинте Дани

Исправлена ​​опечатка относительно «есть» и «как»
Патрик Питерс

2

Оператор Is, преобразование, возвращает истину в случае успеха. Он возвращает false, если приведение не удалось. С его помощью вы не можете захватить преобразованную переменную. Этот оператор наиболее полезен при проверке типов в операторах if и выражениях. Is-cast идеален только в том случае, если результирующая переменная не понадобится для дальнейшего использования.

Как и гипс. С его помощью мы повышаем производительность и избегаем исключений, когда приведение неверно. Если приведение невозможно, возвращается значение NULL. Для ссылочных типов рекомендуется преобразование в исходное состояние. Это и быстро, и безопасно: мы можем проверить полученную переменную на нулевое значение, а затем использовать ее. Это исключает лишние броски.


2
  1. Оператор is проверяет, совместим ли объект с заданным типом, результат основан на истинном или ложном.
  2. as используется для приведения одного типа к другому, и при сбое преобразования приводит к нулю, за исключением того, что возникает исключение. хорошо посмотрите ссылку для лучшего понимания с примерами https://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/

2

is OPERATOR Оператор is в C # используется для проверки типа объекта и возвращает логическое значение: true, если объект имеет тот же тип, и false, если нет. или также Оператор «is» используется для проверки того, совместим ли тип времени выполнения объекта с данным типом или нет. Для нулевых объектов он возвращает false, например

if(obj is AnimalObject)
{
 //Then Work
}

как ОПЕРАТОР

Оператор as выполняет ту же работу, что и оператор is, но разница в том, что вместо bool он возвращает объект, если они совместимы с этим типом, иначе он возвращает null. Другими словами, оператор as используется для выполнения преобразований между совместимыми типы.

например

Type obj = Object as Type;

Преимущества as over is В случае оператора is для приведения типа необходимо выполнить два шага:

Check the Type using is
If its true then Type cast

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

Чтобы этого избежать, используйте as, он сделает это за один шаг. Только для проверки типа мы должны использовать оператор is.


Ответить на вопросы 8-летней давности, на которые уже есть много правильных ответов, - не лучший способ использовать Stack Overflow.
Клаус Йоргенсен

1

Оператор As похож на приведение типов, но в случае сбоя возвращает null вместо исключения.

А оператор Is используется для проверки совместимости одного объекта с определенным типом. Обычно используется в операторах If.


1

is: Оператор is используется для проверки совместимости типа времени выполнения объекта с заданным типом.

as: Оператор as используется для преобразования между совместимыми типами.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
Ваш ответ правильный, но ваш пример кода - антипаттерн. Это дорого , чтобы сделать isто as: это unboxes дважды. Для ссылочных типов вы должны просто сделать as, а затем проверить значение null, чтобы увидеть, сработало ли это.
Стивен Судит,

1

Посмотрите видео на YouTube ниже, в котором разница более наглядно и наглядно объясняется:

https://www.youtube.com/watch?v=IKmRtJcRX_I

Ниже приводится длинный ответ с объяснением кода.

Ключевое слово «IS» полезно для проверки совместимости объектов с типом. Например, в приведенном ниже коде мы проверяем, является ли объект «ocust» типом класса «Клиент».

object ocust = new Customer();

if (ocust is Customer)
{ 

Ключевое слово «AS» помогает выполнить преобразование из одного типа в другой. Например, в приведенном ниже коде мы преобразуем объект в строковый тип данных. Если ключевое слово «AS» не может выполнить приведение типа, оно возвращает NULL.

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

против

MyClass myObject = obj as MyClass;

Второй вернет null, если obj не является MyClass, а не вызовет исключение приведения класса.

is вернет только истину или ложь


1

И IS, и AS используются для безопасного литья типов.

IS Keyword -> проверяет, совместим ли тип данного объекта с новым типом объекта. Он никогда не вызывает исключения. Это логический тип. Возвращает значение true или false.

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

Ключевое слово AS: проверяет, совместим ли тип данного объекта с новым типом объекта. Он возвращает ненулевое значение, если данный объект совместим с новым, иначе - null. Это вызывает исключение.

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

Оба оператора используются для безопасного приведения типов.

Оператор AS:

Оператор AS также проверяет, совместим ли тип данного объекта с новым типом объекта. Это ключевое слово проверяет, совместим ли тип данного объекта с новым типом объекта. Если он несовместим с новым, он вернет NULL.

Оператор ИБ:

Этот оператор проверяет, совместим ли тип объекта с новым объектом. Если он совместим, он возвращает true, иначе false.


Вам не кажется, что это уже слишком поздно, например, 4 года?
Soner Gönül

О, да ... Извините .... Я новичок в stackoverflow, так что немного вышло ... Не заметил опубликованную дату ...
Тукарам

Вклад - это вклад! Благодарим за указание на ключевые слова "Безопасное приведение типов"! :-)
Муса Аль-Хаси
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.