Visual C# 2013  パーフェクトマスター 4章 データ演算

[Amazon.co.jp： VisualC#2013ﾊﾟｰﾌｪｸﾄﾏｽﾀｰ (Perfect Master SERIES): 金城 俊哉: 本](http://www.amazon.co.jp/VisualC-2013%EF%BE%8A%EF%BE%9F%EF%BD%B0%EF%BE%8C%EF%BD%AA%EF%BD%B8%EF%BE%84%EF%BE%8F%EF%BD%BD%EF%BE%80%EF%BD%B0-Perfect-Master-SERIES/dp/4798040193)

自分の不明点をとりまとめ。理解できているところは割愛してます。

# 4-2 変数の役割
## 変数の種類
## ローカル変数
メソッドの内部で宣言。宣言を行ったメソッドのみで利用でき、メソッド1回のみ有効。

````c#:
    class Program
    {
        static void Main(string[] args)
        {
            int x = 1;  /// ローカル変数
            Console.WriteLine(x);
        }
    }
````

## フィールド変数
クラス内部で独立して宣言。メンバー変数とも呼ばれる。宣言を行ったクラス内部すべてのメソッドからアクセスでき、クラスや構造体のインスタンスが存在する限り有効。

````c#
    class Program
    {
        class Test
        {
            public int x = 10;  ///  フィールド変数
        }

        static void Main(string[] args)
        {
            Test obj = new Test();
            Console.WriteLine(obj.x);
        }
    }
````

### フィールド変数のアクセス修飾子
アクセス修飾子 | 内容
---- | ----
public |  どこからでもアクセス可
internal | 同一のプログラム内からのアクセスが可
protected | フィールドを宣言した型（クラスorメソッド）と型から派生した型
private | フィールドを宣言した型
protected internal | protectedの範囲にinternalの範囲を加えたスコープ。フィールドを宣言した型から派生した型と同一のプログラム内からのアクセス

# 4-3 定数
## 構文

````c#
const int TAX
````

### 役割
一度セットした値は変更できない

### 定数の種類
ローカル定数とフィールド定数がある。
変数とほぼ同じ。

# 4-4 演算子による演算
## 代入演算子
演算子 | 内容 | 例 | 結果
---- | ---- | ---- | ----
= | 右辺を左辺へ代入 | int x = 5 | 5
+= | 右辺を左辺へ加算して代入 | int x = 5; x += 2 | 7
+= | 右辺を左辺で減算して代入 | int x = 5; x -= 2 | 3

## 連結演算子
演算子 | 内容 | 例 | 結果
---- | ---- | ---- | ----
+ | 文字列の連結 | string x = "hoge"+"fuga" | hogefuga

## 比較演算子
演算子 | 内容 
---- | ---- 
== | 等しい
!= | 等しくない

## 論理演算子
演算子 | 内容 
---- | ---- 
& | and
｜ | or

# 4-5 データ型の変換
## 暗黙的な型変換
下記コードではエラー。byte型同士の演算は演算結果の桁溢れを防止するために自動的にintへ変換される。

````c#
        static void Main(string[] args)
        {
            byte x = 5;
            byte y = 11;
            byte total;

            total = x + y;

            Console.WriteLine(total);
        }
````

 totalをintで宣言する

````c#
        static void Main(string[] args)
        {
            byte x = 5;
            byte y = 11;
            int total;

            total = x + y;

            Console.WriteLine(total);
        }
````

## キャスト
型変換をしながら右辺へ格納。元の変数の型が変わるわけではない。

````c#
long x = 1000;
int y = (int)x;
````

## Convertクラスによる変換
````c#
int price;
price = Convert.ToInt32(textbox1.Text);
```

## 数値から書式指定文字列へ（Formatメソッド）
````C#
            int x = 1000;
            Console.WriteLine(String.Format("{0:#,###}", x));
            /// 1,000
            /// 3桁未満の場合はカンマなし
````

目的 | 書式 | 結果
----| ---- | ----
カンマ | {0:#,###, 3500} | 3,500
0埋め | {0:0000,55} | 0055
スペース埋め | {0:4,55} | 　55 
小数点 | {0:0.000,0.25} | 0.250

# 4-6 組み込み型
あらかじめ陽子されているデータ型

## string型
string型は参照型のため変数に格納されるのはヒープ上の参照領域が格納される。
文字列の追加はインスタンスのコピーを繰り返すので低速になる。

### 繰り返し処理
````C#
        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "";
            for(int i = 0; i < 50000; i++)
            {
                str1 = str1 + "ABCDEFG";
            }
            MessageBox.Show("終了"); /// 数秒           
        }
````

### StringBuilderクラスのAppendメソッド
````C#
        private void button2_Click(object sender, EventArgs e)
        {
            StringBuilder str1 = new StringBuilder();
            for (int i = 0; i < 50000; i++)
            {
                str1.Append("ABCDEFG");
            }
            MessageBox.Show("終了"); /// 一瞬  
        }
````

# 疑問点
* フィールド変数のアクセス修飾子のpublicとineternalの違い