C Sharp/変数

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

変数の宣言[編集]

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#のデータ型の一部です。それぞれが特定の種類のデータを表し、異なる範囲や精度を持っています。

文字列変数の使い方[編集]

下記にコード例を示す。

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#にはさまざまな算術演算子があります。以下に、それらの使用例と解説を示します。

using System;

class ArithmeticOperatorsExample
{
    static void Main()
    {
        // 加算演算子
        int sum1 = 5 + 3; // 5 + 3 = 8
        Console.WriteLine("Sum: " + sum1); // 出力: Sum: 8

        // 減算演算子
        int difference = 10 - 4; // 10 - 4 = 6
        Console.WriteLine("Difference: " + difference); // 出力: Difference: 6

        // 乗算演算子
        int product = 7 * 3; // 7 * 3 = 21
        Console.WriteLine("Product: " + product); // 出力: Product: 21

        // 除算演算子
        double quotient = 15.0 / 4.0; // 15.0 / 4.0 = 3.75
        Console.WriteLine("Quotient: " + quotient); // 出力: Quotient: 3.75

        // 剰余演算子
        int remainder = 10 % 3; // 10 ÷ 3 の余り = 1
        Console.WriteLine("Remainder: " + remainder); // 出力: Remainder: 1
    }
}

このコードは、加算、減算、乗算、除算、剰余の各演算子を使って計算を行い、結果をコンソールに出力しています。 それぞれの演算子は、計算式内で直接使用されており、その結果がコンソールに表示されています。

文字列と演算子

C#では文字列に算術演算子を直接適用することはできませんが、文字列結合演算子 + を使用して文字列の連結を行うことができます。文字列結合演算子 + は、文字列同士を連結する際に使用されます。以下は、その例です。

using System;

class StringConcatenationExample
{
    static void Main()
    {
        string firstName = "John";
        string lastName = "Doe";

        // 文字列結合演算子 + を使って文字列を連結
        string fullName = firstName + " " + lastName; // "John Doe"
        Console.WriteLine("Full Name: " + fullName); // 出力: Full Name: John Doe

        // 文字列と数値を連結する場合
        int age = 30;
        string message = "My name is " + fullName + " and I am " + age + " years old.";
        Console.WriteLine(message); // 出力: My name is John Doe and I am 30 years old.
    }
}

このコード例では、+ 演算子を使用して、firstNamelastName の文字列を連結して fullName 変数に格納し、それをコンソールに表示しています。また、文字列と数値を連結して message 変数に格納し、それをコンソールに表示しています。文字列結合演算子 + を使用することで、異なる文字列や変数を連結して新しい文字列を作成することができます。

値型と参照型[編集]

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 は同じ配列を参照しているためです。

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

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

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

例えば:

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

C#における代入

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

例えば:x = 5;

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