.NET ヘルプ

C# の AS(開発者向けの仕組み)

C#でのプログラミングは、さまざまな種類のデータを扱うことが多い。 時々、object が特定の型であるかどうかを確認したり、その型に変換しようと試みる必要があります。 そこで、as 演算子キーワードが役に立ちます。 その近縁であるis operatorと共に、型のテストと変換を助けます。 このチュートリアルでは、この演算子の詳細とその使用例を探求します。

as演算子を理解する

as 演算子の基本

C# の as 演算子は、互換性のある参照型やヌル許容型の間で特定の変換を行うために使用される二項演算子です。以下のコードは、簡単なデモを提供します:

object myObj = "Hello, World!";
string myStr = myObj as string;
object myObj = "Hello, World!";
string myStr = myObj as string;
Dim myObj As Object = "Hello, World!"
Dim myStr As String = TryCast(myObj, String)
$vbLabelText   $csharpLabel

上記のコードでは、myObjobject 型のオブジェクトです (C# のすべての型の基底型)。 コンパイル時に、その基礎タイプが不確定です。as演算子は、myObjstringとして扱おうとするために使用されます。 成功すると、myStr は文字列の値を保持します。 それ以外の場合、null valueが保持されます。

明示的なキャストとはどのように異なるのですか?

「as 演算子」と明示的なキャストは似たような目的を果たしますが、重要な違いがあります。 明示的なキャストが失敗すると、例外がスローされます。 一方で、as 演算子によるある型から別の型への変換が失敗した場合、演算子は例外を発生させる代わりにnull 値を返します。 次のコード例でこれを理解しましょう:

object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
object someValue = 12345;

// Using explicit cast
string castResult;
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null;
}

// Using the as operator
string asResult = someValue as string; // No exception, but asResult will be null since the cast fails.
Dim someValue As Object = 12345

' Using explicit cast
Dim castResult As String
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing
End Try

' Using the as operator
Dim asResult As String = TryCast(someValue, String) ' No exception, but asResult will be null since the cast fails.
$vbLabelText   $csharpLabel

明らかなように、as演算子を使用することは、潜在的な実行時エラーを回避できるため、より安全であることが多いです。

is演算子との接続

しばしば、as 演算子は型変換を試みる前に型テストを行うためにis 演算子と一緒に使用されます。 is 演算子は、提供されたオブジェクトが指定された型であるかどうかをチェックし、そうである場合はtrueを返し、そうでない場合はfalseを返します。

以下のコード例はこれを示しています:

object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

if(testObject is string) {
    string result = testObject as string;
    Console.WriteLine(result);
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

If TypeOf testObject Is String Then
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result)
Else
	Console.WriteLine("Not a string")
End If
$vbLabelText   $csharpLabel

C#の後のバージョンでパターンマッチングが導入されたことで、is演算子は型テストが成功した場合に特定のアクションを実行することもできます。 これにより、as 演算子を使用する必要性が減少することがよくあります。

特別なケースと考慮事項を詳しく掘り下げる

ヌル許容型の変換

特定のケースの1つで、as演算子が非常に価値あるのは、nullable値型の場合です。値型(例えばintdoubleなど)はnull値を割り当てることができません。 ただし、これらを nullable にすることで、null を割り当てることができます。 as 演算子は、null 許容値型への変換を試みるために使用できます。

int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
int? nullableInt = 10;
object objInt = nullableInt;
int? resultInt = objInt as int?;
Dim nullableInt? As Integer = 10
Dim objInt As Object = nullableInt
Dim resultInt? As Integer = CType(objInt, Integer?)
$vbLabelText   $csharpLabel

参照変換およびユーザー定義変換

as 演算子は、関連する参照型間の参照変換とユーザー定義変換の両方をサポートします。 ユーザー定義の型変換とは、クラス内で特殊な型変換メソッドを使用して定義される型変換のことです。

ユーザー定義の変換の次のコードを考慮してください:

class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
class Sample {
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();
string conversionResult = sampleObject as string;
Friend Class Sample
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()
Private conversionResult As String = TryCast(sampleObject, String)
$vbLabelText   $csharpLabel

ここでは、ユーザー定義の変換メソッドにより、Sample型のオブジェクトをstringとして扱うことができます。

適用されない場合

as 演算子は、値型(nullable 値型を扱う場合を除く)や、明示的なメソッドを伴うユーザー定義の変換には使用できないことを覚えておいてください。

as 演算子を使用した高度なシナリオ

asを用いたボクシングとアンボクシング

ボクシングとは、値型インスタンスをオブジェクト参照に変換するプロセスです。 これは、すべての値型が暗黙的にobjectから継承するため可能です。 値型をボックス化する際、object 内にラップします。

ボクシング変換のための以下のコードを検討してください:

int intValue = 42;
object boxedValue = intValue;
int intValue = 42;
object boxedValue = intValue;
Dim intValue As Integer = 42
Dim boxedValue As Object = intValue
$vbLabelText   $csharpLabel

ここでは、intValueobjectにボックス化されます。

ボクシングとは逆のプロセスであるアンボクシングは、objectから値型を抽出することです。 as 演算子は、特に object が期待する値の型を保持しているかどうか確信がないときに、安全に値をボックス化解除するために使用できます。 ボックス解除が失敗した場合、結果の式は null になります。

次の例を考慮してください:ボックス化解除の変換

object obj = 42;
int? result = obj as int?;
object obj = 42;
int? result = obj as int?;
Dim obj As Object = 42
Dim result? As Integer = CType(obj, Integer?)
$vbLabelText   $csharpLabel

配列の操作

配列はC#の参照型です。 時には、object が特定のタイプの配列であるかどうかを判別し、それを操作する必要があるかもしれません。 as 演算子もここで役立ちます。

次のコードを考慮してください:

object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
object[] arrayObject = new string[] { "one", "two", "three" };
string[] stringArray = arrayObject as string[];
Dim arrayObject() As Object = New String() { "one", "two", "three" }
Dim stringArray() As String = TryCast(arrayObject, String())
$vbLabelText   $csharpLabel

上記のコードでは、arrayObjectはオブジェクトの配列ですが、実際には文字列を保持しています。 as 演算子を使用すると、それを文字列の配列として安全に試すことができます。

LINQとの組み合わせas

言語統合クエリ (LINQ - Microsoft Documentation) は、C#の強力な機能であり、SQLのような方法でコレクションをクエリすることができます。 時々、コレクション内で混合タイプのオブジェクトを取得し、特定のタイプをフィルタリングしたいことがあります。この場合、as 演算子が非常に便利です。

例えば、文字列と整数の両方を含むオブジェクトのリストを考えてみましょう。 文字列のみを取得したい場合は、LINQと組み合わせてas演算子を使用できます。

var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
var mixedList = new List<object> { "Hello", 42, "World", 100 };
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()
$vbLabelText   $csharpLabel

Iron Suiteの統合

C#開発者向けIron Suiteソリューションは、C#開発者がPDF操作、Excel処理、Optical Character Recognition (OCR)、およびバーコード生成と読み取りなどの機能をシームレスに統合することを可能にする高品質なツールのスイートです。 これらのツールは、asおよびis演算子に関する以前の議論と同様に、堅牢なアプリケーションを構築する際の開発者の効率を高めるために非常に重要です。

IronPDF

C# AS (開発者向けの動作方法) 図1 - IronPDF for .NET: C# PDFライブラリ

IronPDFはC#アプリケーション内でPDFファイルの生成、操作、読み込みを可能にします。 私たちのトピックに関連して、データを保持する参照型があり、そのデータをレポートやドキュメントに変換したいと考えているとします。 IronPDF は、アプリケーションの出力を型変換に似た方法で、適切にフォーマットされたPDFドキュメントに変換することができます。

IronXL

C# AS (開発者にとっての仕組み) 図2 - IronXL for .NET: C# Excelライブラリ

多くのソフトウェアアプリケーションにおいて、Excelファイルを扱うことは頻繁に求められる要件です。 IronXL for Excel Operationsは、開発者にOffice Interopに依存することなく、Excelスプレッドシートを読み取り、編集し、作成する機能を提供します。型変換の議論において、IronXLをC#のデータ構造やデータベースのエントリをExcel形式にシームレスに変換するツールと考えてください。

IronOCR

C# AS (開発者向けの動作) 図3 - IronOCR for .NET: C# OCRライブラリ

IronOCRによる光学文字認識 は、開発者が画像からテキストを読み取り解釈することを可能にする光学文字認識ツールです。 これを私たちのチュートリアルに橋渡しすると、高度な認識機能を使用してobject(この場合は画像)をより具体的な型(stringまたはテキストデータ)に変換することに似ています。

IronBarcode

C# AS (開発者にとっての動作方法) 図4 - IronBarcode for .NET: C# バーコード ライブラリ

多くの商用アプリケーションでは、バーコードの取り扱いが不可欠です。 バーコード処理用IronBarcodeツールは、開発者がC#アプリケーションでバーコードの生成、読み取り、およびデコードを行う補助をします。 私たちの型変換に関する議論に関連して、IronBarcode は視覚的なバーコードデータ(object の一種)を文字列や商品詳細などのより具体的で使用可能なデータ型に変換するツールと見なすことができます。

結論

C# AS (開発者向けの動作方法) 図5 - Iron Suite for .NET

Iron Suiteの提供製品は、それぞれが型変換と型チェックに関連するC#の柔軟性と強力さを証明しています。 これらのツールは、asis 演算子のように、開発者にデータを効率的に変換し処理する能力を提供します。

これらのツールをプロジェクトに統合することを検討している場合、各製品ライセンスは$749から始まることを知っておく価値があります。また、すべての製品がIron Suite Toolsの無料トライアルを提供しています。 総合的なソリューションをお求めの方には、Iron Suiteが魅力的なオファーを提供します:Iron Suiteライセンスをわずか2製品の価格で取得できます。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# フォーム (開発者にとっての動作方法)
次へ >
C# データ型 (開発者向けの動作説明)