C#のis
キーワードとas
キーワードの違いを教えてください
is
operator は、オブジェクトを特定の型にキャストできるかどうかを確認します。
例:
if (someObject is StringBuilder) ...
as
operator は、オブジェクトを特定のタイプにキャストしようとし、失敗した場合はnullを返します。
例:
StringBuilder b = someObject as StringBuilder;
if (b != null) ...
関連するもの:
キャスト演算子 は、オブジェクトを特定の型にキャストしようとし、失敗した場合は例外をスローします。
例:
StringBuilder b = (StringBuilder)someObject.
はとAsの違いはそれです。
IS-Is演算子は、指定されたタイプとオブジェクトの互換性を確認するために使用され、結果をブール値(TrueまたはFalse)として返します。
AS-As演算子は、オブジェクトを特定のタイプまたはクラスにキャストするために使用されます。
例.
Student s = obj as Student;
以下と同等です:
Student s = obj is Student ? (Student)obj : (Student)null;
Isキーワードは、左側の値が右側の型のインスタンスであるかどうかをチェックします。例えば:
if(obj is string)
{
...
}
この場合、追加の明示的なキャストを使用して、objを文字列として取得する必要があることに注意してください。
Asキーワードは、null許容型をキャストするために使用されます。指定された値が指定されたタイプのインスタンスではない場合、nullが返されます。例えば:
string str = obj as string;
if(str != null)
{
...
}
「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#コードのILコードは添付画像にあります ここに画像の説明を入力してください
Isキーワード使用法のILコードには、IL命令isinstaとcastclassの両方が含まれています。ただし、asキーワード使用のILコードにはisinstaしかありません。
上記の使用法では、isキーワードが使用される場所で2回型キャストが発生し、asキーワードが使用される場所で1回だけキャストされます。
注:「is」キーワードを使用して何らかの条件をチェックしている場合、型カーストの結果には関心がなく、ここでも型カーストが発生するのは一度だけです。つまり.
if (baseclassInstance is DerivedClass)
{
// do something based on the condition check.
}
「is」および「as」キーワードは、必要に応じて使用されます。
私は言うでしょう:MSDNオンラインを読むが、ここにあります:
Is演算子は、オブジェクトが特定のタイプと互換性があるかどうかをチェックし、評価の結果はブール値trueまたはfalseです。
As演算子は例外をスローしません。
演算子であるキャストは、成功するとtrueを返します。キャストが失敗するとfalseを返します。これを使用すると、変換された変数をキャプチャできません。この演算子は、ifステートメントおよび式の型をチェックするときに最も役立ちます。
キャストとして。これにより、パフォーマンスが向上し、キャストが無効な場合の例外が回避されます。キャストが不可能な場合は、NULLが返されます。参照タイプについては、as-castをお勧めします。高速で安全です。結果の変数をnullに対してテストしてから使用できます。これにより、余分なキャストが排除されます
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 overの利点 is演算子の場合、キャストを入力するには、2つのステップを実行する必要があります。
Check the Type using is
If it’s true then Type cast
実際には、CLRが継承階層を通過するたびに、指定されたタイプに対して各ベースタイプをチェックするため、パフォーマンスに影響します。
これを回避するには、asを使用します。1ステップで実行されます。 is演算子を使用するのは、型を確認するためだけです。
以下の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;
MyClass myObject = (MyClass) obj;
対
MyClass myObject = obj as MyClass;
ObjがMyClassでない場合、2番目はクラスキャスト例外をスローするのではなく、nullを返します。
isはtrueまたはfalseのみを返します
As演算子はキャストに似ていますが、失敗すると例外ではなくnullを返します。
Is演算子は、1つのオブジェクトが特定のタイプと互換性があるかどうかを確認するために使用されます。通常、Ifステートメントで使用されます。
両方の演算子は、安全な型キャストに使用されます。
AS演算子:
ASオペレーターは、指定されたオブジェクトのタイプが新しいオブジェクトタイプと互換性があるかどうかもチェックします。このキーワードは、指定されたオブジェクトのタイプが新しいオブジェクトタイプと互換性があるかどうかをチェックします。新しいものと互換性がない場合は、NULLを返します。
IS演算子:
この演算子は、オブジェクトのタイプが新しいオブジェクトと互換性があるかどうかを確認します。互換性がある場合はtrueを返し、そうでない場合はfalseを返します。
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`