キーワード (C Sharp)
この項目では、プログラミング言語の1つであるC#におけるキーワード[1]に関して説明する。
この項目は、プログラムの細かい説明には立ち入らず、他の言語と比較できるような説明を目的としている。
C#のキーワードの特徴
[編集]C#にはいわゆる予約語としてのキーワードの他、 特定の文脈においてだけ意味を持つ文脈キーワードを持つ。
予約語としてのキーワード
[編集]以下の77語が、予約語としてのキーワードとして指定されている。[1] 予約語は初めのバージョンであるC# 1.0より追加されていない。(使用可能な文脈が増えたものは存在する)
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
event
explicit
extern
false
finally
fixed
float
for
foreach
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null
object
operator
out
override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short
sizeof
stackalloc
static
string
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
virtual
void
volatile
while
文脈キーワード
[編集]文脈キーワードは、特定の文脈以外では識別子として使用できる。 C#では文脈キーワードが積極的に利用されており、機能追加の際に度々追加されている。
以下に文脈キーワードが初めに導入されたバージョンを示す。
- C# 1.0
- 名前空間に関するもの
alias
global
- プロパティ、インデクサ、イベント
add
get
remove
set
value
- 名前空間に関するもの
- C# 2.0
- 総称型制約
where
- 部分型
partial
- 反復子ブロック
yield
- 総称型制約
- C# 3.0
- 暗黙型
var
- クエリ式 [2]
ascending
by
descending
equals
from
group
into
join
let
on
orderby
select
- 暗黙型
- C# 4.0
- 動的型
dynamic
- 動的型
- C# 5.0
- 非同期処理
async
await
- 非同期処理
- C# 6.0
- nameof演算子
nameof
- 例外フィルタ
when
- nameof演算子
- C# 7.0 [3]
- 値の破棄
_
- 値の破棄
- C# 8.0 [4]
- 総称型null非許容制約
notnull
- 総称型null非許容制約
- C# 9.0 [5]
- record型
record
- init専用アクセサ
init
with
- パターンマッチング拡張
and
or
not
- ネイティブ相互運用
nint
nuint
- 最上位レベルステートメント
args
- record型
- C# 11.0 [6]
- 必須メンバー
required
- 参照スコープ
scoped
- ファイルローカル型
file
- 必須メンバー
予約済み識別子
[編集]連続した2つのアンダースコア__
を含む識別子は、処理系によって予約されている。例えば__
で始まる拡張キーワードを提供する処理系があるかもしれない[7]。
キーワードを識別子として使用する
[編集]全てのキーワードは@int
のように@
で修飾することで識別子として扱うことができる。[1]
通常の識別子も@
で修飾することができ、修飾されていない状態の識別子と同等に扱われる。
型に関するキーワード
[編集]型名
[編集]byte, sbyte, ushort, short, uint, int, ulong, long
[編集]- 8,16,32,64bitの符号有/無 整数型
- CやC++と異なり、1語で1つの整数型を表す。
nint (文脈), nuint (文脈)
[編集]- ネイティブの符号有/無 整数型 (C# 9.0以降)
float, double
[編集]- 32,64bitの浮動小数点数型
decimal
[編集]- 十進浮動小数点型
bool
[編集]- ブーリアン型
char
[編集]- Unicode 16ビット文字型
object
[編集]- 全ての型の基底となる型
string
[編集]- Unicode 16ビット文字のシーケンスを表す文字列型
void
[編集]- 戻り値が無いことを表す
- unsafeコンテキスト内で
void*
の形式で汎用ポインタを表す
var (文脈)
[編集]- 初期化式から型推論を行う暗黙型
dynamic (文脈)
[編集]- バインドが実行時まで遅延される動的型
ユーザ定義型のキーワード
[編集]class, struct
[編集]- ユーザ定義のクラス、構造体を宣言する
C++では、クラスと構造体の違いは可視性の既定値が異なるのみであるのに対し、 C#では、構造体は値型で継承不可など、クラスとの差異が大きい。
record (文脈)
[編集]- ユーザ定義のレコード型を宣言する (C# 9.0以降)
- ユーザ定義のレコード構造体を宣言する (C# 10.0以降)
interface
[編集]- ユーザ定義のインターフェイスを宣言する
delegate
[編集]- ユーザ定義のデリゲート型を宣言する
- 匿名メソッド式を開始する
enum
[編集]- ユーザ定義の列挙型を宣言する
Javaでは、列挙型がクラスの延長であるのに対し、 C#では、整数型を型安全に扱うための機能である
値(リテラル)
[編集]null
[編集]- 参照型の参照先が存在しないことを表す
- Nullable型の保持する値が存在しないことを表す
true, false
[編集]- ブーリアン型の定数を表す
- true, false演算子をオーバーロードしたクラスは、条件式として利用できる
default
[編集]- 各型の初期値を表す
- 参照型ではnullとして扱われる
- 値型ではすべてのフィールドがゼロ初期化された状態として扱われる
名前空間
[編集]namespace
[編集]- 内包するコードが、どの名前空間に所属するかを宣言する
using
[編集]using 完全修飾名前空間名;
の形式で名前空間を指定することで、その名前空間の型を修飾せずに使用できるusing static 完全修飾型名;
の形式で完全修飾型名を指定することで、その型の静的メンバーを型名で修飾せずに使用できるusing エイリアス名 = 完全修飾[型/名前空間]名;
の形式で、名前空間または型のエイリアスを指定する
global (文脈)
[編集]global::完全修飾[型/名前空間]名
の形式で、ルート名前空間を指定する- ルート名前空間と現在の文脈での識別子が重複した場合に、ルート名前空間を明示できる。
global using 完全修飾名前空間名;
の形式で名前空間を指定することで、同一プロジェクト全体でその名前空間の型を修飾せずに使用できる (C# 10.0以降)
alias (文脈)
[編集]extern alias エイリアス名;
の形式で、参照するアセンブリに外部エイリアスを指定する- 参照する複数のアセンブリ間で名前空間が重複した場合に、いずれのアセンブリであるかを明示できる。
修飾子
[編集]可視性、アクセス可能性
[編集]private, internal, protected, public
[編集]- 型、メンバー宣言の際、先頭に指定することで可視性を制御する
private
,private protected
,internal
,protected
,protected internal
,public
の6種類の可視性がある
C#では、未指定時の既定値は選択肢の中で最小のものとなる。
対して、Javaでは未指定時はパッケージ内から可視となる。
file (文脈)
[編集]- 型宣言の際、先頭に指定することで可視性を同一ファイル内に制限する (C#11以降)
virtual
[編集]- 仮想メンバーであることを表す
- C#ではメンバーは既定で非仮想であるため、明示的に仮想 (virtual) を宣言する必要がある
abstract
[編集]- 抽象クラスであることを表す
- 抽象メンバーであることを表す。抽象クラス内でのみ利用できる。C++における純粋仮想関数に相当する。
override
[編集]- 基底クラスのメンバーをオーバーライドすることを表す
new
[編集]- 基底クラスのメンバーを隠蔽することを表す
sealed
[編集]- シールクラスであることを表す
- シールメンバーであることを表す。
override
と同時に宣言される
static
[編集]- 静的メンバーであることを表す。
- 静的クラスであることを表す。静的クラスは静的メンバーのみを含む
- 静的ローカル関数であることを表す。 (C#8.0以降)
const
[編集]- 定数 (定数フィールド、ローカル定数) を表す
readonly
[編集]- コンストラクタ内で初期化され、その後変更されないフィールドを表す
- readonly構造体であることを表す。readonly構造体のフィールドは全てreadonly指定されている必要がある
required (文脈)
[編集]- フィールドまたはプロパティが、必須項目であり初期化しなければならないことを表す (C#11以降)
ref
[編集]- ref構造体であることを表す。ref構造体は常にスタックに確保され、ボックス化されない
volatile
[編集]- フィールドが複数のスレッドによって変更されうることを表し、単一スレッド前提の最適化を防止する。
extern
[編集]- メソッドが外部アセンブリ (DLL) で実装されることを表す
partial (文脈)
[編集]- クラスが複数のファイルに分かれて実装されていることを表す
- メソッドが同一アセンブリ内の別の場所で実装されていることを表す
文脈の宣言
[編集]unsafe
[編集]- unsafe文脈を宣言する
async (文脈)
[編集]- メソッドまたはラムダ式を修飾し、非同期文脈を宣言する
using
[編集]- リソース解放を確実に行うブロックを宣言する
lock
[編集]- モニターロックを行うブロックを宣言する
文に関するキーワード
[編集]制御構造
[編集]if, else
[編集]for
[編集]foreach, in
[編集]while, do
[編集]switch, case, default
[編集]break
[編集]continue
[編集]goto
[編集]return
[編集]try, catch, finally, throw
[編集]when (文脈)
[編集]- switch文のcaseラベルでフィルター条件を指定する
- 例外処理のcatch句でフィルター条件を指定する
checked, unchecked
[編集]- 整数演算のオーバーフローの有無を制御する
fixed
[編集]- 変数の固定を行い、ガベージコレクターによる再配置を防止する
- 構造体内に固定サイズの配列を作成する
総称型に関するキーワード
[編集]in, out
[編集]- 型引数の共変性、反変性を表す
where (文脈)
[編集]- 型引数の制約条件を表す
new
[編集]- 型引数の制約条件の最後に
new()
を指定することで、引数無のコンストラクタが必要であることを指定する
unmanaged (文脈)
[編集]- 型引数の制約条件に指定することで、ポインタ化可能な型であることを条件指定する
notnull (文脈)
[編集]- 型引数の制約条件の先頭に指定することで、null非許容型であることを条件指定する
演算子
[編集]new
[編集]- コンストラクタを呼び出してインスタンスを生成する
as, is
[編集]- インスタンスの型を検査し、安全なキャストを行う
await (文脈)
[編集]- 非同期処理を待機する
await foreach
の組み合わせで、非同期ストリームを待機する (C#8.0以降)
nameof (文脈)
[編集]- 対象の変数、型、メンバーの単純名を取得する
typeof
[編集]- 対象の型の型オブジェクトを取得する
sizeof
[編集]- 対象の型のバイト単位のサイズを取得する
stackalloc
[編集]- スタックにメモリを割り当てる
- unsafe文脈内において、割り当てられたメモリをポインタ型の変数に代入可能
- 割り当てられたメモリを
Span<T>
型の変数に代入可能
with (文脈)
[編集]- 元のインスタンスの指定した箇所を書き換えた複製を作成する (C# 9.0以降)
and (文脈), or (文脈), not (文脈)
[編集]- パターンマッチングにおいて、パターンの論理積・論理和・論理否定を指定する (C# 9.0以降)
アクセスのためのキーワード
[編集]this
[編集]- 自インスタンスのメンバーにアクセスする
- 静的メソッドの第一引数の型を修飾することで、拡張メソッドを表す
base
[編集]- 基底クラスのメンバーにアクセスする
引数の評価戦略
[編集]ref
[編集]- 参照渡しを表す
out
[編集]- 呼び出し先で初期化される、参照渡しを表す
in
[編集]- 読み取り専用の参照渡しを表す (C# 7.2以降)
scoped (文脈)
[編集]ref
,out
,in
を後ろに伴って、参照のスコープをメソッド内に制限する (C#11以降)
params
[編集]- 可変長引数を表す
メンバー定義
[編集]型変換
[編集]explicit, implicit
[編集]- 明示的/暗黙的な型変換を定義する
演算子
[編集]operator
[編集]- 利用者定義演算子を定義する
プロパティ、インデクサ
[編集]get (文脈), set (文脈), init (文脈), value (文脈)
[編集]- get,setアクセサを宣言する
- initアクセサ は 初期化時限定のsetアクセサを表す (C# 9.0以降)
- valueはset,initアクセサ内で、引数を表す
イベント
[編集]event
[編集]- イベントメンバーを宣言する
add (文脈), remove (文脈), value (文脈)
[編集]- カスタムイベントの実装で、add,removeアクセサを宣言する
- valueはadd,removeアクセサ内で、引数を表す
反復子
[編集]yield (文脈)
[編集]- 反復子ブロックで、値の生成と終了を指示する
yield return 戻り値;
: 値を生成するyield break;
: 値の生成を終了する
クエリキーワード
[編集]LINQのクエリ式で利用されるキーワード[2]のうち、予約語はin
のみで、他は全て文脈キーワードである。
from (文脈), in
[編集]- データソースを指示する
from 範囲変数 in データソース
where (文脈)
[編集]- データのフィルタリングを指示する
where 条件式
group (文脈), by (文脈)
[編集]- グループ化を指示する
group グループ化対象 by キー項目
join (文脈), in, on (文脈), equals (文脈)
[編集]- 結合を指示する
join 範囲変数 in データソース on 左側キー項目 equals 右側キー項目
select (文脈)
[編集]- クエリの結果として生成されるデータの形式を指示する
select 生成される要素
into (文脈)
[編集]- グループ化や結合の結果を新たな範囲変数に格納する
into 範囲変数
let (文脈)
[編集]- サブ式の結果を新たな範囲変数に格納する
let 範囲変数 = サブ式
orderby (文脈), ascending (文脈), descending (文脈)
[編集]- 昇順または降順の並べ替えを指示する
orderby キー項目 ascending
orderby キー項目 descending
その他
[編集]1文字のアンダースコア (文脈)
[編集]- 1文字のアンダースコア
_
はC#では識別子として使用できるが、C# 7.0で導入された値の破棄では、文脈によってダミー変数として振る舞う。
Java 9でもアンダースコアがキーワードに指定された。C#では文脈による判断を行うことで破壊的変更を防いでいる。
args (文脈)
[編集]- 最上位ステートメントにおいて、コマンドライン引数を表す (C# 9.0以降)
- 最上位ステートメントにおいては
@args
を識別子として別途定義することはできない (argsは厳密にはキーワードではなく、変数名として振る舞う)
キーワードを使わない構文
[編集]他言語ではキーワードを利用するが、C#ではキーワードを利用しない例を示す。
継承
[編集]C#ではC++の継承の構文を引き継いでおり、
:
の後ろに継承するクラスと実装するインターフェイスを,
区切りで記述する。
- Javaでは、継承には
extends
キーワードを、実装にはimplements
キーワードをそれぞれ利用する。
プロパティ
[編集]C#では専用の構文でプロパティ宣言を行う。
- Delphi (Object Pascal) では
property
キーワードを利用する - VB.NETでは
Property
キーワードを利用する
脚注
[編集]- ^ a b c C# Keywords https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/
- ^ a b Query keywords https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/query-keywords
- ^ What's new in C# 7.0 through C# 7.3 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7
- ^ What's new in C# 8.0 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8
- ^ What's new in C# 9.0 https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
- ^ What's new in C# 11 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11
- ^ ISO/IEC 23270-2006 9.4.2 Identifiers の項を参照。