情報応用演習Ⅰ(2024)

C#の機能の追補

ASP.NET Core などの最新の技術を学ぶにあたって,C#の機能について再確認,あるいは理解を更新しておくべきいくつかの部分がある. 特に2年次までのプログラミング科目では学んでいない技術要素もあるため本節の内容は必読である.

本節では以下の3つのC#の機能について紹介する.

一部は2年次までのプログラミングの科目で紹介済みのものもあるが,追加の説明も含まれているためよく読んで理解すること.

トップレベルステートメント

.NET 6.0以降では「コンソールアプリケーション」を作成したときの Program.cs ファイルの書き方が変更されている. _はプロジェクト作成時に,「最上位レベルのステートメントを使用しない」にチェックを入れた場合と入れない場合の Program.cs の記述例である.

新旧のProgram.csの比較

_を見ると分かるように,「最上位レベルのステートメントを使用しない」にチェックを入れない場合はProgramクラスやMain()メソッドのシグネチャが 一切現れていないことが分かるだろう._のような従来の Program.cs ファイルにはProgramクラスが定義されており,この中にMain()という 名前の静的メソッドが定義されていた.このMain()メソッドに書かれた処理がそのアプリケーションのエントリーポイント, すなわちプログラムを起動したときに実行される処理となっていた.

これは トップレベルステートメント と呼ばれる,Program.cs ファイルにMain()メソッドの中身だけを直接書ける 機能である(_).

Program.csの書き方の違い

なお,トップレベルステートメントを使用している場合,ProgramクラスやMain()メソッドの記述は現れていないが,内部的には これらのクラスやメソッドが定義されているものとして扱われている.

新しいNull許容/非許容型

.NET 6.0以降では,Null許容/非許容の考え方が変更されている.従来の(値型の)Null許容型についてはプログラミング演習Ⅲ(2023;金澤クラス)第05回を参照せよ.

.NET 6.0以降のデフォルトの設定では,すべての値型はもちろんのこと参照型も明示的に指定しない限りNull非許容,つまりはnullを代入できなくなった. このため値型のNull許容型と同様に,参照型にも「Null許容参照型」 という概念が追加された.これは C# 8.0 (2019)で導入された機能である.参照型の場合もnullを代入させる必要がある場合は,型名に?をつける必要がある. _はNull許容/非許容参照型の例である.

Null許容/非許容参照型の例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//
// Null ** 非許容 ** な string 型の変数 hoge
//
string hoge = "Hello, World!"; // これは従来なら null が代入可能な型だが,
                               // .NET 6.0 移行では null 非許容な型となる.

//
// Null ** 許容 ** な string 型の変数 piyo
//
string? piyo = null;           // 従来の参照型も null を代入する必要がある
                               // 場合は,型名に ? をつける必要がある.

if ( piyo != null )            // Null許容の値型と異なり .HasValue プロパティや
{                              // .Value プロパティはないので,従来の参照型と
    // ..何か処理..            // 同じ方法で null かどうかのチェックはできる.
    
    hoge = piyo;               // ここでNull非許容である変数 hoge に,
                               // Null許容型の変数 piyo の値を代入しているが
                               // 文脈から変数 piyo は null ではないのでエラーとはならない.
}//if

hoge = piyo;                   // いっぽうこちらは警告またはエラーとなる.
                               // こちらは文脈から変数 piyo が null である可能性があるため,
                               // 代入するには null でないことを保証するか,次の代入文のようにする.

hoge = piyo!;                  // Null許容である変数 piyo の値が null ではないことが
                               // 保証できるばあいに,その値をNull非許容な変数に代入したい場合は
                               // その式に ! (null免除演算子) をつける.

LINQ

LINQは,正式には統合言語クエリ(Language Integrated Query)と呼ばれる, コレクションに対する操作をSQL風に,しかもC#のソースコード内に直接書くことができる機能であり, C# 3.0(2007)で導入された.

たとえばあるリストに格納されたオブジェクトのうち,条件に合うものだけに何か処理を行う場合, 従来は_のように明示的なループを記述する必要があった.

従来の絞り込み処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
List<Hoge> list = /* 何らかのオブジェクトのリスト */;

// 絞り込み処理
foreach(var hg in list)
{
    if ( hg.Foo >= 10 ) // 絞り込み条件
    {
        // 何か処理
    }//if
}//foreach 

これをLINQを用いて実装すると_のようになる.

LINQを用いた絞り込み処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
List<Hoge> list = /* 何らかのオブジェクトのリスト */;

var query =    from hg in list
              where hg.Foo >= 10 // 絞り込み条件
             select hg;

foreach(var hg in query)
{
    // 何か処理
}//foreach 

3~5行目にひっくり返したSQLのSELECT文のようなものがあるが,これがLINQの記述例である. ここでは絞り込み(関係代数的には「選択」の操作)しか行っていないが,order byキーワードを使って結果をソートしたり, selectの部分に何らかの生成式を書いてコレクションを別の型のコレクションに変換したり, といったことも可能である.

後述するC#でのデータベースへのアクセス方法の一つであるEntity Framework Coreは,この技術を応用しており この方法で記述したコレクション操作からSQL文を自動生成してデータベースサーバへの通信が行われるようになっている.

Last updated on 2024-04-26
Published on 2024-04-26

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.