C Sharp
C#のロゴ | |
パラダイム |
|
---|---|
2000 | |
マイクロソフト(アンダース・ヘルスバーグ | |
マイクロソフト | |
12.0/ 2023 | |
| |
CLR, Mono | |
C++、C | |
D | |
プラットフォーム | Windows, macOS, Linuxなど |
ライセンス | Apacheライセンス (Roslyn) |
ウェブサイト |
docs |
cs、csx |
C#(シーシャープ)は、マイクロソフトが
デスクトップ・モバイルを
マルチパラダイムをサポートする
概要
[C#は
.NET
マイクロソフトの
バージョンおよびリリース時期
[バージョン | リリース |
.NET | Visual Studio | |||
---|---|---|---|---|---|---|
ECMA[5][6] | ISO/IEC | マイクロソフト | ||||
1.0 |
ECMA-334:2003 (2002 |
ISO/IEC 23270:2003 (2003 |
2002 |
2002 |
.NET Framework 1.0 | .NET (2002)[a 1] |
2003 |
2003 |
.NET Framework 1.1[b 1] | .NET 2003[a 1][b 1] | |||
2.0 |
ECMA-334:2006 (2006 |
ISO/IEC 23270:2006 (2006 |
2005 |
2005 |
|
2005[a 1] |
3.0 | — | — | 2007 |
2007 |
2008[a 1] | |
4.0 | — | — | 2010 |
2010 |
.NET Framework 4[b 3] | 2010[a 1] |
5.0 |
ECMA-334:2017 (2017 |
ISO/IEC 23270:2018 (2018 |
2013 |
2012 |
.NET Framework 4.5[b 4] |
|
6.0 |
ECMA-334:2022 (2022 |
— | Draft | 2015 |
|
2015[a 1] |
7.0 |
ECMA-334:2023 (2023 |
ISO/IEC 20619:2023 (2023 |
— | 2017 |
.NET Framework 4.7[9] | 2017 version 15.0[a 2] |
7.1 | — | — | — | 2017 |
.NET Core 2.0[a 1] | 2017 version 15.3[a 3] |
7.2 | — | — | — | 2017 |
.NET Core 2.0[a 1] | 2017 version 15.5[a 4] |
7.3 | — | — | — | 2018 |
|
2017 version 15.7[a 5] |
8.0 | — | — | — | 2019 |
|
2019 version 16.3[a 6] |
9.0 | — | — | — | 2020 |
.NET 5.0[11] | 2019 version 16.8[a 7] |
10.0[a 8] | — | — | Proposal | 2021 |
|
2022 version 17.0[a 9] |
11.0[a 10][b 6] | — | — | C# feature specifications | 2022 |
.NET 7.0[a 11][b 6] | 2022 version 17.4[a 11][a 12][b 6] |
12.0[a 13][b 7] | — | — | C# feature specifications | 2023 |
.NET 8.0[a 14][b 7] | 2022 version 17.8[a 14][a 15] |
言語 仕様
[さまざまな
しかし、C#の
そのため、
.NET 7.0
Hello World
[C#のHello Worldは
Console.WriteLine("Hello World!");
あえて
using System;
namespace Wikipedia
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
このコードは
不要 なusing
[16]省略 可能 なnamespace
("Wikipedia"
)の宣言 [17]省略 可能 なclass
("Program"
)の宣言 [17]省略 可能 なエントリーポイント関数 (Main
)の宣言 [17]
CやC++からの改良 点
[C#では、CやC++と
構文 や構文 以外 の改良 点
[外 のブロックで宣言 した変数 と同 じ名前 の変数 を、内 のブロックで再 宣言 (シャドウ)してはいけない。再 宣言 は便利 なこともあれば、混乱 や曖昧 のもとと主張 されることもあるが、C#では禁止 されている。- C#にはブール
型 bool
が存在 し、while
文 やif
文 のように条件 をとるステートメントには、bool
型 の式 を与 えなければならない。C言語 では、ブール型 が無 くint
型 (0を偽 とし、非 0を真 とする)に兼用 させた上 、(ヌルポインタを偽 とみなすこととするといろいろと便利 だった、ということもあり)ポインタでもwhile
文 やif
文 に与 える式 にできる、という仕様 としていた。これは便利 なこともあったが、本来 比較 式 を記述 すべきところで誤 って代入 式 を記述 してもコンパイル適合 となってしまうなど、ミスが見逃 されることもあった。C#ではミスを防止 するため[要 出典 ]に、そのような仕様 ではなくブール型 を独立 させ、またブール型 を厳密 に要求 する場所 を多 くしている。 switch
文 に整数 型 あるいは整数 型 に準 ずる型 のみならず、文字 列 型 string
を使用 できる。case
ラベルには、整数 型 あるいは整数 型 に準 ずる型 の定数 のみならず、文字 列 リテラル(文字 列 定数 )を使用 できる。組 み込 み型 のサイズおよび内部 表現 が仕様 で定 められており、プラットフォームや処理 系 に依存 しない。浮動 小数点 数 はIEEE 754に準拠 する[a 16]。文字 および文字 列 はUTF-16エンコーディングを採用 する[a 17]。
ポインタとメモリ管理
[- ポインタをサポートする。ポインタは
unsafe
スコープ内 のみで使用 することができ、適切 な権限 をもつプログラムのみがunsafe
とマークされたコードを実行 することができる。オブジェクトへのアクセスの大 部分 は管理 された安全 な参照 によってなされ、大 部分 の算術 演算 はオーバフローのチェックがなされる。unsafe
ポインタは値 型 や文字 列 を指 すことができる。セーフコードでは、必 ずしもそうする必要 はないものの、IntPtr
型 を通 してポインタをやりとりすることができる。 - マネージドなメモリを
明示 的 に解放 する方法 は存在 せず、参照 されなくなったメモリはガベージコレクタによって自動的 に解放 される。ガベージコレクタは、メモリの解放 忘 れによって起 こるメモリリークを解消 する。C#は、データベース接続 のようなアンマネージドなリソースに対 しても明示 的 に制御 する方法 を提供 している。これはIDisposable
インタフェースとusing
ステートメントまたはusing
宣言 によってなされる。
名前 空間 とオブジェクト指向 な型 システム
[名前 空間 は階層 構造 をもつ。つまり、名前 空間 は他 の名前 空間 の中 に宣言 することができる。組 み込 みの値 型 を含 めたすべての型 は、object
クラス (System.Object
) の派生 型 である。つまりobject
クラスのもつすべてのプロパティやメソッドを継承 する。例 えば、すべての型 はToString()
メソッドをもつ。- クラス (
class
) は参照 型 であり、構造 体 (struct
) および列挙 型 (enum
) は値 型 である。構造 体 はクラスよりも軽量 で、C/C++との相互 運用 性 に優 れるが、派生 型 を定義 することができない。 - クラスおよび
構造 体 は複数 のインタフェースを実装 することができるが、多重 継承 はサポートされない。 - C#はC++に
比 べて型 安全 である。既定 の暗黙 変換 は、整数 の範囲 を広 げる変換 や、派生 クラスから基底 クラスへの変換 といった、安全 な変換 のみに限定 される。これは、コンパイル時 、JITコンパイル時 、そして一部 の動的 なケースでは実行 時 に強制 される。ブール型 と整数 型 、列挙 型 と整数 型 、の間 は暗黙 変換 はできない。暗黙 変換 をユーザー定義 する際 は、明示 的 にそのように指定 しなければならない。これはC++のコンストラクタとは違 った仕様 である。 - C#は「Null
安全 」である。Null許容 型 、Null許容 参照 型 を持 ち、Null合体 演算 子 などの構文 ・演算 子 を持 つ。 列挙 型 のメンバーは、列挙 型 のスコープの中 に置 かれる。また、列挙 型 の定数 名 を取得 することができる。さらに、列挙 型 の定数 名 から動的 に定数 値 を得 ることができる。- アクセサの
定義 と利用 を簡略 化 するためにプロパティ構文 を利用 できる。C++およびJavaにおけるカプセル化 では、通例 getter/setterアクセサとなるメンバー関数 あるいはメソッドを定義 して利用 するが、C#ではプロパティ機能 により、カプセル化 を維持 しつつ、あたかもフィールドを直接 読 み書 きするような直感 的 な構文 でオブジェクトの状態 にアクセスすることができる。プロパティによってメンバーのアクセス制御 やデータの正当 性 チェックを実行 することができる。なお、イベントハンドラーに利用 するデリゲートのカプセル化 にはイベント構文 (event
) が用意 されている。 - ジェネリクス(
総称 型 )の採用 (C# 2.0以降 )。C++のテンプレート、Javaのジェネリックスと異 なりコンパイル後 も型 情報 が保持 される。また、Javaのジェネリクスと異 なりプリミティブ型 も型 変数 として使 うことができる。
C# 2.0からの仕様
[部分 型
[partial
partial class MyClass { int a; }
partial class MyClass { int b; }
これは
class MyClass { int a; int b; }
これによって、partial
ジェネリクス
[ジェネリクスが
.NETのGenericsはC++のテンプレート、あるいはJavaにおけるそれともwhere
静的 クラス
[static
イテレータ
[イテレータ#C# 2.0を
yieldキーワード
[yield
キーワードによるコルーチンを
匿名 デリゲート
[プロパティに対 する個別 のアクセス制御
[Property Accessors
プロパティのget
もしくは set
アクセサのどちらかにアクセスget
アクセサはpublic
、set
アクセサはprivate
である。
public class MyClass
{
private string status = string.Empty;
public string Status
{
get { return status; }
private set { status = value; }
}
}
Null許容 型 とnull結合 演算 子
[nullをNullable
が
int? i = 512;
i = null;
int? j = i + 500; //jはnullとなる。nullとの演算 の結果 はnullになる。
int?
はNullable<int>
の
int? x = null;
object o = x;
System.Console.WriteLine(o == null); //Trueが出力 される
また、null??
)がnull
でない
object obj1 = null;
object obj2 = new object();
object obj3 = new object();
return obj1 ?? obj2 ?? obj3; // obj2 を返 す
このNullable
Nullable
int? i = null;
int j = i ?? -1; // nullをint型 に代入 することはできない
その他
[匿名 メソッド[25]- External Aliases/Namespace Aliases Qualifiers[26]
- プラグマディレクティブ/C
言語 の様 な固定 長 の配列 表記 Fix Size Buffers[27]
C# 3.0からの仕様
[varキーワード
[var
キーワードが
var s = "foo";
// 上 の文 は右辺 が string 型 であるため、次 のように解釈 される:
string s = "foo";
// 以下 に挙 げる文 は誤 りである(コンパイルエラーとなる):
var v; // 初期 化 式 を欠 いている (型 を推論 する対象 が存在 しない)
var v = null; // 型 が推論 できない (曖昧 である)
拡張 メソッド
[this
public static class StringUtil
{
public static string Repeat(this string str, int count)
{
var array = new string[count];
for (var i = 0; i < count; ++i) array[i] = str;
return string.Concat(array);
}
}
このstring
Repeat
を、string
// 静的 メソッドとしての呼 び出 し
StringUtil.Repeat("foo", 4);
// 拡張 メソッドとしての呼 び出 し
"foo".Repeat(4);
// (どちらの例 も "foofoofoofoo" を返 す)
また、
public enum Way
{
None, Left, Right, Up, Down
}
public static class EnumUtil
{
public static Way Reverse(this Way src)
{
switch (src)
{
case Way.Left: return Way.Right;
case Way.Right: return Way.Left;
case Way.Up: return Way.Down;
case Way.Down: return Way.Up;
default: return Way.None;
}
}
}
このメソッドは
Way l = Way.Left;
Way r = l.Reverse(); // Way.Right
部分 メソッド
[partial
private
で、かつvoid
のメソッドに partial
partial class Class
{
partial void DebugOutput(string message);
void Method()
{
DebugOutput("Some message");
Console.WriteLine("Did something.");
}
}
Method()
を
partial class Class
{
partial void DebugOutput(string message)
{
Console.Write("[DEBUG: {0}] ", message);
}
}
をMethod()
を
ラムダ式
[ラムダ
// iを変数 としてi+1を返 すメソッド
delegate (int i) { return i + 1; }
は、ラムダ
(int i) => i + 1; /* 式 形式 のラムダ */
//或 いは:
(int i) => { return i + 1; }; /* ステートメント形式 のラムダ */
ラムダExpression<TDelegate>
public static string ToRPN(Expression<Func<int, int, int, int>> expression)
{
return Parse((BinaryExpression) expression.Body).TrimEnd(' ');
}
private static string Parse(BinaryExpression expr)
{
string str = "";
if (expr.Left is BinaryExpression)
{
str += Parse((BinaryExpression) expr.Left);
}
else if (expr.Left is ParameterExpression)
{
str += ((ParameterExpression) expr.Left).Name + " ";
}
else if (expr.Left is ConstantExpression)
{
str += ((ConstantExpression) expr.Left).Value + " ";
}
if (expr.Right is BinaryExpression)
{
str += Parse((BinaryExpression) expr.Right);
}
else if (expr.Right is ParameterExpression)
{
str += ((ParameterExpression) expr.Right).Name + " ";
}
else if (expr.Right is ConstantExpression)
{
str += ((ConstantExpression) expr.Right).Value + " ";
}
return str + expr.NodeType.ToString()
.Replace("Add", "+")
.Replace("Subtract", "-")
.Replace("Multiply", "*")
.Replace("Divide", "/")
+ " ";
}
// 呼 び出 し例 :
ToRPN((x, y, z) => (x + 1) * ((y - 2) / z)); // "x 1 + y 2 - z / *" を返 す
オブジェクト初期 化 の簡略 化
[オブジェクトの
var p = new Point { X = 640, Y = 480 };
// 上 の文 は次 のように解釈 される:
Point __p = new Point();
__p.X = 640;
__p.Y = 480;
Point p = __p;
また、コレクションの
var l = new List<int> {1, 2, 3};
var d = new Dictionary<string, int> {{"a", 1}, {"b", 2}, {"c", 3}};
// 上 の文 は次 のように解釈 される:
List<int> __l = new List<int>();
__l.Add(1);
__l.Add(2);
__l.Add(3);
List<int> l = __l;
Dictionary<string, int> __d = new Dictionary<string, int>();
__d.Add("a", 1);
__d.Add("b", 2);
__d.Add("c", 3);
Dictionary<string, int> d = __d;
自動 実装 プロパティ
[プロパティをよりget; set;
とget;
とset;
のどちらかget;
のみが
public int Value { get; set; }
は、
private int __value;
public int Value
{
get { return __value; }
set { __value = value; }
}
__value
と
匿名 型
[new { Name = "John Doe", Age = 20 }
public string Name { get; }
public int Age { get; }
var her = new { Name = "Jane Doe", Age = 20 }
var him = new { Name = "John Doe", Age = 20 }
において、her.GetType() == him.GetType()
は true
である。
配列 宣言 の型 省略
[new
キーワードを
var a = new[] {"foo", "bar", null};
// 上 の文 は次 のように解釈 される:
string[] a = new string[] {"foo", "bar", null};
// 以下 の文 :
var a = new[] {"foo", "bar", 123};
// は次 のように解釈 されることなく、誤 りとなる:
object[] a = new object[] {"foo", "bar", 123};
クエリ式
[LINQ をサポートするために、クエリ
var passedStudents =
from s in students
where s.MathScore + s.MusicScore + s.EnglishScore > 200
select s.Name;
var passedStudents = students
.Where(s => s.MathScore + s.MusicScore + s.EnglishScore > 200)
.Select(s => s.Name);
C# 3.0で
C# 4.0からの仕様
[dynamicキーワード
[dynamicキーワードが
// xはint型 と推論 される:
var x = 1;
// yはdynamic型 として扱 われる:
dynamic y = 2;
public dynamic GetValue(dynamic obj)
{
// objにValueが定義 されていなくとも、コンパイルエラーとはならない:
return obj.Value;
}
オプション引数 ・名前 付 き引数
[VBやC++に
public void MethodA()
{
// 第 1引数 と第 2引数 を指定 、第 3引数 は未 指定 :
Console.WriteLine("Ans: " + MethodB(1, 2)); // Ans: 3 … 1 + 2 + 0となっている
// 第 1引数 と第 3引数 を指定 、第 2引数 は未 指定 :
Console.WriteLine("Ans: " + MethodB(A: 1, C: 3)); // Ans: 4 … 1 + 0 + 3となっている
}
// 引数 が指定 されなかった場合 のデフォルト値 を等号 で結 ぶ:
public int MethodB(int A = 0, int B = 0, int C = 0)
{
return A + B + C;
}
ジェネリクスの共 変性 ・反 変性
[ジェネリクスの
IEnumerable<string> x = new List<string> { "a", "b", "c" };
// IEnumerable<T>インターフェイスは型 引数 にout修飾 子 が指定 されているため、共 変 である。
// したがって、C# 4.0では次 の行 はコンパイルエラーにならない
IEnumerable<object> y = x;
C# 5.0からの仕様
[非同期 処理 (async/await)[a 1]呼 び出 し元 情報 属性 [a 1]- foreach の
仕様 変更
非同期 処理 (async/await)
[C# 6.0からの仕様
[自動 実装 プロパティの初期 化 子 [a 19]- get のみの
自動 実装 プロパティおよびコンストラクタ代入 [a 19] 静的 using ディレクティブ[a 19]- インデックス
初期 化 子 [a 19] - catch/finally での await[a 19]
例外 フィルタ[a 19]式 形式 のメンバー (expression-bodied members)[a 19]- null
条件 演算 子 [a 19] 文字 列 補間 (テンプレート文字 列 )[a 19]- nameof
演算 子 [a 19] - #pragma
- コレクションの
初期 化 子 での拡張 メソッド[a 19] - オーバーロード
解決 の改善 [a 19]
静的 using ディレクティブ
[using static
の
using static System.Math;
// ↑ソースコードの上部 で宣言
class Hogehoge {
// System.Math.Pow() , System.Math.PI を修飾 無 しで呼 び出 す
double area = Pow(radius, 2) * PI;
}
例外 フィルタ
[catch
のwhen
キーワードを
try {
// ...
}
catch (AggregateException ex) when (ex.InnerException is ArgumentException) {
// ...
}
C# 7.0からの仕様
[出力 変数 宣言 - パターンマッチング (is
式 /switch文 ) - タプル (タプル
記法 /分解 /値 の破棄 ) - ローカル
関数 数値 リテラルの改善 (桁 セパレータ/バイナリリテラル)- ref
戻 り値 、ref変数 非同期 戻 り値 型 の汎用 化 - Expression-bodied
機能 の拡充 (コンストラクタ/デストラクタ/get/set/add/remove) - Throw
式
出力 変数 宣言
[out
total += int.TryParse("123", out var num) ? num : 0;
パターンマッチング
[is 式 の拡張
[is
is
void CheckAndSquare(object obj) {
// objの型 チェックと同時 にnumに値 を代入 する。
if (obj is int num && num >= 0) {
num = num * num;
}
else {
num = 0;
}
// if文 の条件 セクションは、ifの外側 と同 じスコープ
Console.WriteLine(num);
}
switch 文 の拡張
[switch
case
ラベルにcase
ラベルでは、when
switch
case
ラベルの
void Decide(object obj) {
switch (obj) {
case int num when num < 0:
Console.WriteLine($"{num}は負 の数 です。");
break;
case int num:
Console.WriteLine($"{num}を二乗 すると{num * num}です。");
break;
case "B":
Console.WriteLine($"これはBです。");
break;
case string str when str.StartsWith("H"):
Console.WriteLine($"{str}はHから始 まる文字 列 です。");
break;
case string str:
Console.WriteLine($"{str}は文字 列 です。");
break;
case null:
Console.WriteLine($"nullです");
break;
default:
Console.WriteLine("判別 できませんでした");
break;
}
}
タプル
[タプルのためのSystem.Tuple
クラスとはSystem.ValueTuple
タプル記法
[2
// タプル記法
(int, string) tuple = (123, "Apple");
Console.WriteLine($"{tuple.Item1}個 の{tuple.Item2}");
分解
[var tuple = (123, "Apple");
// 分解
(int quantity, string name) = tuple;
Console.WriteLine($"{quantity}個 の{name}");
Deconstruct()
メソッドが
DateTime
static class DateExt {
public static void Deconstruct(this DateTime dateTime, out int year, out int month, out int day) {
year = dateTime.Year;
month = dateTime.Month;
day = dateTime.Day;
}
}
DateTime
Deconstruct()
// 分解
(int year, int month, int day) = DateTime.Now;
のように
値 の破棄
[_
が
// 年 と日 は使 わない
(_, int month, _) = DateTime.Now;
// 解析 結果 だけ取得 し、変換 された値 は使 わない
bool isNumeric = int.TryParse(str, out _);
switch (obj) {
// string型 で分岐 するが、値 は使 わない
case string _:
// Do something.
break;
}
ref戻 り値 、ref変数
[ref
キーワードの
ref戻 り値
[ref
で
// 二 つの参照 引数 の内 、値 の大 きいものの参照 戻 り値 を返 す
static ref int Max(ref int left, ref int right) {
if (left >= right) {
return ref left;
}
else {
return ref right;
}
}
static int s_count = 1;
// メンバーの参照 はref戻 り値 になる。
static ref int ReturnMember() {
return ref s_count;
}
// ref引数 はもちろんref戻 り値 になる。
static ref int ReturnRefParam(ref int something) {
return ref something;
}
// ローカル変数 をref戻 り値 とすることはできない。
// static ref int ReturnLocal() {
// int x = 1;
// return ref x;
// }
ref変数
[ローカルref
で
// 参照 戻 り値 を参照 変数 で受 け取 る
ref int max = ref Max(ref x, ref y);
// limitとmaxは同 じ値 を参照 する
ref int limit = ref max;
C# 7.1からの仕様
[非同期 なMainメソッド
[MainメソッドのTask
Task(int)
static Task Main()
static Task<int> Main()
default式
[default
の
int number = default;
string name = default;
C# 7.2からの仕様
[C#7.2で
値 型 の参照 セマンティクス
[in参照 渡 し、ref readonly参照 戻 り値
[in
をref readonly
を
これにより、
readonly構造 体
[readonly
をreadonly
でなければならず、this
ポインタも
これにより、メンバーアクセス
ref構造 体
[ref
を
このSpan<T>
のようなstackalloc
の
末尾 以外 の場所 での名前 付 き引数
[C#4.0で
Hogehoge(name: "John", 17);
private protected アクセス修飾 子
[private protected
アクセス
数値 リテラルの改善
[0x
、0b
の
int bin = 0b_01_01;
int hex = 0x_AB_CD;
C# 7.3からの仕様
[C#7.3では
- ジェネリック
型 制約 の種類 の追加 System.Enum
,System.Delegate
unmanaged
(文脈 キーワード)
unsafe class MyGenericsClass<T1,T2,T3>
where T1 : System.Enum
where T2 : System.Delegate
where T3 : unmanaged {
public MyGenericsClass(T1 enum1, T1 enum2, T2 func, T3 unmanagedValue) {
if (enum1.HasFlag(enum2)) {
func.DynamicInvoke();
}
else {
T3* ptr = &unmanagedValue;
}
}
}
ref
ローカル変数 の再割 り当 てstackalloc
初期 化 子 - Indexing movable fixed buffers
- カスタム
fixed
ステートメント - オーバーロード
解決 ルールの改善 出力 変数 宣言 の利用 箇所 の追加
class MyOutVar {
// メンバー変数 初期 化 子 やコンストラクタ初期 化 子 で出力 変数 宣言 が可能
readonly int x = int.TryParse("123", out var number) ? number : -1;
}
- タプル
同士 の比較
(long, long) tuple = (1L, 2L);
// タプルのすべての要素 間 で == が比較 可能
if (tuple == (1, 2)) { }
// 要素 数 が異 なるタプル同士 は比較 できない。
//if (tuple == (1, 2, 3)) { }
- バッキングフィールドに
対 するAttribute指定
// C#7.2までは無効 な指定 (コンパイル自体 は可能 。無視 される)
// C#7.3からはバッキングフィールドに対 するAttribute指定 と見 なされる
[field: NonSerialized]
public int MyProperty { get; set; }
C# 8.0からの仕様
[C# 8.0で
null許容 参照 型
[?
を
?
を
フローNullable<T>
のような
null許容 コンテキスト
[- Nullable コンパイルオプション: プロジェクト
全体 でのnull許容 コンテキストを指定 する #nullable
ディレクティブ: ソースコードの部分 ごとにnull許容 コンテキストを指定 するannotations
オプション、warnings
オプションにより、適用 範囲 を限定 できる
null免除 演算 子
[null!
を
インタフェースの既定 メンバー
[インタフェースのメンバーに
さらに、インタフェースのメンバーにアクセシビリティを
既定 のアクセシビリティは、従来 通 りpublic
となる。実装 があるインスタンスメンバーは、既定 でvirtual
となりoverride
可能 である。実装 をoverride
させないためにsealed
を指定 することができる。
パターンマッチングの拡張
[switch
- switch
式 再帰 パターン- プロパティパターン
- タプルパターン
位置 指定 パターン
非同期 ストリーム
[IAsyncEnumerable<T>
インタフェースを
async IAsyncEnumerable<int> EnumerateAsync() {
await Task.Delay(100);
yield return 1;
await Task.Delay(100);
yield return 2;
}
await foreach
によって
async void SpendAsync() {
await foreach (var item in EnumerateAsync()) {
Console.WriteLine(item);
}
}
範囲 指定
[Index
とRange
を
Index a = 1; // new Index(1, fromEnd: false)
Index b = ^1; // new Index(1, fromEnd: true)
Range range = a..b; // new Range(start: a, end: b)
その他 の仕様
[静的 ローカル関数 - null
結合 代入 演算 子 構造 体 の読 み取 り専用 メンバー- using
宣言 - ref
構造 体 のDispose - ジェネリクスを
含 むアンマネージ型 式 中 のstackalloc
文字 列 補間 のトークン順序 の緩和
C# 9.0からの仕様
[C# 9.0で
- レコード
- プロパティのinitアクセサ
最 上位 レベルステートメント- パターンマッチングの
拡張 - new
式 の型 推論 条件 演算 子 の型 推論 共 変 戻 り値 - GetEnumeratorの
拡張 メソッド対応 静的 匿名 関数 - ラムダ
式 引数 の破棄 - ローカル
関数 への属性 適用 - パフォーマンスと
相互 運用 - ネイティブサイズの
整数 型 (nint
nuint
型 ) 関数 ポインタ(delegate*
型 )変数 初期 化 フラグの抑制
- ネイティブサイズの
- コードジェネレータのサポート
- モジュール
初期 化 子 部分 メソッドの拡張
- モジュール
C# 10.0からの仕様
[C# 10.0で
- レコード
構造 体 構造 体型 の機能 強化 補間 された文字 列 ハンドラー- global using ディレクティブ
- ファイル スコープの
名前 空間 の宣言 拡張 プロパティのパターン- ラムダ
式 の機能 強化 - const
補間 文字 列 を許可 する - レコードの
型 で ToString() を封印 できる 限定 代入 の機能 強化 同 じ分解 で代入 と宣言 の両方 を許可 する- メソッドで AsyncMethodBuilder
属性 を許可 する - CallerArgumentExpression
属性 拡張 #line pragma警告 ウェーブ 6
C# 11.0からの仕様
[C# 11.0で
生 文字 列 リテラル
[エスケープなどの
string logMsg = """
原因 不明 のエラーが発生 しました。
詳細 はログファイル "C:\Logs\exception.log" を確認 してください。
""";
汎用 属性
[// 属性
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ConverterContractAttribute<TFrom, TTo> : Attribute { }
// 使用 例
[ConverterContract<byte, string>()]
[ConverterContract<sbyte, string>()]
[ConverterContract<short, string>()]
[ConverterContract<ushort, string>()]
[ConverterContract<int, string>()]
[ConverterContract<uint, string>()]
[ConverterContract<long, string>()]
[ConverterContract<ulong, string>()]
public class IntToStringConverter
{
// ...
}
パターンマッチングの拡張
[リストや
int[] nums = new[] { 0, 1, 2, 3, 4, 5 };
if (nums is [ 0, 1, 2, .. ]) {
Console.WriteLine("配列 は 0, 1, 2 から始 まります。");
} else {
Console.WriteLine("配列 は 0, 1, 2 から始 まりません。");
}
また、Span<char>
やReadOnlySpan<char>
に
bool CheckSignature(ReadOnlySpan<char> sig)
{
return sig is "HOGE";
}
ジェネリック型 数値 演算
[明示 的 な論理 シフト演算 子 (>>>
演算 子 )が追加 された。- シフト
演算 子 の右側 の引数 の型 に対 する制限 の撤廃 され、int
型 以外 の型 を指定 できる様 になった。 checked
演算 子 のオーバーロードができる様 になった。- インターフェースのメソッドに
対 してstatic abstract
キーワード(静的 抽象 )とstatic virtual
キーワード(静的 仮想 )を指定 できる様 になった[a 30][a 31]。
ジェネリック
// 大抵 の演算 子 インターフェイスは System.Numerics 内 に実装 されている。
using System.Numerics;
// 任意 の型 に対 して加算 を行 う事 ができる関数 。
static T MyAdd<T>(T value1, T value2)
where T: IAdditionOperators<T, T, T> // 加算 が可能 な型 のみを受 け付 ける制約 。
=> value1 + value2; // + 演算 子 を使 う事 ができる。
// 上記 の関数 定義 のみで、下記 の様 に加算 演算 が定義 された型 であれば、任意 の型 で呼 び出 す事 ができる。
int a = MyAdd( 123, 456); // 結果 :579
ulong b = MyAdd(111UL, 222UL); // 結果 :333
double c = MyAdd( 1.5D, 2.1D); // 結果 :3.6
その他 の仕様
[- UTF-8
文字 列 リテラル 文字 列 補間 式 の改行 - ファイルローカル
型 必須 メンバー- auto-default
構造 体 (構造 体 の未 初期 化 のフィールド変数 が自動的 に既定 値 に初期 化 される) nameof
のスコープ拡張 IntPtr
に別名 nint
、UIntPtr
に別名 nuint
が付 いたref
フィールドscoped ref
変数 - メソッドグループからデリゲートへの
変換 の改善 警告 ウェーブ 7
C# 12.0からの仕様
[C# 12.0で
クラスと構造 体 のプライマリコンストラクター
[レコードrecord
)class
)とstruct
)でプライマリコンストラクターが
class Example(string message)
{
public string Message { get; } = message;
}
コレクション式
[Span<T>
などの[]
)で
// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["one", "two", "three"];
// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
スプレッド演算 子
[コレクション..
)が
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
int[] single = [.. row0, .. row1, .. row2];
その他 の仕様
[- インライン
配列 既定 のラムダ パラメーター任意 の型 の別名 設定 ref readonly
パラメーター試験 段階 の属性 - インターセプター
実装
[C#の
コンパイラの実装
[- マイクロソフト
製 - Visual Studio 2015
以降 で使用 されている、.NETコンパイラプラットフォーム (コードネーム Roslyn)。ApacheライセンスのオープンソースプロジェクトでGitHubで公開 されている[31]。Windows、macOS、Linuxで動作 する。C#のコンパイラはC#、VB.NETのコンパイラはVB.NETで実装 されている。以前 のコンパイラと比 べて、リファクタリングやIDE、スクリプティングなどへの利用 が可能 なAPIが公開 されており、コンパイラ以外 への様々 な応用 が可能 。 - Visual Studio 2013 まで
使 われていた、マイクロソフトによるVisual C# コンパイラ。 - 2006
年 のC# 2.0当時 の、マイクロソフトによるShared Source Common Language Infrastructure。共通 言語 基盤 (CLI) とC#コンパイラがソースコードで公開 されている。
- Visual Studio 2015
- Mono ProjectによるMono
内 の Mono Compiler Suite (mcs)。 - 2012
年 まで開発 されていた、DotGNU ProjectによるPortable.NET内 の the C-Sharp code compiler (cscc)。
実行 環境 の実装
[名称
[- ECMA-334 3rd/4th/5th edition によると、C# は「C Sharp」(シーシャープ)と
発音 し、LATIN CAPITAL LETTER C (U+0043) の後 に NUMBER SIGN # (U+0023) と書 く[33]。音楽 のシャープ (♯, MUSIC SHARP SIGN (U+266F)) ではなくナンバーサイン (#) を採用 したのは、フォントやブラウザなどの技術 的 な制約 に加 え、ASCIIコードおよび標準 的 キーボードには前者 の記号 が存在 しないためである。 - "#"
接尾 辞 は、他 の.NET言語 にも使用 されており、J#(Javaのマイクロソフトによる実装 )、A#(Adaから)、F#(System Fなどから[34])が含 まれる。また"#"接尾 辞 はGtk#(GTKなどのGNOMEライブラリの.NETラッパ)、Cocoa#(Cocoa (API)のラッパ)などのライブラリにも使用 されている。そのほか、SharpDevelopなどの"Sharp"を冠 する関連 ソフトウェアも存在 する。 - C#という
名称 の解釈 として、「(A-Gで表 された)直前 の音 を半音 上 げる」という音楽 記号 の役割 に着目 し、「C言語 を改良 したもの」を意味 したのではないか、というものがある[要 出典 ]。これは、C++の名称 が「C言語 を1つ進 めたもの」という意味 でつけられたことにも似 ている。 - アンダース・ヘルスバーグは、「C#」が「C++++」(すなわち「C++をさらに
進 めたもの」)にみえるのが由来 である、と語 っている[35][36]。
注釈
[出典
[- ^ “Announcing C# 12”. マイクロソフト (2023
年 11月14日 ). 2023年 12月19日 閲覧 。 - ^ a b Abel Avram (2009
年 7月 29日 ). “誰 でもC#とCLIの正式 な実装 が可能 に”. InfoQ. 2019年 12月2日 閲覧 。 - ^ “Visual Basic
言語 の戦略 - Visual Basic”. Microsoft (2023年 5月 10日 ). 2023年 12月23日 閲覧 。 - ^ “Visual Studio Code
用 の C#開発 キット - Visual Studio Subscription”. Microsoft (2023年 10月 13日 ). 2023年 12月23日 閲覧 。 - ^ “Standard ECMA-334”. ECMA. 2023
年 12月23日 閲覧 。 - ^ “Standard ECMA-334-archive”. 2018
年 11月13日 時点 のオリジナルよりアーカイブ。2018年 11月13日 閲覧 。 - ^ “Using C# 3.0 from .NET 2.0”. Danielmoth.com (May 13, 2007). October 4, 2012
閲覧 。 - ^ “Microsoft、「.NET Framework 4.6」を
正式 公開 ”.窓 の杜 2021年 1月 23日 閲覧 。 - ^ “.NET Framework 4.7が
一般 公開 される”. InfoQ 2021年 1月 23日 閲覧 。 - ^ “Micorsoftが.NET Core 3.0をリリース”. InfoQ 2021
年 1月 23日 閲覧 。 - ^ Richard Lander (2020
年 11月10日 ). “Announcing .NET 5.0” (英語 ). .NET Blog. Microsoft. 2020年 11月11日 閲覧 。 - ^ “Native AOT deployment overview - .NET”. Microsoft (2023
年 9月 12日 ). 2023年 12月23日 閲覧 。 - ^ “IL2CPP の
概要 - Unity マニュアル”. Unity. 2023年 12月23日 閲覧 。 - ^ “Burst の
概要 ”. Unity. 2023年 12月23日 閲覧 。 - ^ “Hello World - C# の
概要 に関 する対話 型 チュートリアル”. Microsofit. 2023年 12月23日 閲覧 。 - ^
暗黙 的 な using ディレクティブ “.NET プロジェクト SDK の概要 ”. 2023年 12月23日 閲覧 。 - ^ a b c “
最 上位 レベルのステートメント - C# チュートリアル - C#”. 2023年 12月23日 閲覧 。 - ^ “
組 み込 みの参照 型 - C# リファレンス - C#”. Microsoft (2023年 5月 10日 ). 2023年 12月23日 閲覧 。 - ^ a b
高橋 2005, p. 70. - ^
高橋 2005, pp. 63–64. - ^
高橋 2005, pp. 68–70. - ^
高橋 2005, pp. 70, 71. - ^ “null
許容 型 のボックス化 (C# プログラミング ガイド)” (pdf). Microsoft. 2008年 6月 2日 閲覧 。 - ^
高橋 2005, p. 68. - ^
高橋 2005, pp. 66, 67. - ^
高橋 2005, p. 71. - ^
高橋 2005, p. 72. - ^ Mads Torgersen (2017
年 11月15日 ). “Welcome to C# 7.2 and Span” (英語 ). .NET Blog. Microsoft. 2017年 11月23日 閲覧 。 - ^ “MicrosoftがC# 8.0をリリース”. InfoQ (2019
年 12月10日 ). 2019年 12月12日 閲覧 。 - ^ Tim Smith (2010
年 10月 4日 ). “Javaと.NETの特許 問題 への短 い紹介 ”. InfoQ. 2019年 12月2日 閲覧 。 - ^ dotnet/roslyn - GitHub
- ^ “ゲームプログラムのC#8.0/.NET
対応 とその未来 ”. CAPCOM. 2024年 6月 29日 閲覧 。 - ^ Standard ECMA-334 C# Language Specification
- ^ The A-Z of programming languages: F# | Network World
- ^ レポート:コミュニティスペシャルセッション with Anders Hejlsberg in Microsoft Developers Conference 2006
- ^ C#への
期待 。アンダースからの返答
公式 発表
[- ^ a b c d e f g h i j k l m n o p q r s t u v w x y z aa “C# の
歴史 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “Visual Studio 2017 バージョン 15.0 リリース ノート”. Microsoft Docs. 2021
年 1月 23日 閲覧 。 - ^ “Visual Studio 2017 15.3 Release Notes”. Microsoft Docs. 2018
年 11月12日 閲覧 。 - ^ “Visual Studio 2017 15.5 Release Notes”. Microsoft Docs. 2018
年 11月12日 閲覧 。 - ^ “Visual Studio 2017 15.7 Release Notes”. Microsoft Docs. 2018
年 8月 24閲覧 。 - ^ “Visual Studio 2019 Release Notes”. Microsoft Docs. 2019
年 9月 30日 閲覧 。 - ^ “Visual Studio 2019 Release Notes”. Microsoft Docs. 2020
年 11月 10日 閲覧 。 - ^ “What's new in C# 10” (
英語 ). docs.microsoft.com. 2022年 6月 28日 閲覧 。 - ^ “Visual Studio 2022 version 17.0 Release Notes”. docs.microsoft.com. 2022
年 6月 28日 閲覧 。 - ^ a b “C# 11 の
新 機能 ”. Microsoft Learn. 2023年 8月 15日 閲覧 。 - ^ a b c “.NET 7 is Available Today” (
英語 ). .NET Blog. 2023年 8月 15日 閲覧 。 - ^ “Visual Studio 2022 バージョン 17.4 リリース ノート”. Microsoft Learn. 2023
年 8月 15日 閲覧 。 - ^ a b “C# 12 の
新 機能 ”. Microsoft Learn. 2023年 12月19日 閲覧 。 - ^ a b c “Announcing .NET 8” (
英語 ). .NET Blog. 2023年 12月19日 閲覧 。 - ^ “Visual Studio 2022 バージョン 17.8 リリース ノート”. Microsoft Learn. 2023
年 12月19日 閲覧 。 - ^ “2-2
変数 と定数 ”. Microsoft Docs. 2018年 11月11日 閲覧 。 - ^ “.NET での
文字 エンコード”. Microsoft Docs. 2018年 11月11日 閲覧 。 - ^ “
拡張 メソッド (C# プログラミング ガイド)”. Microsoft Docs. 2018年 11月 10日 閲覧 。 - ^ a b c d e f g h i j k l “C# 6 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ a b c d e “C# 7.0 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “switch (C# リファレンス)”. Microsoft Docs. 2017
年 9月 10日 閲覧 。 - ^ a b “C# 7.1 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “C# 7.2 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “C# 7.3 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “C# 8.0 の
新 機能 ”. Microsoft Docs. 2019年 12月12日 閲覧 。 - ^ “What's new in C# 9.0”. Microsoft Docs. 2021
年 10月 17日 閲覧 。 - ^ “What's new in C# 10.0”. Microsoft Docs. 2022
年 11月3日 閲覧 。 - ^ “リスト パターン”. Microsoft Learn. 2023
年 8月 15日 閲覧 。 - ^ “ジェネリック
型 数値 演算 ”. Microsoft Learn. 2024年 5月 30日 閲覧 。 - ^ “
静的 抽象 および仮想 メンバー”. Microsoft Learn. 2024年 5月 30日 閲覧 。 - ^ “チュートリアル: C# 11 の
機能 を調 べる - インターフェイスの静的 仮想 メンバー”. Microsoft Learn. 2024年 5月 30日 閲覧 。 - ^ “IAdditionOperators<TSelf,TOther,TResult> インターフェイス”. Microsoft Learn. 2024
年 5月 30日 閲覧 。
個人 サイト
[- ^ a b c d “C# 1.0 - C# によるプログラミング
入門 ”. 2021年 1月 23日 閲覧 。 - ^ “C# 2.0 の
新 機能 - C# によるプログラミング入門 ”. 2021年 1月 23日 閲覧 。 - ^ “C# 4.0 の
新 機能 - C# によるプログラミング入門 ”. 2021年 1月 23日 閲覧 。 - ^ “C# 5.0 の
新 機能 - C# によるプログラミング入門 ”. 2021年 1月 23日 閲覧 。 - ^ “C# 7.3 の
新 機能 - C# によるプログラミング入門 ”. 2021年 1月 23日 閲覧 。 - ^ a b c d e “C# 11.0 の
新 機能 - C# によるプログラミング入門 ”. ++C++; //未 確認 飛行 C. 2023年 8月 15日 閲覧 。 - ^ a b c d “C# 12.0 の
新 機能 - C# によるプログラミング入門 ”. ++C++; //未 確認 飛行 C. 2023年 12月19日 閲覧 。 - ^ “パターン マッチング - C# によるプログラミング
入門 ”. 2023年 12月23日 閲覧 。 - ^ “C# 9.0 の
新 機能 - C# によるプログラミング入門 ” (2020年 5月 9日 ). 2023年 12月23日 閲覧 。 - ^ “リスト パターン”. ++C++; //
未 確認 飛行 C. 2023年 8月 15日 閲覧 。 - ^ “【Generic Math】 C# 11 での
演算 子 の新 機能 ”. ++C++; //未 確認 飛行 C. 2024年 5月 30日 閲覧 。
参考 文献
[高橋 忍 「C# 2.0の新 しい言語 仕様 」『C MAGAZINE(2005年 2月 号 )』第 17巻 第 2号 、ソフトバンク パブリッシング。山田 祥 寛 『独習 C#』(第 5版 )翔 泳 社 〈独習 〉、2022年 7月 21日 。ISBN 978-4-7981-7556-0。
関連 項目
[言語 仕様 実行 環境 開発 環境 - Visual Studio
- Visual Studio Code
- JetBrains Rider - ジェットブレインズ
社 の.NET向 け統合 開発 環境 - MonoDevelop - OSSの
統合 開発 環境 - SharpDevelop - フリーの
統合 開発 環境
比較
外部 リンク
[- C#
関連 のドキュメント - はじめに、チュートリアル、リファレンス。 | Microsoft Docs -公式 ウェブサイト(日本語 ) 言語 仕様 - Introduction - C# language specification | Microsoft Learn - C#
言語 仕様 、Microsoft Docs - ECMA-334 - Ecma International ECMA-334 C#
言語 仕様 - JIS X 3015:2008「プログラム
言語 C#」(日本 産業 標準 調査 会 、経済 産業 省 )
- Introduction - C# language specification | Microsoft Learn - C#
- C# Compiler | Mono Mono C# コンパイラ