C Sharp/変数

出典: フリー教科書『ウィキブックス(Wikibooks)』

変数[編集]

C#における変数は、データを格納するためのメモリ上の場所を指し示す名前付きの場所です。変数は、異なる種類のデータを格納できるように設定され、そのデータは実行時に変更されることができます。

C#で変数を使用する際には、次のような特徴があります:

  1. データの格納: 変数は、整数、浮動小数点数、文字列、真偽値など、様々なタイプのデータを格納するために使用されます。
  2. 型の指定: C#では変数は静的型付け言語です。変数を宣言する際に、その変数が保持するデータの種類を指定する必要があります。例えば、int型の変数やstring型の変数などです。
  3. メモリ上の場所への参照: 変数はメモリ内の特定の場所を参照します。これにより、その場所に格納されたデータにアクセスできます。
  4. 値の変更: 変数には値を代入することができ、値は実行時に変更することができます。これにより、同じ変数に異なる値を割り当てたり、変数の内容を更新したりできます。

例えば、次のように変数を宣言し、値を代入することができます。

int number; // int型の変数を宣言
number = 10; // 変数に値を代入

string message = "Hello"; // string型の変数を宣言と同時に初期化

ここでnumbermessageはそれぞれint型とstring型の変数です。それぞれの変数には対応する型のデータを格納できます。

数学における代入とC#における代入の違い
数学とプログラミングにおける代入にはいくつかの重要な違いがあります。
数学における代入

数学では、代入は等号()を使って値を変数に割り当てる操作を指します。例えば、代数方程式の解を求める際には変数に値を代入して計算を行います。数学的な代入は、値の置き換えを意味し、変数に新しい値を割り当てます。また、数学における等号は左辺と右辺が等しいことを示すものです。

例えば:

これは、数学的な文脈では を代入するという意味であり、 は等しいという関係を表します。

C#における代入

C#や他のプログラミング言語における代入は、変数に値を割り当てる操作を示します。C#では等号(=)を使って変数に値を代入しますが、この等号は数学の等号とは異なります。C#の代入は、右辺の値を計算し、それを左辺の変数に割り当てることを意味します。これは変数に新しい値を設定するものであり、等号は「右辺の値を左辺の変数に代入する」という意味です。

例えば:x = 5;

このC#のコードでは、変数 x に値 5 を代入しています。これは、x5 という値を割り当てる操作であり、x5 は等しいわけではありません。代入は単なる値の割り当てであり、数学の等号とは異なる概念です。


変数の宣言[編集]

C#における変数の宣言にはいくつかの方法があります。主な方法としては以下の通りです:

  1. 明示的な型宣言:
    int age = 25;
    string name = "John";
    
  2. 複数の変数宣言:
    int a, b, c; // 複数の変数を同じ型で宣言
    int x = 10, y = 20, z = 30; // 初期値を指定して複数の変数を宣言
    
  3. 型推論 (var):
    var number = 10; // 推論された型: int
    var message = "Hello, World!"; // 推論された型: string
    
  4. 定数 (const):
    const int gravity = 9.81; // 定数の宣言
    
  5. 読み取り専用 (readonly):
    readonly int daysInWeek = 7; // 読み取り専用の宣言(実行時に値を変更できない)
    
  6. 動的型 (dynamic):
    dynamic dynamicVariable = "This can hold any type of value"; // 動的型の宣言
    
  7. 配列の宣言:
    int[] numbers = new int[5]; // 長さ5のint型配列の宣言
    string[] names = { "Alice", "Bob", "Charlie" }; // 初期値を指定した配列の宣言
    
  8. null 許容型 (Nullable<T>):
    int? nullableInteger = null; // null 許容型の宣言
    
  9. タプルの宣言:
    (string, int) person = ("Alice", 30); // タプルの宣言
    
  10. メソッド内の変数の初期化:
    void SomeMethod() {
        int localVar; // 初期化されていない変数の宣言
        localVar = 5; // 後から値を代入
    }
    

これらの方法を組み合わせて、C#で様々な型の変数を宣言することができます。 それぞれの方法には使いどころがありますので、状況に応じて最適なものを選択することが重要です。

変数の型[編集]

C#の主要なデータ型
データ型 説明 リテラル表現
int 整数値 10, -5
float 単精度浮動小数点数 3.14f, -0.5f
double 倍精度浮動小数点数 3.14, -0.5
bool 真偽値 true, false
char 16 ビット Unicode 文字 'a', 'B', '&'
string 文字列 "Hello", "123"
decimal 28-29 桁の高精度浮動小数点数 3.14159m
byte 8 ビット符号なし整数を表す 0, 255
short 16 ビット整数を表す -32768, 32767
long 64 ビット整数を表す -9223372036854775808, 9223372036854775807
ushort 16 ビット符号なし整数を表す 0, 65535
uint 32 ビット符号なし整数を表す 0, 4294967295
ulong 64 ビット符号なし整数を表す 0, 18446744073709551615

これは一般的なC#のデータ型の一部です。それぞれが特定の種類のデータを表し、異なる範囲や精度を持っています。

変数の値の参照[編集]

C#のプログラムで変数の値を使用するには、その変数を適切に宣言し、必要な箇所で参照します。変数の値は、他の変数に代入するだけでなく、数値計算、条件分岐、ループ、メソッドの呼び出し、およびさまざまな操作に使用されます。

以下は、変数の値を使用するいくつかの例です:

変数を出力する
int number = 42;
Console.WriteLine(number); // コンソールに変数numberの値を表示する
変数を計算に使用する
int a = 5;
int b = 7;
int sum = a + b; // aとbの値を足してsumに代入する
条件分岐に変数を使用する
int age = 25;
if (age >= 18) {
    Console.WriteLine("成人です");
} else {
    Console.WriteLine("未成年です");
}
変数をループで使用する
int limit = 5;
for (int i = 0; i < limit; i++) {
    Console.WriteLine(i); // 0からlimit未満の数を表示する
}

これらは基本的な使用例です。変数の値は、プログラム内で必要な場所で参照され、計算や制御フロー、出力など様々な処理に活用されます。

値型と参照型[編集]

C#における値型と参照型は、異なる振る舞いをする2つの基本的な型です。

値型 (Value Type)[編集]

値型は、変数が実際の値を直接保持します。変数自体がその値を含んでおり、スタックメモリ内に直接値が格納されます。値型の変数同士はそれぞれの値を保持し、一方の変数の変更が他の変数には影響を与えません。整数、浮動小数点数、構造体 (struct) などが値型の例です。

int x = 5; // xは値型の変数で、値として5を保持しています
int y = x; // yにxの値がコピーされます
x = 10; // xの値を変更しても、yの値は変わりません
Console.WriteLine(x); // 10
Console.WriteLine(y); // 5

参照型 (Reference Type):[編集]

参照型は、変数が実際の値の場所(メモリ上のアドレス)を保持します。変数自体が実際の値を直接保持せず、ヒープメモリ上にデータが格納されたオブジェクトを指し示します。参照型の変数同士は同じオブジェクトを参照しているため、一方の変数でオブジェクトを変更すると、他の変数も同じ変更内容を参照します。クラス、配列、インターフェースなどが参照型の例です。

このように、値型と参照型は、変数がデータを保持する方法において異なります。値型は値自体を保持し、参照型は値の場所を指し示します。それぞれの特性を理解することで、プログラムの振る舞いやメモリ管理についてより良い理解が得られます。

int[] arr1 = new int[] { 1, 2, 3 }; // arr1は参照型の変数で、int型の配列を参照しています
int[] arr2 = arr1; // arr2も同じ配列を参照します
arr1[0] = 5; // arr1の配列の要素を変更すると、arr2も同じ変更内容を参照します
Console.WriteLine(arr1[0]); // 5
Console.WriteLine(arr2[0]); // 5
まとめ

C#の値型と参照型の主な差異をまとめると以下の通りです:

値型 (Value Type)
データの保存方法: 値型は実際の値を直接保持します。変数はその値そのものを持ち、スタックメモリ内に値が格納されます。
メモリ上の配置: スタックメモリに保存されるため、直接的な値のコピーが行われます。
独立性: 値型の変数同士は個別の値を保持し、一方の変数の変更が他の変数には影響を与えません。
参照型 (Reference Type)
データの保存方法: 参照型は実際の値の場所(メモリ上のアドレス)を保持します。変数は値の場所を指し示し、ヒープメモリ上にデータが格納されたオブジェクトを参照します。
メモリ上の配置: ヒープメモリに保存されるため、変数は実際の値を直接持たず、値の場所を示すポインタのような役割を果たします。
共有性: 参照型の変数同士は同じオブジェクトを参照するため、一方の変数でオブジェクトを変更すると、他の変数も同じ変更内容を参照します。

このように、値型と参照型はメモリ内でのデータの保存方法や変数の振る舞いにおいて異なります。値型は値そのものを保持し、参照型は値の場所を指し示します。それぞれの特性を理解することで、プログラムの動作やメモリ管理をより効果的に行うことができます。

代入[編集]

値型と参照型の違いは、変数に値を代入する際の振る舞いに影響を与えます。

値型 (Value Type):[編集]

値型の場合、変数への代入は値そのものをコピーすることを意味します。つまり、値型の変数に新しい値を代入すると、その値が変数に直接コピーされます。この際、元の値と変数との間には別々のデータが存在し、それらは独立しています。

例えば、以下のような場合:

int x = 5; // xには値として5が代入されます
int y = x; // yにはxの値がコピーされます
x = 10; // xの値を変更しても、yの値には影響しません

この場合、x の値を変更しても y の値には影響がないため、互いに独立しています。

参照型 (Reference Type):[編集]

参照型の場合、変数への代入はその値の場所(メモリ上のアドレス)を示すことを意味します。変数は実際の値を直接持たず、その値の場所を指し示します。そのため、参照型の変数同士は同じオブジェクトを参照しています。

例えば、以下のような場合:

int[] arr1 = new int[] { 1, 2, 3 }; // arr1には配列が作成されその場所を指す参照が代入されます
int[] arr2 = arr1; // arr2も同じ配列を参照します
arr1[0] = 5; // arr1の配列の要素を変更すると、arr2も同じ変更内容を参照します

ここで arr1 の要素を変更すると、arr2 も同じ変更内容を参照します。なぜならば、arr1arr2 は同じ配列を参照しているためです。

値型と参照型の代入における違いは、変数同士の値やデータの扱い方に関連しています。値型では値のコピーが行われ、参照型では値の場所を指し示すことにより、同じオブジェクトを参照します。