Share via


C++ 経験者が C# で開発する場合

更新 : 2007 年 11 月

次の表には、C# とネイティブ C++ の重要な比較が記載されています。ここでは /clr を使用しません。C++ のプログラマならば、この表を見ると 2 つの言語間の最も重要な相違点がすぐにわかります。

yyaad03b.alert_note(ja-jp,VS.90).gifメモ :

C++ と C# のプロジェクトは、異なるプロジェクト モデルが基になっています。C++ プロジェクトと C# プロジェクトの相違の詳細については、「プロジェクトにおける項目の管理」および「ソリューション エクスプローラの使用」を参照してください。

機能

参照トピック

継承 : C++ ではクラスと構造体はほとんど同じですが、C# の場合はまったく異なります。C# のクラスは任意の数のインターフェイスを実装できますが、1 つの基本クラスからしか継承できません。さらに、C# の構造体では、継承と明示的な既定コンストラクタ (既定で 1 つ提供されます) がサポートされません。

class

interface

struct (C# リファレンス)

配列 : C++ の配列は単にポインタです。C# の配列は、メソッドとプロパティを含むオブジェクトです。たとえば、配列のサイズは、Length プロパティ経由で問い合わせることができます。また、C# の配列ではインデクサが採用され、配列のアクセスに使用する各インデックスを検証できます。C# の配列を宣言する構文は、C++ の場合と異なります。(変数ではなく) C# の配列型に続いて、トークン "[]" が表示されます。

配列 (C# プログラミング ガイド)

インデクサ (C# プログラミング ガイド)

ブール型 : C++ では、bool 型は実質的に整数です。C# では、bool 型とその他の型は変換できません。

bool

long 型 : C# では long 型は 64 ビットですが、C++ では 32 ビットです。

long

パラメータを渡す方法 : C++ の場合、明示的にポインタまたは参照で渡される場合を除き、すべての変数は値によって渡されます。C# の場合、クラスは参照によって渡されます。構造体は、ref または out のパラメータ修飾子が指定された参照によって明示的に渡される場合を除き、値によって渡されます。

struct

class

ref (C# リファレンス)

out (C# リファレンス)

switch ステートメント : C++ の switch ステートメントとは異なり、C# は、ある case ラベルから下にある case ラベルへの移動をサポートしていません。

switch

デリゲート : C# のデリゲートは、C++ の関数ポインタとほぼ同じですが、タイプ セーフであり、安全です。

delegate

基本クラスのメソッド : C# では、派生クラスからオーバーライドされた基本クラスのメンバを呼び出す、base キーワードをサポートしています。また、C# では、仮想メソッドまたは抽象メソッドのオーバーライドは明示的です。override キーワードを使用します。

base

override」の例も参照してください。

メソッドの隠ぺい : C++ では、継承によってメソッドが暗黙的に "隠ぺい" されます。C# では、new 修飾子を使用して、継承メンバを明示的に隠ぺいする必要があります。

new

条件付きコンパイルには、プリプロセッサ ディレクティブを使用します。C# ではヘッダー ファイルを使用しません。

C# プリプロセッサ ディレクティブ

例外処理 : C# では、例外がスローされたかどうかにかかわらず実行するコードに、finally キーワードを指定します。

try-finally

try-catch-finally

C# の演算子 : C# では、is や typeof などの演算子のサポートが追加されています。また、一部の論理演算子については異なる機能が導入されています。

& 演算子

| 演算子 (C# リファレンス)

^ 演算子

is

typeof

typedef キーワード : C++ では、既に宣言されている型に対して、より短い名前や便利な名前を作成する場合に typedef を使用します。C# では、using ディレクティブがこの機能を提供します。

using ディレクティブ (C# リファレンス)

extern キーワード : C++ では、型をインポートするときに extern が使用されます。C# で extern を使用するのは、同じアセンブリの異なるバージョンを使用するために、エイリアスを作成するときです。

extern

static キーワード : C++ では、クラス レベルの要素を宣言するときと、モジュール独自の型を宣言するときに、static キーワードを使用できます。C# では、クラス レベルの要素を宣言するときにのみ、static を使用できます。

static

C# の Main メソッドの宣言方法は、C++ の main 関数の場合と異なります。C# では大文字で記載され、常に static です。また、コマンド ライン引数を処理する場合のサポートは、C# の方が強力です。

Main() とコマンド ライン引数 (C# プログラミング ガイド)

C# でもポインタを使用できますが、使用できるのは unsafe モードの場合のみです。

unsafe

C# では、演算子をオーバーロードする方法が異なります。

C# の演算子

文字列 : C++ の文字列は、単に一連の文字です。C# の文字列は、強力な検索メソッドをサポートするオブジェクトです。

string

String

foreach キーワードを使用すると、配列およびコレクションの反復処理を実行できます。

foreach、in

グローバル : C# では、グローバル メソッドとグローバル変数はサポートされません。メソッドと変数は、class または struct に含める必要があります。

C# プログラムの一般的な構造

#define プリプロセス ディレクティブ : C++ では、#define ディレクティブは通常、定数値の宣言に使用されます。C# では、#define ディレクティブをこの目的で使用することはできません。C# の場合、定数は列挙型 (整数値のみ) またはクラスや構造体の静的メンバとして定義するのが最も良い方法です。そのような定数がいくつかある場合は、それを保持するための "Constants" クラスを個別に作成することを検討してください。

static (C# リファレンス)

const (C# リファレンス)

enum (C# リファレンス)

型のインポート : C++ では、複数のモジュールに共通した型は、ヘッダー ファイルに配置されます。C# では、この情報はメタデータ経由で使用できます。

using

メタデータの概要

C# のローカル変数は、使用する前に初期化する必要があります。

メソッド (C# プログラミング ガイド)

メモリ管理 : C++ は、ガベージ コレクションが行われる言語ではありません。明示的に解放されないメモリは、プロセスが終了するまで割り当てられたままです。C# は、ガベージ コレクションが行われる言語です。

ガベージ コレクション

デストラクタ : C# は、アンマネージ リソースを確定的に解放する場合の構文が異なります。

デストラクタ

using ステートメント (C# リファレンス)

コンストラクタ : C++ と同様に、C# でクラス コンストラクタを指定しない場合は、既定のコンストラクタが自動的に生成されます。既定のコンストラクタは、すべてのフィールドを既定値に初期化します。

インスタンス コンストラクタ

既定値の一覧表

C# では、ビット フィールドはサポートされていません。

C++ Bit Fields

C# の入出力サービスおよび書式指定は、.NET Framework のランタイム ライブラリに依存します。

C# 言語ツアー

数値結果の書式指定の一覧表

C# では、メソッドのパラメータに既定値を設定できません。同様の機能が必要な場合は、メソッドのオーバーロードを使用します。

コンパイラ エラー CS0241

C# では、ジェネリック型とジェネリック メソッドで、型のパラメータ化が規定されます。その方法はある程度 C++ のテンプレートに似ています。ただし、大きな違いがあります。たとえば、C# ジェネリック型では情報は実行時に保存されます。

C# のジェネリック

as キーワードは、標準のキャストに似ていますが、変換が失敗した場合に例外がスローされるのではなく、戻り値が null になります。これは、C++ で static_cast を使用する場合と似ています。dynamic_cast とは異なり、実行時のチェックが実行されないため、エラー時に例外がスローされません。

as (C# リファレンス)

C# と他のプログラミング言語とで異なるキーワードの比較の詳細については、「各言語の比較」を参照してください。C# アプリケーションの一般的な構造については、「C# プログラムの一般構造 (C# プログラミング ガイド)」を参照してください。

参照

概念

C# プログラミング ガイド

プロジェクトにおける項目の管理

ソリューション エクスプローラの使用