フッターコンテンツにスキップ
.NETヘルプ

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

C#でのプログラミングは、さまざまなデータ型を扱うことが多くあります。 時々、オブジェクトが特定の型であるかどうかを確認したり、その型に変換を試みる必要があります。 as演算子キーワードが便利です。 それに関連するis演算子は、型のテストや変換に役立ちます。 このチュートリアルでは、この演算子の複雑さとその使用例を探ります。

as演算子を理解する

as演算子の基本

C#のas演算子キーワードは、互換性のある参照型またはnullable型間の特定の変換を行うために使用される二項演算子です。次のコードは、簡単なデモンストレーションを提供します。

// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
' Declare an object that holds a string
Dim myObj As Object = "Hello, World!"

' Use the 'as' operator to attempt to convert 'myObj' to a string
Dim myStr As String = TryCast(myObj, String)

' myStr will hold the string value "Hello, World!" if the conversion is successful;
' otherwise, it will be null.
$vbLabelText   $csharpLabel

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

明示的キャストとの違いは何ですか?

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

object someValue = 12345;
string castResult;

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

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

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

// 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
Dim castResult As String

' Using explicit cast
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing ' The result is set to null if an exception is caught.
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";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

' Check if testObject is of type string
If TypeOf testObject Is String Then
	' If true, convert testObject to string using 'as'
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result) ' Outputs: This is a string
Else
	Console.WriteLine("Not a string")
End If
$vbLabelText   $csharpLabel

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

掘り下げて:特別なケースと考慮事項

Nullable値型変換

特殊なケースの1つは、nullable値型でのas演算子の利用価値です。値型(intdoubleなど)はnull値を割り当てることができません。 しかし、それらをnullableにすることで、nullを割り当てることができます。 as演算子は、nullable値型への変換を試みるために使用できます。

// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
' Declare a nullable integer
Dim nullableInt? As Integer = 10

' Box the nullable int
Dim objInt As Object = nullableInt

' Attempt to unbox using 'as' to a nullable int type
Dim resultInt? As Integer = CType(objInt, Integer?)
$vbLabelText   $csharpLabel

参照変換とユーザー定義変換

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

次のコードのユーザー定義変換を考えてください。

class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
Friend Class Sample
	' Define an implicit conversion from Sample to string
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()

' Use 'as' to convert 'sampleObject' to string
Private conversionResult As String = TryCast(sampleObject, String)

' conversionResult will hold "Converted to String"
$vbLabelText   $csharpLabel

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

いつasが適用されないか

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

as演算子を使用する高度なシナリオ

asによるボックス化とボックス解除

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

ボックス化変換の次のコードを考えてください。

int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
Dim intValue As Integer = 42

' Box the value type to an object
Dim boxedValue As Object = intValue
$vbLabelText   $csharpLabel

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

ボックス解除はボックス化の逆プロセスであり、つまりobjectから値型を抽出します。 as演算子は、特にobjectが予想される値型を保持しているかどうか不明な場合に、安全にボックス解除するために使用できます。 ボックス解除が失敗した場合、式の結果はnullになります。

ボックス解除変換の次の例を考えてください。

object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
Dim obj As Object = 42

' Attempt to unbox using 'as' to a nullable int type
Dim result? As Integer = CType(obj, Integer?)
$vbLabelText   $csharpLabel

配列を使用する

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

次のコードを検討してください。

object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
Dim arrayObject() As Object = New String() { "one", "two", "three" }

' Attempt to cast to a string array using 'as'
Dim stringArray() As String = TryCast(arrayObject, String())

' stringArray will hold the array of strings if successful
$vbLabelText   $csharpLabel

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

LINQとasを組み合わせる

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

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

var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}

' Use LINQ to select only strings from mixedList
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()

' stringValues will contain "Hello" and "World"
$vbLabelText   $csharpLabel

Iron Suiteとの統合

C#開発者向けのIron Suiteソリューションは、PDF操作、Excel処理、光学文字認識(OCR)、バーコード生成と読み取りなどの機能をシームレスに統合できる、C#開発者を強力にサポートするツール群です。 これらのツールは、asおよびis演算子についての以前の議論と同様に、開発者が強力なアプリケーションを構築する際に効率性を高める上で重要です。

IronPDF

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

IronPDFは、開発者がC#アプリケーション内でPDFファイルを生成、操作、および読み取ることを可能にします。 このトピックに関連し、参照型にデータが保持されていて、このデータをレポートまたは文書に変換したいと仮定します。 IronPDFは、アプリケーションの出力をタイプ変換に似た方法で整形式のPDF文書に翻訳することができます。

IronXL

C# AS(開発者向けの動作方法)図2 - IronXL for .NET: The C# Excel Library

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

IronOCR

C# AS(開発者向けの動作方法)図3 - IronOCR for .NET: The C# OCR Library

Optical Character Recognition with IronOCRは、画像からテキストを読み取り解釈することを可能にする光学文字認識ツールです。 このチュートリアルへの橋渡しとして、これは、object(この場合、画像)を高度な認識機能を使用して特定のタイプ(stringまたはテキストデータ)に変換するのに似ています。

IronBarcode

C# AS(開発者向けの動作方法)図4 - IronBarcode for .NET: The C# Barcode Library

多くの商業アプリケーションにおいて、バーコードの取り扱いは不可欠です。 IronBarcode Tool for Barcode Processingは、C#アプリケーションでバーコードの生成、読み取り、およびデコードを支援する開発者用ツールです。 型変換に関する議論に関連して、IronBarcodeは視覚的なバーコードデータ(objectの一形態)を、文字列や製品詳細など、より具体的な使用可能なデータタイプに変換するツールとして考えることができます。

結論

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

Iron Suite Offeringsの各製品は、特に型変換と型チェックに関連した議論に結びつけられた場合の、C#が提供する柔軟性と力の証です。 これらのツールは、asおよびis演算子のように、開発者に効率よくデータを変換および処理する能力を提供します。

これらのツールのいずれかをプロジェクトに統合することを検討している場合、各製品ライセンスは$799から開始され、すべての製品でIron Suite Toolsの無料トライアルを提供しています。 総合的なソリューションを探している方には、Iron Suiteは魅力的な提案を提供します:ちょうど2つの製品の価格でIron Suiteライセンスを取得できます。

よくある質問

C#開発における‘as’演算子の役割は何ですか?

C#の‘as’演算子は、互換性のある参照型またはヌル許容型間で安全な型変換を実行し、変換が失敗した場合には例外を回避するためにnullを返します。

C#ではどのように型変換を安全に処理できますか?

‘as’演算子を使用することで安全な型変換を行うことができ、変換が失敗したときに例外を投げる代わりにnullを返すため、明示的キャストよりも安全です。

なぜ‘as’演算子は特定の状況で明示的キャストよりも好まれるのですか?

変換が失敗した場合に例外を避けたいときに‘as’演算子が好まれます。これは、明示的キャストとは異なり例外を投げる代わりにnullを返すためです。

C#において、‘as’演算子はヌル許容型とどのように機能しますか?

‘as’演算子はヌル許容型と一緒に使用でき、指定されたヌル許容型にオブジェクトを変換できない場合、nullを返す安全な変換を可能にします。

C#でIronPDFを使用して文書をどのように変換できますか?

IronPDFはC#開発者がHTMLをPDFに変換し、PDFの内容を操作し、プログラムでPDFファイルを生成することを可能にし、アプリケーションでの文書処理能力を強化します。

C#開発者にとってIron Suiteを使用する利点は何ですか?

Iron SuiteはIronPDF、IronXL、IronOCR、IronBarcodeのようなツールを提供し、開発者が様々なフォーマットでのデータ変換や操作を効率的に行うことを可能にします。

C#でコレクションから特定の型をどのようにフィルタリングできますか?

コレクションから特定の型をフィルタリングするためにLINQクエリと組み合わせて‘as’演算子を使用し、混在するオブジェクトリストからのみ望む型を選択できます。

C#で‘is’演算子と‘as’演算子を組み合わせる一般的な使用例は何ですか?

オブジェクトの型を'is'で最初に確認し、その後‘as’による安全な変換を行うことで型の安全性を確保し、例外を回避します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。