isとasキーワードの違い


121

違いが何であるかを教えてくださいisasC#でのキーワード


7
現状のままですか、それとも現状のままですか?blogs.msdn.com/b/ericlippert/archive/2010/09/16/...
LukeH

3
:あなたは、このテーマに興味があるなら、あなたはおそらくも違いは「AS」と「キャスト」事業者との間にあるかを知りたいblogs.msdn.com/b/ericlippert/archive/2009/10/08/...
エリックリッペルト

7
回答を承認済みにしますか?それは同様の答えを探している他の人を助けるでしょう。
KMån

回答:


151

です

isオペレータチェックオブジェクトは、特定の型にキャストすることができる場合。

例:

if (someObject is StringBuilder) ...

なので

asオペレータの試みは、特定の型にオブジェクトをキャストし、それが失敗した場合はNULLを返します。

例:

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

関連もあります:

鋳造

キャスト演算子の特定の型にオブジェクトをキャストしようとする試み、それが失敗した場合exeptionをスローします。

例:

StringBuilder b = (StringBuilder)someObject.

4
これは正しくありません。isオブジェクトが特定の型にキャストできるかどうかはチェックしません。整数は長い罰金にキャストしますが10 is long、偽です。
マーティン・スミス

9
@MartinSmith:型変換とキャストを混同しています。整数はlongに変換できますが、longではないため、longにキャストできません。
Guffa

2
あなたは整数をlongにキャストできないと私に言っていますか?それ(long)some_integerは失敗しますか?それを実行することなしにそれが真実ではないことを私たち二人が知っていると確信しているので、あなたが何を意味するのか説明してください。
マーティンスミス

12
@MartinSmith:キャストとコンバージョンを混同しています。整数をlongにキャストするのではなく、整数をlongに変換します。それらは同じ構文を使用しますが、参照がキャストされ、値が変換されます。
Guffa

2
is:「こと音符である。オペレータは参考変換、ボクシング変換、およびアンボクシング変換を考慮し、ユーザ定義の変換などの他の変換は、考慮されていない」(msdn.microsoft.com/en-us/library/scekt9xw .aspx)。Aboutas: " as演算子は参照変換、null許容変換、ボクシング変換のみを実行することに注意してください。as 演算子は、ユーザー定義変換などの他の変換を実行できません。代わりにキャスト式を使用して実行する必要があります。 "(msdn .microsoft.com / en-us / library / cscsdfbt.aspx
user1234567

33

ISAsの違いはそれです。

IS -Is演算子は、オブジェクトと特定のタイプの互換性をチェックするために使用され、結果をブール(TrueまたはFalse)として返します。

AS -As演算子は、オブジェクトを特定のタイプまたはクラスにキャストするために使用されます。

Student s = obj as Student;

以下と同等です。

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

1
同等性は、2つのうちどちらがより原始的であるかを明確に示し、エレガントにそれらの関係の根底にあります!同等をありがとう!
Musa Al-hassy

1
@ MusaAl-hassy実際、これはどちらがより原始的であるかを示しません。is表すことができるasasして発現させることができますis。ここで作成する方法であるisasキーワード。 Bool b = obj is Student; :に相当し Bool b = (obj as Student) != null; 、この上の詳細ここに
アレックスTelon

8

isasキーワードの両方が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#コードは添付画像にあります):

上記のC#コードのILコードisキーワード使用法 のILコードには、isinstaとの両方のIL命令が含まれていますcastclass
ただし、asキーワードの使用に関するILコードにはしかありませんisinsta

上記の使用法でisは、キーワードが使用されている場合は2つのタイプキャストが発生し、キーワードが使用されている場合は1つのタイプキャストのみが発生しasます。

注:isキーワードを使用していくつかの条件をチェックしていて、型キャストの結果に関心がない場合、型キャストは1つしかありません。

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)
{
     ...
}

「asキーワードはnull許容型をキャストするために使用されます。」の+1
user2330678 14

3

私は言うでしょう:MSDNをオンラインで読んでください、しかしここにそれがあります:

is演算子は、オブジェクトが特定のタイプと互換性があるかどうかをチェックし、評価の結果はブール値(trueまたはfalse)になります。

as演算子は例外をスローしません。


"as"演算子は例外もスローせず、nullを返します。
Pinte Dani、2018

「is」と「as」に関する誤植を修正しました
Patrick Peters

2

Is演算子(キャスト)は、成功するとtrueを返します。キャストが失敗した場合はfalseを返します。これを使用すると、変換された変数をキャプチャできません。この演算子は、ifステートメントと式の型をチェックする場合に最も役立ちます。is-castは、結果の変数がさらに使用する必要がない場合にのみ理想的です。

キャストのままです。これにより、パフォーマンスが向上し、キャストが無効な場合の例外が回避されます。キャストが不可能な場合はnullが返されます。参照タイプについては、as-castをお勧めします。高速かつ安全です。結果の変数をnullに対してテストしてから使用できます。これは余分なキャストを排除します


2
  1. is演算子は、オブジェクトが指定されたタイプと互換性があるかどうかをチェックし、結果はtrueまたはfalseに基づいています。
  2. あるタイプを別のタイプにキャストするために使用され、変換が失敗すると例外が発生することを除いてnullになります。例を使用して理解を深めるためのリンクを参照してくださいhttps://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/

2

is OPERATOR C#のis演算子は、オブジェクトタイプをチェックするために使用され、ブール値を返します。オブジェクトが同じタイプの場合はtrue、そうでない場合はfalseです。または「is」演算子は、オブジェクトの実行時の型が特定の型と互換性があるかどうかを確認するために使用されます。nullオブジェクトの場合、falseを返します。

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

オペレーターとして

as演算子はis演算子と同じ働きをしますが、違いはboolではなく、オブジェクトがその型と互換性がある場合はオブジェクトを返し、それ以外の場合はnullを返します。言い換えると、互換性のあるタイプ。

例えば

Type obj = Object as Type;

asオーバーの利点 is演算子の場合、型キャストするには、2つのステップを実行する必要があります。

Check the Type using is
If its true then Type cast

実際には、CLRが継承階層を通過し、指定された型に対して各基本型をチェックするため、これはパフォーマンスに影響します。

これを回避するには、asを使用します。1つのステップで実行されます。タイプをチェックする場合にのみ、is演算子を使用する必要があります。


すでに有効な回答がたくさんある8年前の質問に回答することは、スタックオーバーフローを使用するための最良の方法ではありません。
ヨルゲンセンクラウス

1

As演算子はキャストに似ていますが、失敗すると例外ではなくnullを返します。

また、Is演算子は、1つのオブジェクトが特定の型と互換性があるかどうかを確認するために使用されます。これは通常、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をチェックして、それが機能するかどうかを確認する必要があります。
Steven Sudit、

1

より実証的で視覚的な方法の違いを説明する以下のyoutubeビデオをご覧ください:-

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

以下はコードの説明付きの長い回答です。

「IS」キーワードは、オブジェクトがタイプと互換性があるかどうかを確認するのに役立ちます。たとえば、次のコードでは、「ocust」オブジェクトが「Customer」クラスのタイプかどうかを確認しています。

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;

2番目は、objがMyClassではない場合、クラスキャスト例外をスローするのではなく、nullを返します。

真または偽のみを返す


1

ISとASの両方が安全な型キャストに使用されます

ISキーワード->指定されたオブジェクトのタイプが新しいオブジェクトタイプと互換性があるかどうかをチェックします。それは例外をスローしません。これはブール型です。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以外を返し、それ以外の場合は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を返します。

ISオペレーター:

このオペレーターは、オブジェクトのタイプが新しいオブジェクトと互換性があるかどうかをチェックします。互換性がある場合はtrue、それ以外の場合はfalseを返します。


4年とかちょっと遅すぎると思いませんか?
SonerGönül

ああ、はい...申し訳ありません...私はstackoverflowに慣れていないため、ほとんど終了していません...投稿された日付に気づきませんでした...
Tukaram

投稿は投稿です!「安全な型キャスト」というキーワードを指摘していただきありがとうございます。:-)
Musa Al-hassy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.