Разница между этим и как ключевое слово

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

 KMån26 сент. 2010 г., 20:51
Вы хотите отметить принятый ответ? Это помогло бы другим, ищущим подобный ответ.
 Eric Lippert24 сент. 2010 г., 17:26
Если вас интересует эта тема, вы, вероятно, также хотите узнать, в чем разница между операторами as и as:blogs.msdn.com/b/ericlippert/archive/2009/10/08/...
 LukeH24 сент. 2010 г., 13:09
Это как или есть как есть?blogs.msdn.com/b/ericlippert/archive/2010/09/16/...

Ответы на вопрос(15)

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

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

в качестве оператора

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

например

Type obj = Object as Type;

Преимущества как над В случае использования оператора is, чтобы набрать cast, нам нужно сделать два шага:

Check the Type using is
If it’s true then Type cast

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

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

 Claus Jørgensen31 авг. 2018 г., 09:06
Ответы на 8-летние вопросы, на которые уже есть много действительных ответов, не лучший способ использовать переполнение стека.

«is» предназначен для проверки равенства между типами и возвращает значение bool, а «as» для преобразования типов и возвращает ноль, если преобразование недопустимо вместо исключения

 Servy26 сент. 2016 г., 16:44
is никогда не может бросить
 tolanj26 сент. 2016 г., 16:50
«is» - это типовой тест, и никоим образом
 Tomer W20 сент. 2018 г., 15:26
это все еще не правильно ... это не уравнивает типы.
 Mohamed Alikhan25 июл. 2017 г., 07:39
Отредактированный (текущий) ответ правильный. Наличие отрицательных голосов в ответе вводит в заблуждение.
 ononeze26 сент. 2016 г., 17:11
Вы правы @tolanj Я только что отредактировал мой предыдущий ответ.

Оба ключевых слова «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 для использования ключевого слова is содержит инструкции IL какisinsta а такжеcastclass, но код IL для использования в качестве ключевого слова имеет толькоisinsta.

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

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

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

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

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

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

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

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

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

object ocust = new Customer();

if (ocust is Customer)
{ 

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

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

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

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

является

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

Пример:

if (someObject is StringBuilder) ...
как

as оператор пытается привести объект к определенному типу и возвращает ноль в случае сбоя.

Пример:

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

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

Кастинг

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

Пример:

StringBuilder b = (StringBuilder)someObject.
 Martin Smith23 авг. 2016 г., 21:03
Вы говорите мне, что целое число не может быть приведено к длинному? Тот(long)some_integer не удастся? Я почти уверен, что мы оба знаем, что это неправда, даже не запуская ее, поэтому, пожалуйста, объясните, что вы имеете в виду.
 user74338212 янв. 2018 г., 13:52
@Guffa Мартин Смит определенно использовал целое число в long. Слова имеют значения. Вы не можете просто придумать, что означает «приведение». Приведение - это не более или менее явное преобразование. Источник:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/... Явный пример с этой страницы:double x = 1234.7; int a; // Cast double to int. a = (int)x;
 Martin Smith02 авг. 2016 г., 22:35
Это не правильно.is не проверяет, можно ли привести объект к определенному типу. Целое число приводит к длинному штрафу, но10 is long ложно
 Guffa27 авг. 2016 г., 15:19
@MartinSmith: Вы все еще путаете кастинг с конверсией. Вы не приводите целое число к длинному, вы конвертируете целое число в длинное. Хотя они используют один и тот же синтаксис, ссылки преобразуются и значения преобразуются.
 Alexei Levenkov23 июн. 2015 г., 23:33
Попробуйте добавить замечание о проверках для типов значений, которые необходимо использоватьis (поскольку они не могут использоватьas - var v = someInt as int; (увидетьstackoverflow.com/questions/31013690/...)
 Guffa23 авг. 2016 г., 13:04
@MartinSmith: вы путаете преобразование типов с приведением типов. Целое число может быть преобразовано в длинное, но оно не может быть преобразовано в длинное, потому что оно не длинное.
 user123456727 дек. 2016 г., 12:55
Заметкаоколоis: "Обратите внимание, чтоявляется Оператор рассматривает только эталонные преобразования, преобразования в бокс и преобразования в распакованный ящик. Другие преобразования, такие как пользовательские преобразования, не рассматриваются.«(Msdn.microsoft.com/en-us/library/scekt9xw.aspx).Околоas: "Обратите внимание, чтокак Оператор выполняет только эталонные преобразования, преобразования с нулевым значением и преобразования в боксы. Оператор as не может выполнять другие преобразования, такие как пользовательские преобразования, которые вместо этого должны выполняться с использованием приведенных выражений."(msdn.microsoft.com/en-us/library/cscsdfbt.aspx)

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

if(obj is string)
{
     ...
}

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

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

string str = obj as string;
if(str != null)
{
     ...
}
 user233067823 июл. 2014 г., 20:04
+1 за «Ключевое слово as используется для приведения типов, допускающих значения NULL».

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

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

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

Оператор AS:

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

Оператор ИС:

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

 Musa Al-hassy01 июл. 2015 г., 23:11
Вклад - это вклад! Спасибо за указание ключевых слов "Безопасная типизация"! :-)
 Tukaram24 янв. 2015 г., 13:50
О, да ... Извините .... Я новичок в stackoverflow, так что немного вышли ... Не заметил опубликованную дату ...
 Soner Gönül09 янв. 2015 г., 16:01
Тебе не кажется, что уже слишком поздно, как 4 года?

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

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

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;
 Steven Sudit24 сент. 2010 г., 13:14
Ваш ответ правильный, но ваш пример кода является анти-паттерном. Это дорого делатьis затемas: распаковывает дважды. Для справочных типов, вы должны просто сделатьas, затем проверьте на ноль, чтобы увидеть, сработало ли это.

Разница междуЯВЛЯЕТСЯ а такжеКак в том, что..

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

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

Ex.

Student s = obj as Student;

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

Student s = obj is Student ? (Student)obj : (Student)null;
 Musa Al-hassy01 июл. 2015 г., 23:08
Эквивалентность ясно показывает, какой из этих двух элементов более примитивен и элегантно лежит в основе их отношений! Спасибо за эквивалентность!
 Alex Telon14 июл. 2017 г., 19:48
@ MusaAl-hassy На самом деле это не показывает, что является более примитивным.is может быть выражен сas а такжеas может быть выражен сis, Вот как сделатьis сas ключевое слово.Bool b = obj is Student;  эквивалентно:Bool b = (obj as Student) != null;  Подробнее об этомВот

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

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

Оператор as никогда не сгенерирует исключение.

 Patrick Peters18 янв. 2018 г., 07:27
Исправлена ​​опечатка относительно «есть» и «как»
 Pinte Dani12 янв. 2018 г., 08:06
Оператор «as» также не сгенерирует исключение, он просто вернет null.
И 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 Keyword: проверяет, совместим ли тип данного объекта с новым типом объекта. Возвращает ненулевое значение, если данный объект совместим с новым, в противном случае - нулевое. Это вызывает исключение.

`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`
MyClass myObject = (MyClass) obj;

против

MyClass myObject = obj as MyClass;

Вторая вернет ноль, если obj не является MyClass, а не сгенерирует исключение приведения класса.

будет только возвращать истину или ложь

Ваш ответ на вопрос