Різниця між ключовим словом є


121

Скажіть, будь ласка, у чому різниця між ключовим словом isта asключовим словом у C #



3
Якщо вас цікавить ця тема, ви, напевно, також хочете дізнатися, в чому різниця між операторами "як" та "литі": 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) ...

Також пов'язані:

Кастинг

В операторі литий спроби привести об'єкт до типу специфічного і генерує Exeption , якщо він зазнає невдачі.

Приклад:

StringBuilder b = (StringBuilder)someObject.

4
Це не правильно. isне перевіряє, чи може об’єкт бути переданий певному типу. Ціле число приводить до великого штрафу, але 10 is longє помилковим.
Мартін Сміт

9
@MartinSmith: Ви змішуєте перетворення типів із кастингом. Ціле число може бути перетворене в довге, але воно не може бути переведене на довге, оскільки воно не є довгим.
Гуффа

2
Ти мені кажеш, що ціле число не можна ставити на довге? Це (long)some_integerне вдасться? Я впевнений, що ми обидва знаємо, що це неправда, навіть не запустивши її, тому поясніть, що ви маєте на увазі.
Мартін Сміт

12
@MartinSmith: Ви все ще плутаєте трансляцію з конверсією. Ви не кидаєте ціле число в довге, ви перетворюєте ціле число в довге. Хоча вони використовують один і той же синтаксис, посилання перераховуються і значення перетворюються.
Гуффа

2
Примітка проis : « Зверніть увагу , що є . Оператор враховує тільки посилальні перетворення, бокс перетворення і перетворення розпакування Інші перетворення, такі як визначені користувачем перетворення, які не зважають на. » (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Проas : « Зверніть увагу , що , як .. Оператор виконує тільки посилання на перетворення, обнуляє конверсії і бокс конверсій , як оператор не може виконувати інші перетворення, такі як певні користувачем перетворення, які замість цього повинні бути виконані за допомогою литих виразів » ( MSDN .microsoft.com / en-us / library / cscsdfbt.aspx )
користувач1234567

33

Різниця між ІС і Як полягає в тому, що ..

IS - чи Оператор використовується для перевірки сумісності об'єкта із заданим типом, і він повертає результат як булева (справжня чи помилкова).

AS - Оператор використовується для кастингу об'єктів для даного типу або класу.

Вих.

Student s = obj as Student;

еквівалентно:

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

1
Еквівалентність чітко показує, хто з двох є більш примітивним і елегантно лежить в їх стосунках! Дякую за еквівалентність!
Musa Al-hassy

1
@ MusaAl-hassy Насправді це не показує, що є більш примітивним. isможна виразити за допомогою asі asможна виразити за допомогою is. Ось як зробити isз asключовим словом. Bool b = obj is Student; еквівалентно: Bool b = (obj as Student) != null; Більше про це тут
Алекс Телон

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
}

Іл-код (для вищевказаного C #-коду є додане зображення):

Іл-код вище C # коду Код IL для isвикористання ключових слів містить інструкції ІЛ isinstaі castclass.
Але код IL для asвикористання ключових слів є лише isinsta.

У вищезгаданому використанні два типи даних будуть використовуватись там, де isвикористовується ключове слово, і лише один типкаст, де asвикористовується ключове слово.

Примітка: Якщо ви використовуєте isключове слово для перевірки певного стану і не маєте інтересу до результату typecast, тоді буде лише один typecast, тобто

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

isа asключові слова будуть використовуватися залежно від необхідності.


6

Ключове слово is перевіряє, чи є значення на його лівій стороні екземпляром типу праворуч. Наприклад:

if(obj is string)
{
     ...
}

Зауважте, що в цьому випадку вам доведеться використовувати додатковий явний формат, щоб отримати obj як рядок.

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

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

+1 для "Ключове слово як використовується для виведення типів, що змінюються."
користувач2330678

3

Я б сказав: читайте MSDN в Інтернеті, але ось це:

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

Оператор as ніколи не кине виняток.


Оператор "as" також не викине виключення, він просто поверне null.
Пінте Дані

Виправлено помилку друку щодо "є" і "як"
Патрік Петерс

2

Чи оператор, акторський склад, повертає true, якщо це вдасться. Якщо повернення не вдалося, він поверне помилкове значення. З його допомогою ви не можете захопити перетворену змінну. Цей оператор є найбільш корисним при перевірці типів у if-операторах та виразах. Це приведення ідеально підходить лише в тому випадку, коли отримана змінна не буде потрібна для подальшого використання

Як це акторський склад. З його допомогою ми отримуємо продуктивність і уникаємо винятків, коли акторський склад недійсний. Null повертається, коли акторський склад неможливий. Для референтних типів рекомендується використовувати асид. Це і швидко, і безпечно. Ми можемо протестувати отриману змінну проти нуля, а потім використати її. Це виключає зайві ролі


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

2

ОПЕРАТОР Оператор в C # використовується для перевірки типу об'єкта, і він повертає значення bool: true, якщо об'єкт одного типу, а false - якщо ні. або також Оператор "є" використовується для перевірки, чи сумісний тип об'єкта з заданим типом чи ні. Для об’єктів з нульовим значенням він повертає помилкові, наприклад

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

як ОПЕРАТОР

Оператор виконує ту саму роботу, що і оператор, але різниця полягає замість bool, він повертає об'єкт, якщо вони сумісні з цим типом, інакше він повертає null. В інших словах, оператор 'as' використовується для здійснення перетворень між сумісними типи.

напр

Type obj = Object as Type;

Переваги "над" є у випадку, якщо оператор, щоб набрати ролі, нам потрібно зробити два етапи:

Check the Type using is
If its true then Type cast

Насправді це впливає на продуктивність, оскільки кожен раз, коли CLR буде проходити через ієрархію спадкування, перевіряючи кожен базовий тип на вказаний тип.

Щоб уникнути цього, використовуйте як, це буде робити це за один крок. Тільки для перевірки типу ми повинні використовувати оператор.


Відповіді на 8-річні запитання, на які вже є достатньо достовірних відповідей, не є найкращим способом використання переповнення стека.
Клаус Йоргенсен

1

Оператор As схожий на атрибут, але повертає null замість винятку, якщо він не працює.

І оператор Is використовується для перевірки сумісності одного об'єкта з певним типом. Зазвичай він використовується в операторах If.


1

is: Оператор is використовується для перевірки, чи сумісний тип об’єкта з заданим типом

as: Оператор "Ас" використовується для здійснення перетворень між сумісними типами.

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

2
Ваша відповідь правильна, але ваш зразок коду є анти-зразком. Робити isтоді asце дорого : він розпаковується двічі. Для довідкових типів слід просто зробити as, а потім перевірити наявність нуля, щоб перевірити, чи працює він.
Стівен Судіт

1

Подивіться нижче на відео YouTube, яке пояснює різницю більш показовим та наочним способом: -

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

Нижче йде довга відповідь з поясненням коду.

Ключове слово "IS" корисно перевірити, чи об'єкти сумісні з типом. Наприклад, у наведеному нижче коді ми перевіряємо, чи об’єкт “ocust” є класом “Клієнт”.

object ocust = new Customer();

if (ocust is Customer)
{ 

Ключове слово "AS" допомагає здійснити перетворення одного типу в інший. Наприклад, у наведеному нижче коді ми перетворюємо об’єкт у тип рядкових даних. Якщо ключове слово "AS" не в змозі ввести команду cast, воно повертає NULL.

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

1
MyClass myObject = (MyClass) obj;

проти

MyClass myObject = obj as MyClass;

Другий поверне null, якщо obj не MyClass, а не кине виняток з класу.

це поверне лише істинне чи хибне


1

І IS, і AS використовуються для лиття безпечного типу

IS Ключове слово -> перевіряє, чи відповідає тип заданого об'єкта новому типу об'єкта. Це ніколи не кидає виняток. Це булевий тип. Повертається істинно або помилково

`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 також перевіряє, чи відповідає тип заданого об'єкта новому типу об'єкта. Це ключове слово перевірить, чи сумісний тип даного об'єкта з новим типом об’єкта. Якщо він не сумісний з новим, він поверне NULL.

IS Оператор:

Цей Оператор перевіряє, чи сумісний тип об'єкта з новим об'єктом. Якщо він сумісний, він повертає істинне інакше хибне.


Ви не думаєте, що це трохи пізно, як 4 роки?
Soner Gönül

О, так ... Вибачте ... Я новачок у stackoverflow, щоб трохи вийшов ... Не помітив опубліковану дату ...
Tukaram

Вклад - внесок! Дякуємо, що вказали на ключові слова "Безпечний набір даних"! :-)
Musa Al-hassy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.