タプル
概要 Ver. 7 「名前のない複合型」で説明したように、 型には常によい名前が付くわけではなく、名無しにしておきたいことがあります。 そういう場合に使うもののうちの1つがC# 7で導入されたタプルです。 タプルの最大の用途は多値戻り値です。 関数の戻り値は引数と対になるものなので、タプルの書き心地は引数に近くなるように設計されています。 ポイント (int x, int...
View Article複合型の分解
概要 Ver. 7 タプルから値を取り出す際には、メンバーを直接、それぞれバラバラに受け取りたくなることがあります。 「名前のない複合型」で説明したように、 メンバー名だけ見ればその型が何を意味するか分かるからこそ型に名前が付かないわけです。 このとき、その型を受け取る変数にも、よい名前が浮かばなくなるはずです。 そこでC#...
View Article[雑記] 小さな機能の組み合わせ
この記事はソフトウェアデザインに寄稿した内容が元になっています。 初出: 技術評論社刊『ソフトウェアデザイン 2016 年 4 月 号 今すぐ実践できる良いプログラムの書き方 C#編 言語機能の進化から学ぶ「良いコードの書き方」 概要 「LINQ」で説明した通り、C#にはLINQ(Language Integrated...
View Articleタプル
概要 Ver. 7 「名前のない複合型」で説明したように、 型には常によい名前が付くわけではなく、名無しにしておきたいことがあります。 そういう場合に使うもののうちの1つがC# 7で導入されたタプルです。 タプルの最大の用途は多値戻り値です。 関数の戻り値は引数と対になるものなので、タプルの書き心地は引数に近くなるように設計されています。 ポイント (int x, int...
View Article複合型の分解
概要 Ver. 7 タプルから値を取り出す際には、メンバーを直接、それぞれバラバラに受け取りたくなることがあります。 「名前のない複合型」で説明したように、 メンバー名だけ見ればその型が何を意味するか分かるからこそ型に名前が付かないわけです。 このとき、その型を受け取る変数にも、よい名前が浮かばなくなるはずです。 そこでC#...
View Article型スイッチ
概要 Ver. 7 C# 7で、is演算子やswitchステートメントのcaseが拡張されて、以下のような機能が入りました。 caseでも、is演算子と同じように、インスタンスの型を見ての分岐ができるようになった x is T tや、case T tというように、型を調べつつ、型が一致してたらキャスト結果を変数tで受け取れるようになった この機能を型スイッチ(type switch)と呼びます。...
View Article式とステートメント
概要 「変数と式」で少し言葉としては出しましたが、 プログラミング言語の構文には大きく分けて式(expression)とステートメント(statement: 文、平叙文)という2種類のものがあります。 最近のプログラミング言語ほど式の比率が高くなっています。 C#でも、バージョンを重ねるごとに、式になっている構文が増えています。...
View Article変数宣言式
概要 C# 7のいくつかの機能は、将来的にパターン マッチング(pattern matching)という機能に発展する予定です。 型スイッチ is演算子の拡張 switchステートメントの拡張 出力変数宣言 分解代入 パターン マッチングは結構大きな言語機能ですが、 小さく切り出していった結果が型スイッチや分解になります。...
View Article[雑記] エントリーポイント
概要 C# では通常、1つのプログラムは複数の C# ソースコードからなり、そのソースコード中には複数の関数が含まれています。 その、多数ある関数の中で、プログラム起動時に最初に呼ばれるものをエントリーポイント(entry point: 入場地点)と呼びます。 「C# のプログラムの基本構造」で例を出したように、 C# では、Mainという名前の関数が自動的にエントリーポイントになります。...
View ArticleC# 7.1 の新機能
※2017年6月現在、プレビュー版の情報です。正式リリースまでに、機能の増減や、細かい仕様の変更がありえます。 C# 7.1 Ver. 7.1 リリース時期 2017/? 同世代技術 Visual Studio 2017 Update 3 要約・目玉機能 C# 7.0のちょっとした改善 2017年6月時点で「Preview 2」の状態ですが、C# 7.0のリリース(2017年2月)から半年程度で...
View ArticleC# 7.2 の新機能
C# 7.2 Ver. 7.2 リリース時期 未定 同世代技術 Visual Studio 2017 15.5 要約・目玉機能 構造体と参照の活用 ※ 現在、C# 7.2 はプレビュー版です。正式リリースまでに変更があり得ます。 少しずつ説明を埋めている最中です。 進捗管理用の GitHub issue C#...
View Articlereadonly の注意点
概要 「定数」で、読み取り専用のフィールドが作れるという話をしました。 この時点ではまだクラスや構造体、値型と参照型の違いなどについて触れていなかったのでreadonly修飾子の簡単な紹介だけに留めましたが、 本項で改めてreadonlyについて説明します。 整数などの基本的な型に対して使う分には特に問題は起きないんですが、構造体やクラスなど、複合型に対して使うときには注意が必要です。...
View ArticleSpan構造体
概要 Ver. 7.2 Span<T>構造体(System名前空間)は、span (区間、範囲)という名前通り、連続してデータが並んでいるもの(配列など)の一定範囲を読み書きするために使う型です。 この型によって、ファイルの読み書きや通信などの際の、生データの読み書きがやりやすくなります。...
View Articleref構造体
概要 前項では、C# 7.2 の新機能と深くかかわる Span<T> 構造体という型を紹介しました。 この型は、論理的には (ref T Reference, int Length) というような、「参照フィールド」と長さのペアを持つ構造体です。 「参照」を持っているので、参照戻り値や参照ローカル変数と同種の「出所の保証」が必要です。 またSpan<T>...
View Article[雑記] インライン化
概要 前述の通り、関数によって「同じ処理を何度も繰り返し書かない」、「意味のある単位で明確な名前を付ける」ということができ、プログラムを読みやすく・書きやすくすることができます。 一方で、ここでは、プログラムのパフォーマンスの面から関数を見てみましょう。関数呼び出しには多少のコストが掛かります。このコストをなくすため、コンパイラーによってインライン化という最適化が行われます。 関数呼び出しのコスト...
View Article[雑記] デリゲートの内部
概要 デリゲートは、内部実装的には「インスタンスと関数ポインターをペアで管理しているクラス」になっています。 ここではデリゲートの内部挙動と、 それを踏まえたパフォーマンス上の注意点を説明します。 デリゲートの内部 デリゲートは .NET ランタイム内で特殊な扱いをされていて、 デリゲート内部で起こっていることをそのまま C# で書くことはできないので、...
View Articleプロジェクト管理
Visual Studio で C# を使ったプログラム開発を行う場合、まず、「プロジェクト」というものを作ります。 また、この際、「ソリューション」というものが一緒に作られます。 ここでは、そのプロジェクトの作り方の簡単な紹介と、プロジェクトやソリューションが何なのか、どうして必要なのかを説明します。 概要 Visual Studio で C#...
View ArticleCode-Awareなライブラリ
.NET Compiler Platformによって、Code-Awareなライブラリを作れるようになりました。 Code-Aware、直訳すると「コードを理解している」「コードを意識している」という感じになります。ライブラリだけでなく、ライブラリ利用側のコードを理解して、問題点の指摘やその修正方法まで提供することを言います。 概要 Ver. 6 (C# 6の言語的な機能ではありませんが、C#...
View Articleプロジェクトの分割
プログラムや、プログラムを作るための部品は「プロジェクト」という単位で管理します。 ここでは、プロジェクトという単位に分ける動機などについて説明していきます。 概要 プロジェクト管理で触れたように、プログラムや、プログラムを作るための部品は「プロジェクト」という単位で管理します。 依存関係を考える最小単位がプロジェクト .NETの場合、プロジェクトの成果物は「アセンブリ」(dllもしくはexe)...
View Article型フォワーディング
.NETでは、「アセンブリ+名前」の組み合わせで型を厳密に判定します。 その結果、異なるアセンブリでまったく同じ名前の型を定義しても、それぞれ別の型として扱われます。 これは、人的ミスの削減や、悪意あるコードへの耐性につながる一方で、 型の定義場所を移動させたいときに困ります。 そこで.NETは、型の検索の際に、別のアセンブリに転送する仕組みを提供しています。 これを型フォワーディング(Type...
View Article