変数の宣言編集

型推論 var編集

変数を宣言する際、初期値を省略せずに型名を varをすると、初期値から自動的に型が決定されます。

using System;

public class sample {
  public static void Main(string[] args) {
    var a = 4;    
    Console.WriteLine(a); 
    Console.WriteLine( a.GetType() );
    
    var b = "hello";    
    Console.WriteLine(b); 
    Console.WriteLine( b.GetType() );
    
    var c = 1.52;    
    Console.WriteLine(c); 
    Console.WriteLine( c.GetType() );
    
    var d = "w";    
    Console.WriteLine(d); 
    Console.WriteLine( d.GetType() );
  }
}
実行結果
4
System.Int32
hello
System.String
1.52
System.Double
w
System.String

C#9 以降、下記のようにアプリケーションを表すクラスやMainメソッドを省略した簡略的な表記が使用できます。

    var a = 4;    
    Console.WriteLine(a); 
    Console.WriteLine( a.GetType() );
    
    var b = "hello";    
    Console.WriteLine(b); 
    Console.WriteLine( b.GetType() );
    
    var c = 1.52;    
    Console.WriteLine(c); 
    Console.WriteLine( c.GetType() );
    
    var d = "w";    
    Console.WriteLine(d); 
    Console.WriteLine( d.GetType() );

初期値のない状態でvarキーワードを使うとエラーになり、コンパイルできません。

error CS0818: An implicitly typed local variable declarator must include an initializer

エラー・コード CS0818: 暗黙のうちに型付けされたローカル変数の宣言子には、イニシャライザーを含める必要があります。

あるオブジェクトの型を取得するには、そのオブジェクトから .GetType() メソッドを使います。あるオブジェクトを指定してメソッドを使うには、オブジェクト名.メソッド名()の表記で実行します。

似たようなメソッドとして typeof() というのがありますが、これはクラスに対して用いるものと、記法が異なるので、このセクションでのtypeofの説明は省略します。<!ーーをぃをぃーー>

var は型を右辺から推論してくれますが、しかし、いちどある変数の型が指定されたら、C#では、その変数の型は変更できません。

型を指定した宣言編集

また、変数はvarを使わずに、以下のようにC言語と同じ従来の記法で宣言することも可能です。

using System;

public class sample {
  public static void Main(string[] args) {
    int a  = 17;

    Console.WriteLine(a); 
    Console.WriteLine( a.GetType() );
  }
}
実行結果
17
System.Int32

int は System.Int32 と同じです。intは英語の整数integerの省略形です.

C#では、変数の型を宣言後に変更することはできません。他の動的プログラミング言語では、宣言時に数値が代入された変数に後から文字列を代入することが可能ですが、C#では不可能です。

C#で宣言される変数は、原則として何らかのクラスに属していなければなりません。C++のようにクラス宣言のないコードの先頭で変数を宣言すると、エラーが発生し、コードはコンパイルされない。

// エラーになる
using System;

var a = 4; // 変数宣言がクラスに包まれていないのでエラーになる。   

public class sample {
  public static void Main(string[] args) {
    Console.WriteLine(a); 
  }
}
実行結果
エラーになりコンパイル不可


この仕様は、C#やそのモデルであるJavaが採用した「カプセル化」などの概念を明確にしたものであり、本質的な仕様であると思われる。 「カプセル化』という概念は、1990年から2001年にかけて流行した概念で、プログラムの部品を裸の部品として管理するのではなく、『カプセル』と呼ばれるグループにモジュール化してパッケージ化して管理することで、大規模開発の効率化を図ろうというものです。

つまり、C#には、C言語でいうところの「グローバル変数」は無い。開発元のマイクロソフトの公式ドキュメントでも、そう明言されていますMicrosoft Docs 日本語訳『C# のクラス、構造体、レコードの概要』2022/06/10 (2022年6月18日に確認)。

これはつまりC#では、すべての変数は、Javaと同じ様になんらかのクラスに属するメンバです。

もしC#でどこからもアクセスしたい変数を定義したい場合は(ただし同じソースコードファイル内)、下記コードのように単に public class でクラス宣言しておいて、必要に応じてクラス内の変数宣言で static 修飾子をつけて宣言すればいいだけである。

using System;

// このクラス testval がどこからでもアクセスできて書換え可能
public class testval{
    public static int a = 3;   
    public static int b =15;   
}

public class sample {
  public static void Main(string[] args) {
    Console.WriteLine(testval.a); 

    testval.a = 203;
    testval.b = 215;
    
    Console.WriteLine(testval.a); 
  }
}
実行結果
3
203


上記のような、どこからでもアクセスできるstatic変数をどう使うかについては、初心者には高度なので、クラスの節で別途に説明する。

別ファイルからのアクセスについては、初心者レベルを越えるので、当面の間、説明は省略する。

また、クラス側では変数宣言 var は不要です。新しく定義したクラス内で var で型推論をしようとするとエラーになります。

下記のように、「ローカル変数でないものをvarで宣言するな」(意訳)とコンパイラに叱られます。

test.cs(5,19): error CS0825: The contextual keyword `var' may only appear within a local variable declaration
−−−−
test.cs(5,19): error CS0825:コンテキストキーワード `var' はローカル変数宣言の中でのみ使用可能です。

このように、varには、型推論のほかにも、色々な意味があります。ローカル変数とはメソッド内(C言語でいう「関数」内)で定義されている変数のことです。

つまり、C++でいうところの、なんらかの「関数」内でないと(C#でいう「メソッド」内でないと)、varは使えません。

よく分からなければ、どこからでも出来るグローバル変数的なものをC#で作りたい場合、初心者のうちは、Main 関数内で変数宣言すれば、基本的に同じコードファイル中のどこからでもアクセスできるはずです。

グローバル変数的な管理用の public class などを別途に作るのは、慣れてきてからで十分です。

C++などと比べて一見すると面倒そうですし実際に初心者にとっての障壁のひとつですが、C#ではグローバル変数的にどこからでもアクセスできる変数を必要に応じてクラスでグループ化できるという、C++や標準Cにはない利点もあります。

定数の宣言編集

書換え不能な変数を「定数」と言います。

値が変化しないのに「変数」というのも妙ですが、歴史的にそう言うのと、他によい言い回しがないので、そういうものだと割り切ってください。

C#で 定数を宣言するには const キーワードを使います。(C++ や 標準C と同じです。)

var と const は併用できません。

const int a のように型指定(int の部分)といっしょに const を宣言することで使えます。

using System;

public class sample {
  public static void Main(string[] args) {
    const int a = 4;
    Console.WriteLine(a);

    // a = 7; // const変数を書換えようとしているので、コメントアウトしないとエラー
  }
}
実行結果
4

もし、上記コードからconstのキーワード部分を消せば、コメントアウトした a = 7; をコメントアウトしなくても実行できるようになります。読者はそれぞれ試してください(ほぼ同じ内容の繰り返しになるので、説明は省略)。

変数の型編集

変数の型の種類については、詳しくはMicrsoft Doc の公式サイトにあります。

変数の型のうち、初心者がよく使いそうなものをあげると、

数値の型には、

整数型 int
浮動小数点型 float , double , decimal

があります。

『浮動小数点数値型 (C# リファレンス)』2022/04/06

float と double の違いは、有効桁数です。 double のほうが桁数が多いのでリッチです。

decimal は、精度を重視した小数点型です。結果的にdecimal の有効桁数もfloat やdouble よりも多いですが(Microsoft Doc 公式より)、それは派生的な結果です。


文字列の型には、主に

文字列型 string

があります。

文字列変数の使い方編集

下記にコード例を示す。

using System;

public class sample {
  public static void Main(string[] args) {

    string a = "good morning";
    Console.WriteLine(a);

  }
}
実行結果
good morning


上記のように、string型の変数は、二重引用符 " で囲まれた文字列をあつかう。

文字表示などの際には、単に Console.WriteLine(変数名); とすればいいだけである。

writeLineにおける文字列と数値変数との連結の方法については、別のページで紹介しているので、そちらを参照せよ。ネット検索などを探す場合は「フォーマット指定」などの語句で探せば見つかるだろう。


代入編集

C#に於いて等号=は「代入(だいにゅう)」の意味であり、「右辺のものを左辺に代入せよ」の意味です。

なので、たとえばa = a + 1のようなものも可能です。たとえばaの初期値が4なら、「4を+1した結果である5を、aに代入しろ」という意味です。

コード例

using System;

public class sample {
  public static void Main(string[] args) {

    var a = 4;    
    Console.WriteLine(a); 
    
    a = a + 1;
    Console.WriteLine(a); 
     
  }
}
実行結果
4
5

算術演算子編集

C# にかぎらず、プログラミング一般では、整数型に対する算術演算子は、下記のとおりです。

+ は 足し算(加算)

- は 引き算(減算)

* は 掛け算(積)

/ は 割り算の商

% は 割り算の余り


なお、文字列に対しては、演算子の結果が違ってきます。上記の説明はあくまで整数変数の場合です。


コード例

using System;

public class sample {
  public static void Main(string[] args) {

    int a = 6;    
    Console.WriteLine(a);  // そのまま6
    
    Console.WriteLine(a+1); // 和 7
    
    Console.WriteLine(a-1); // 引き算の結果
    
    Console.WriteLine(a*2); // 掛け算
    
    Console.WriteLine(a/2); // 整数の範囲での割り算の商
    
    Console.WriteLine(a%2); // 割り算の余り
    
  }
}
実行結果
6
7
5
12
3
0