Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
C# 早わかりリファレンス

C# 早わかりリファレンス

C# 基礎文法【6.0対応】 ― 1回完結の最速再入門!
― 1/6ページ: プログラムの実行と制御/型と変数 ―

2016年4月14日

項目を羅列するだけでもかなり長くなってしまうC# 6.0の主要な文法を、実利用者目線でできるだけコンパクトにまとめた。日々のコーディングの「あれ、どう書くんだっけ?」を素早く解決するためのリファレンス。

  • このエントリーをはてなブックマークに追加

 本稿はC#の文法一覧の主要な部分をサンプルコードと一緒に一覧できるために書いたものである。文法の解説などは特に注意するべきことなどに絞っているため、初学者の学習用というよりはある程度C#を知っている方の参考用として書いている。

 今回の記事を書くに当たって、C#言語仕様などを確認していたが、筆者自身初めて知った文法ルールもあった。この内容は全てを覚えるというよりも、C#コードを書いていて気になったときに参考にしてもらえると幸いである。

 今回サンプルコードを手軽に実行できるように、LINQPad用のサンプルコードを下記のリンク先から配布している。無償で利用できるStandard Editionで動作可能である。ぜひLINQPad 5をインストールした上でLINQPad用サンプルコード(MITライセンス)を活用していただきたい。

【参考】LINQPad用のサンプルコードの基本的な使い方と注意点

 LINQPadをインストールすれば、.linqファイルをダブルクリックするだけで、そのファイルがLINQPadで開かれる。その状態で、[Language]欄で「C# Program」を選択して、F5キー(もしくは[Execute]ボタン)を押すだけで実行できる。

 またLINQPadには、ウィンドウ左下にある[Samples]タブの[Download/import more samples]のメニューから直接サンプルコードを取り込む機能がある。上記の3のURLを指定すると、この機能を使ってサンプルコードをまとめてLINQPadに取り込むことが可能である(お勧め)。

 参照するアセンブリやusingでインポートする名前空間は、F4キーを押して(もしくはメニューバーの[Query]-[References and Properties]を選択して)[Query Properties]ダイアログを表示し、そのダイアログ上の[Additional References](アセンブリ参照の追加)タブや[Additional Namespace Imports](名前空間インポートの追加)タブで指定できる。

 LINQPadでは、あらゆるオブジェクトの内容を確認するためのDump()メソッドが提供されており、LINQPad用サンプルコード内では用いているところが多数ある(本稿に掲載しているコード例ではDump()メソッドは省略しており、LINQPad用サンプルコードと少しコードが異なる部分があるので注意してほしい)。

 [この記事の目次と索引(キーワード一覧)]はこちら

プログラムの実行と制御

 この章のサンプルコードは、LINQPad上だと標準出力などの挙動が異なるため、LINQPadのサンプルには載せていない。サンプルを試すには、C#のコンソールアプリとしてプロジェクトを作成されたい。

Mainメソッド標準出力・標準エラー出力

C#
using System;

class Program
{
  static void Main(string[] args)
  {
    // 標準出力。Console.Out.WriteLineも同じ
    Console.WriteLine("こんにちは、C#!");
    // 標準エラー出力
    Console.Error.WriteLine("こんにちは、C#!");
    // Visual Studioからデバッグ実行するときなどは、コンソールウインドウがすぐに閉じるのを防ぐために入力を待つとよい
    Console.ReadLine();
  }
}
リスト1-1 Mainメソッドと標準出力、標準エラー出力

 C#ではエントリポイントと呼ばれるMainメソッドを実行環境が呼び出すことにより、アプリケーションの起動が開始される。エントリポイントとなるMainメソッドは、staticメソッドであり、返り値はvoidもしくはint型、仮パラメーターはなしもしくはstring[]型でなければならない。

 またプロセスからの出力ストリームとして、標準出力標準エラー出力が用意されている。

コマンドライン引数

C#
using System;

class Program
{
  static void Main(string[] args)
  {
    foreach (var arg in args)
    {
      Console.WriteLine(arg);
    }
    Console.ReadLine();
  }
}
リスト1-2 コマンドライン引数

 アプリケーションの実行時に指定されるコマンドライン引数を利用するためには、Mainメソッドにstring[]型の仮パラメーターを指定する。コマンドライン引数が指定されていない場合は空の配列となり、nullにはならない。

 また、Visual Studioでデバッグ実行する場合は、プロジェクトのプロパティを開き、デバッグの開始オプションのコマンドライン引数を指定する(図1)。

図1 Visual Studioのオプションで、デバッグ時のコマンドライン引数を指定する

標準入力の読み取り

C#
using System;

class Program
{
  static void Main(string[] args)
  {
    var input = Console.ReadLine();
    Console.WriteLine(input);
    Console.ReadLine();
  }
}
リスト1-3 標準入力の読み取り

 標準入力から入力された文字列を読み取ることができる。

プログラムの終了とステータスコード

C#
using System;

class Program
{
  static void Main(string[] args)
  {
    Environment.Exit(1);
  }
}
リスト1-4 Environment.Exitメソッドによるステータスコードを指定した終了
C#
class Program
{
  static int Main(string[] args)
  {
    return 1;
  }
}
リスト1-5 Mainメソッドの返り値でステータスコードを指定

 実行しているプロセスを終了した際のステータスコードを指定できる。指定せずに終了した場合のステータスコードは0であり、これは正常に完了したことを意味する。明示的に指定する場合はEnvironment.Exitメソッドの引数として指定するか、Mainメソッドの返り値として指定できる。なお、Environment.Exitメソッドを実行すると、その時点で実行中のプロセスは終了する。

型と変数

組み込み型リテラル表記

C#
class Program
{
  static void Main(string[] args)
  {
    // bool型
    var flg1 = true;
    var flg2 = false;

    // int/uint/long/ulongのうち表現できる最初の型。この場合はint型
    var int1 = 1;
    // uまたはUサフィックスを付けた場合はuintもしくはulongのうち表現できる最初の型。この場合はuint型
    var int2 = 1U;
    // lまたはLサフィックスを付けた場合はlongもしくはulongのうち表現できる最初の型。この場合はuint型
    var int3 = 1L;
    // ulもしくはULサフィックスを付けた場合はulong型
    var int4 = 1UL;

    // 単精度浮動小数点
    var number1 = 1f;
    // 指数表記
    var number2 = 1.2e-3f;
    // 倍精度浮動小数点
    var number3 = 1.2d;
    // 指数表記
    var number4 = 1.2e-3d;
    // 高精度小数(decimal型)
    var number5 = 0.1m;

    // char型
    var char1 = '1';
    var char2 = '\'';
    var char3 = '\xFFFF';
  }
}
リスト2-1 値型のリテラル表記

 C#では値型参照型という2種類の型をサポートしている。そのうち、値型のいくつかはリテラル(=ソースコード上に直接記述した数値や文字列)で値を表現できる。

 整数型の場合、指定した数値が表現できる型(int型であれば–2147483648から2147483647まで、long型であれば–9223372036854775808から9223372036854775807まで、など)によってどの型のリテラル表現になるかが決まる。

 浮動小数点表記の場合、指定したリテラルが表現可能な精度より高い精度を指定している場合は四捨五入される。decimal型は28~29桁の有効精度を持っており、10の累乗でスケールされた整数として表現している。そのため、float型やdouble型では無限小数となるような0.1といった値を正確に表現できる。

 char型は整数型と同じ分類になるが、Unicode文字セットに属する文字を表現するのに利用する。\xでエスケープすることで、Unicodeのコード値でリテラル表記できる。

文字列リテラル逐語的リテラル文字列

C#
class Program
{
  static void Main(string[] args)
  {
    var str01 = "Hello World";   // 文字列リテラル
    var str02 = @"Hello World";  // 逐語的リテラル文字列

    var str03 = "Hello \t World";   // Hello  World
    var str04 = @"Hello \t World";  // Hello \t World

    var str05 = "\"Hello\" World";  // "Hello" World
    var str06 = @"""Hello"" World"; // "Hello" World

    var str07 = "C:\\tmp\\log.txt"; // C:\tmp\log.txt
    var str08 = @"C:\tmp\log.txt";  // C:\tmp\log.txt

    var str09 = "Hello\r\nWorld";
    var str10 = @"Hello
World";
  }
}
リスト2-2 文字列リテラルと逐語的リテラル文字列

 C#では文字列リテラルを二重引用符"でくくって表現する。二重引用符そのものやタブや改行といった一部の制御文字は円記号\でエスケープして表現する。

 一方、二重引用符の前に@を付加した逐語的リテラル文字列では改行や空白などの二重引用符以外の全ての文字を逐語的に(=一語一語、忠実に)解釈する。

文字列補間

C#
using System;

lass Program
{
  static void Main(string[] args)
  {
    var name = "テスト";
    var s1 = $@"名前は
{name}";

    var s2 = $"Now: {DateTime.Now:f}";
  }
}
リスト2-3 文字列補間

 C# 6.0で文字列補間という機能が導入された。今までstring.Formatメソッドで記述していたフォーマット文字列をリテラルに近い記法で記述できるようになった。逐語的文字列と組み合わせたり、書式を指定したりすることも可能だ。

配列

C#
using System.Collections.Generic;

class Program
{
  static void Main(string[] args)
  {
    // 要素数を指定して配列を初期化
    var array1 = new int[2];
    // 要素を指定して配列を初期化
    var array2 = new[] { 1, 2, 3 };
    // プロパティ、フィールドなど左辺に型を記述する場合、new[]は不要
    double[] array3 = { 1d, 2.3d };
    // 配列はIList<T>を実装している
    IList<string> list3 = new[] { "A", "B" };
    // 2次元配列
    var array5 = new[,] { { 1, 2 }, { 3, 4 } };
    // 配列の配列
    var array6 = new[] { new[] { 1, 3, 5 }, new[] { 2, 4, 6, 8 } };
  }
}
リスト2-4 配列

 配列は、配列の長さを指定する方法と、要素自体を指定する方法で生成できる。要素数を指定した場合、各要素は配列要素に指定した型のデフォルト値で初期化される。また、配列T[]IList<T>インターフェースを実装している。

 C#では多次元配列と、配列の配列(=ジャグ配列とも呼ばれる)は別のものだ。配列の配列の各要素は次元や長さが異なっていても構わない。

C# 早わかりリファレンス
1. 【現在、表示中】≫ C# 基礎文法【6.0対応】 ― 1回完結の最速再入門!

項目を羅列するだけでもかなり長くなってしまうC# 6.0の主要な文法を、実利用者目線でできるだけコンパクトにまとめた。日々のコーディングの「あれ、どう書くんだっけ?」を素早く解決するためのリファレンス。

C# 早わかりリファレンス
2. C# 基礎文法 最速再入門【7.0対応】

「あれ、どう書くんだっけ?」を素早く解決するための、C# 7.0主要文法がコンパクトにまとまったリファレンス(全3回)。前編では、C#の歴史/開発ツール/プログラムの実行と制御/型と変数/演算子/ステートメントを説明する。

C# 早わかりリファレンス
3. C# クラスの基本機能 最速再入門【7.0対応】

C# 7.0主要文法がコンパクトにまとまったリファレンス(全3回)。中編では、名前空間/クラス/メソッド/プロパティ/イベント/インデクサー/演算子オーバーロード/コンストラクターとデストラクターを説明する。

C# 早わかりリファレンス
4. C# タプル/ローカル関数/ラムダ式/非同期処理/例外処理 最速再入門【7.0対応】

C# 7.0主要文法がコンパクトにまとまったリファレンス(全3回)。後編では、タプルと分解(デコンストラクション)/ローカル関数/構造体/継承とインターフェース/列挙型/イテレーター/例外処理/リソースの解放/ラムダ式/非同期処理(async/await)を説明する。

サイトからのお知らせ

Twitterでつぶやこう!