用語・データ型・if文(一週目の学習)

<font color="limegreen">モチベーションも大事だと思うので覚書として使用します。
一週目は、北米Amazonで購入した英字キーボードのレジストリ設定に始まり、
コードは一行読むのに20分かかっていたのが、10分、3分今は何も見ずある程度理解できてきた。
実際の型の使い方を覚え書くようになると、子供の頃ハッカー気分でカタカタ遊んでたのを思いだした…

<details><summary><b>1.styleと原則</summary><div>
<b>1.可読性
2.保守性
3.開発効率
4.美しさ</b>
[プログラマが知るべき97のこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E7%BE%8E%E3%81%AF%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%95%E3%81%AB%E5%AE%BF%E3%82%8B/)
<br>

①読みやすくPascal形式(クラス名プロパティ名メソッド名構造体等)BackColor や FormBorderStyle 
②但し3つはcamel形式使う。(パラメータ、public以外のフィールド、ローカル変数)backColor や formBorderStyle 
③表記ブレ防ぐjpeg, jpg,  message, msg,  win, windows
④桁位置合わせ スペースうまく使って=をあわせる
⑤変数とループにもスタイルがある(ｸﾗｽのﾒﾝﾊﾞ変数=フィールド。
C++ プログラマはメンバ変数に "m_" を付ける習慣がありますが、
フィールドをあらわすFを付けることをすすめます。というのはm_の2文字よりコンパクトになる)
⑥xxxManager / xxxControllerとかの説明系は長い
⑦get / setはプロパティで使うから、代わりにload, save, add等を使う。
checkは意味が広すぎて何してるか分からないから具体的にisNull, isEmpty
テスターに遭遇した場合
<div>
>テスト担当者たちは、プログラマの敵ではなく「友人」であると私は言いたいです。
彼らは、取るに足りないと思えるような問題を逐一指摘してくるかもしれません。
それで「恥をかかされた」と思う人もいるでしょう。
しかし、些細に思える問題でも社内で解決しておけば、
顧客や投資家はその問題に煩わされずに済みます。
そうすれば、あなたは恥をかくどころか、顧客や投資家から高く評価されるでしょう。

[プログラマが知るべき97のこと](https://bit.ly/2MO2Zbo)
[暇な時読むよく使う英単語](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)
</div></details></div></details>



<details><summary><b>2.オブジェクト指向</summary>
明確な答えはない、効率的な<font color="Red">モノ作り</font>をするための思考と解釈。
ﾌﾟﾛｸﾞﾗﾐﾝｸﾞの変数やそのプロパティ、その継承も効率的なモノ作りのためです。
(説明しろと言われたらそう答えたい)
<div>
>概念を理解するためには、オブジェクト指向があると何が便利になるのかをおさえること。
構造体と関数があって、この構造体と関数はセットみたいなもんだから一緒にまとめられると便利だ→クラス
クラスの中の変数へのアクセスを制限できると便利だ→カプセル化
１つのクラスから、追加したい差分を定義することによってクラスを定義できると便利だ→継承
継承したクラスは、親クラスと同じように扱えると便利だ。
継承したクラスの関数は親クラスのものと処理が違うこともあるが、やりたいことは一緒なので、
関数がどのクラスのものか勝手に判定して呼びわけてくれると便利だ→多態(ポリモフィズム)
</div></details>




<details><summary><b>3.初めて知った用語</summary><div>
namespace 名前空間の名付けについては、企業名、製品名、技術名をドットでつなげるMicrosoft.WindowsMobile.DirexcX

classやpropertyには、 名詞
method メソッド名には、動詞


コミット：変更(ロールバック：取り消す)Githubでソース管理を行い問題ないと判断した場合にコミットして変更情報を確定
デバッグ：バグ&修正
パス：PATH 場所 絶対パスc:\-\-\-.txt

変数(=クラスclass データの箱 VARiable)
関数(=メソッドmethod, func 処理の箱) 代入(=と違う)
関数について：1処理名→2引数入れる(実行させたい値.別名ﾊﾟﾗﾒｰﾀ)→3実行→4戻り値(結果の値)

プロパティ：9.変数-④参照

 + クラス:変数、設計図
  + オブジェクト:クラス、メソッド両方(値入ってても入ってなくても)、オブジェクト指向は全てのモノ、データ
  + インスタンス:クラス(値まで入ったクラス) 動詞:インスタンス化する

ture(真)false(偽) ==等しい <=以下 >=以上

冗長…曖昧語、多くの業態で失敗に備えた予備として使用。
ex)代替サーバーを用意し冗長性をもたせる←明らか肯定文。重複し長くて無駄という意味もあるが…



 + 記号
　 #ナンバーサイン
{} 波括弧 ブレイス
'クォート
"ダブルクォート
~ チルダ
_ アンダースコア
　* アスタリスク
, コンマ .dot
& アンパサンド
$ ダラー
^キャレット

</div>



<details><summary><b>4.VisualStudio 扱い方/キーボードUS配列設定</summary><div>
VisualStudio>新規プロジェクト>コンソールアプリ>コードファイル追加>コード入力>ビルド(正常orエラー)>デバッグなしで実行
VisualStudio>新規プロジェクト>空のソリューション>Visual C#追加
・ついでにWebBrowser作り方
新規プロジェクト>フォームアプリ>ツールボックスのWebBrowserでプロパティURL指定でゲームできる
（できたゲームはプロジェクト内にexeあるから）プロジェクトはUser内sourceに入ってる
<br>
注意:Insertキーで上書き/挿入モード切り替わってしまう。
<br>
ショートカット:
Ctrl+K(N)(F)　ブクマ(移動)(整形)
　　+G　　　　　　 行
　　+M　　　　　　畳
　　+Shift+L　　　行削除

<br>  

・キーボードUS配列設定

1.コンパネ>システム>デバマネ>キーボード削除>メニュの操作>
ハードウェア変更のスキャン(キーボード復活したら閉じる)
2.レジストリ>[MSの言う通りにする](https://support.microsoft.com/ja-jp/help/927824/windows-may-not-use-the-correct-keyboard-layout-when-you-connect-a-usb)
3.レジストリ> `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\`
内の使用してるInputツールのLayout関連の該当DLLを片っ端からJPからUSにする(GoogleやIME)
4.再起動後、Alt+`きかない場合、Google日本語入力再インストール(タスクから辞書ツールのエクスポート後)
</details></div>




<details><summary><b>5.Hello, World(Console.WriteLine 文+改行)</summary><div>
console.Writeは文(code内で改行しても、どんなに長文でも１行出力)
先頭で"\n"入れれば以前がLineでなくとも改行。Console.Write"\n~~~"
変数として改行を入れる場合、Environment.NewLine


uncs(p/i)ci</a>
console.WriteLineは文+改行、console.Writeは文(code内で改行しようと１行となる)
// myname01.cs

<b>using System;</b>←システム使う宣言で必要
<b>namespace practice;</b>←クラスの上の階層でパックできる
<b>class MyName01</b>←クラスでカプセル化する宣言
<b>public static void Main()</b>←必ずMainメソッド。ﾊﾟﾌﾞﾘｯｸｽﾀﾃｨｯｸﾎﾞｲﾄﾞﾒｲﾝ()
//publicアクセシビリティ(クラス外呼出可能)staticクラスのインスタンス外呼出可能
void値返さない()には引数((実行させたい値.別名ﾊﾟﾗﾒｰﾀ.ｺﾏﾝﾄﾞﾗｲﾝ引数))書ける
インスタンスはクラスメンバーを基にして実際に値まで入った実体(宣言しただけはゴミと同じ)

<div id="anchor1"><b>・public以外のアクセシビリティ</b></div>
public	どこからでもアクセス可能
protected クラス内部と派生クラスの内部からのみアクセス可能
private protected(C# 7.2)同一プロジェクト内のクラス内部と派生クラスの内部からのみアクセス可能
private	クラス内部からのみアクセス可能


--------------------------------


```c#

            //Hello, World
            Console.WriteLine("Hello, World");
            Console.WriteLine("私の名前はh.okabeです");
            //Write(ただ書くだけ改行なし！)
            Console.Write("あ");
            Console.Write("い");
            Console.Write("う");
            Console.Write("え");
            Console.Write("お");//下記コードとも繋がる
```


※{}で改行するのは見やすくするためのルール(インデントという)
</div></details>



<details><summary><b>6. string.Format() をやめて$"{}";</summary><div>
ちょっと長いけど要するにこう(testerString は使い回す場合追加で)

```c#
        var testerString =
        "\n入力内容の確認:\n" +
        $"Tester number: No.{counter}\n" +
        $"Tester Name: {t.Name}\n" +
        $"Tester Age: {t.Age}\n" +
        $"Tester Country: {t.Country}\n" +
        $"Tester Lang: {t.Lang}\n" +
        $"Tester Response: {t.Response}\n" +
        $"Tester Rating: {t.Rating}\n" +
        $"Tester Specialty: {t.Specialty}\n";
        Console.Write(testerString);

        /*
        Console.WriteLine("\n入力内容の確認:");
        Console.WriteLine($"Tester number: No.{counter}");// counter
        Console.WriteLine($"Tester Name: {t.Name}");
        Console.WriteLine($"Tester Age: {t.Age}");
        Console.WriteLine($"Tester Country: {t.Country}");
        Console.WriteLine($"Tester Lang: {t.Lang}");
        Console.WriteLine($"Tester Response: {t.Response}");
        Console.WriteLine($"Tester Rating: {t.Rating}");
        Console.WriteLine($"Tester Specialty: {t.Specialty}");*/




```

```c#
            
            //変数の扱い方(C#6以降、文字列補間)
            int a = 10, b = 20, total = a + b;
            Console.WriteLine($"{a}+{b}={total}");//{}で囲まないと文字列なる
```

6以前
```Console.WriteLine(a+ "+" +b+ "=" +(a+b));```←aと"+"とb、と"="と(a+b)。と表示される、演算子は接続子みたいなもの

>正しいですが、その通りややこしいので今はこういう書き方は主流ではありません。
次のように書きます。 
```Console.WriteLine($"{a}+{b}={a+b}");//+ややこしい、($"{}");表記追加```
※変数は{}で囲まないと文字列なる

>var now = DateTime.Now;// "2018年04月01日"書式設定も可能
<font color="Red">Console.WriteLine($"{now:yyyy年MM月dd日}"</font>
※スペースは見やすさのために入れているので、あってもなくても構いません。

[参考:スペースと+の条件や意味が知りたい。](https://teratail.com/questions/145466)
</div></details>








<details><summary><b>7.書式指定文字(精度指定子は桁数/小数点以下桁数の精度を指定)</summary><div>
Console.WriteLine($"123:#.##");// #.## D6 C f5..etc

("{0:D6}",表示したい値); 例("{0:d6}", 100);//000100 100をDの6桁表示
C通貨 Console.WriteLine("{0:C}", 10000);//\10,000
D10進 Console.WriteLine("{0:d6}", 100);//000333※整数のみ("{0:d}", -100.5);エラー
F小数 Console.WriteLine("{0:f}, {0:f5}", 0.1234); // 0.12, 0.12340※GでFかE簡潔な方表示
P％   Console.WriteLine<b>("{0:p1}", 0.1234); // 12.30%</b>
・カスタム
("0")ｾﾞﾛﾌﾟﾚｰｽﾌｫﾛﾀﾞ対応する数字に置き換えるなくても0表示。例1234.5678 ("00000") -> 01235
("#")桁ﾌﾟﾚｰｽﾎﾙﾀﾞｰ対応する数字に置き換えるなければ非表示、整数は#有無関わらず表示1234.567("#.##") -> 01235
Console.WriteLine("{0:#.##}", 1234.567);1234.57
Console.WriteLine(<b>"{0:#,#.00}",</b> 1234567);123，456，7.00※#と0の合わせ技。#,#で三桁区切、00で小数点以下0詰

```csharp
            Console.WriteLine("{0:D6}", 333);
            Console.WriteLine("{0:C}", 10000);
            Console.WriteLine("{0:e}", 1234);
            Console.WriteLine("{0:E}", 123456789);
            Console.WriteLine("{0:e10}", 1.23456789);
            Console.WriteLine("{0:f}, {0:f5}", 0.1234);
            Console.WriteLine("{0:p1}", 0.1234);
            Console.WriteLine("{0:p2}", 0.1234);
            Console.WriteLine("{0:#,#.00}", 1234567);
            Console.WriteLine("{0:#,#.00}", 1234567890);
            Console.WriteLine("{0:#.##}", 1234.567);
```


</div></details>



<details><summary><b>8.Console.ReadLine(); 質問、入力値を返せる</summary><div>

```c#

using System;

namespace practice//名前空間(namespace、classの上階層で名前つけて整理 N1やN2と表せる)
{
    class Program//ユーザー定義型
  {
       static void Main()//メソッド
    {
            Console.WriteLine("あなたの名前を入力してください");
            string name;
            name = Console.ReadLine();

            
            Console.WriteLine("あなたの年齢を入力してください");
            string age;
            age = int.Parse(Console.ReadLine());
            //デフォはStringなのでint.Parse()で囲むと文字列を整数型として変換できる

            Console.WriteLine($"{name}さんは{age}歳です");//AさんはB歳です
            //{}も文字にしたい場合ブレイス2個追加で($"{{{name}}}。"も文字にしたい場合\追加で\"とする。
            Console.WriteLine($"\"{{{name}}}さんは{{{age}}}歳です\"");
     }
   }
}
```


</div>
</details>




<details><summary><b>9.変数(class VARiable)とデータ型の詳細</b></summary><div>

<details><summary><b>①変数と関数</b></summary><div>

１クラスは、データとその振る舞いをカプセル化したもの
(データはフィールド(メンバ変数)、振る舞いは関数(メソッド)と言える)

２この1つのオブジェクトが持つ範囲の値をフィールド(メンバ変数)(メソッド宣言時)という。
３コンストラクタはクラスをインスタンス化した時にフィールドの初期化できる
４関数は[修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ....){省略}//チャンネルを変えろでなくチャンネルを1chに変えろだと()に引数1chがはいる-

(変数にはint型変数(int x;)やstring型変数(string str;)等データ型しか入らない、別の箱に入れるというかコピーできる)
(ちなみにデフォである機能なので<b>組み込み型</b>という、Person等自分で作った変数は<b>ユーザー定義型</b>)
これはいちいち整数int文字列stringとわけずとも、1つのデータとしてまとめる事できる
例1

前の書き方

```c#

    private int fuga;//(関数 メソッド フィールド メンバ関数)

    public int Hoge{
        get{ return fuga; }// get{return フィールド名;}
        set{ fuga = value; }//set{フィールド名 = value;}
    }

//前のプロパティ定義の仕方

class Person
{
  public string name;    // 名前
  public uint   age;     // 年齢
  public string address; // 住所
}

```

これでPersonというユーザー定義型を自分で作った&プロパティ作った事に
※定義しただけなので"ゴミが入っている"と俗に言う
</details></div>







<details><summary><b>②初期化</b></summary><div>

(定義した変数に値代入すると"初期化"という、その値の事を"初期値"という)
※変数を宣言と同時に初期化した状態(10は初期化子という)→int x=10;//あとから代入int x; x=10;の事を動的初期化という
<b>変数に同時に初期化子代入で初期化、あとから初期値代入が動的初期化。</b>
ちなみにこの変数にconstフィールドを付加して定数(constant)にできる。
※定数は定まった数で確定できる(変更してもコンパイルエラーなるから分かりやすい)
定数型は3つconst、readonly、static readonlyがあり、それぞれ特徴が違う。
constは変数宣言時のみ可能(const int x=10;)
readonlyは宣言時、コンストラクト内も可能。但しconstより遅い
static readonly(基本これ使う)は定数にシンボル名必要でもconstのように使える

変数は最初にデータ型例えばint(整数型) 次にスペースあけて変数名
例えばx; yourAge; myAge;等(但し先頭数字不可・予約語(キーワード)不可例えばclassやusing)
int x;             となる。複数もできる int x,y;この場合 <b>int x,y = 5,z;</b>
x=12;              もしくわまとめて int x = 10;
x=5; ←あとから代入された整数が正しい
x=5.1;←小数点は整数型ではないのでｺﾝﾊﾟｲﾙｴﾗｰなる！
int a=10, b=20;
</details></div>





<details><summary><b>③値型 参照型</b></summary><div>

int x=10;値型 str="10"参照型
・値型には直接値が格納。x専用メモリ作成される
>ex )
変数 A の値を変数 B へ代入した時、値がコピーされて渡される。
変数 A が持っている値、変数 b が持っている値、と実体は 2 つある。

・参照型には「実体がどこにあるのかという情報」が格納。実体はずっと別の場所(ヒープ)に確保。
定義した時点でその全てはその場所から参照された残像みたいなもの。

>ex )
変数 A の値を変数 B へ代入した時、変数 B には値のアドレスが渡される。
変数 A が持っているのは、値がいる番地001。
変数 B が持っているのも、値がいる番地001。
実体である値は番地 001 にしかいない。つまり実体は 1 つしかない。
複数の場所 ( 変数 ) から、1 つの実体をみている。

[ex参考 koshinRan](http://koshinran.hateblo.jp/entry/2017/08/11/215952)

</details></div>





<details><summary><b>④プロパティ</b></summary><div>

メソッドを変数のように扱えるため実際にはメソッドなのにまるで変数を操作しているよう
メソッドの中にはかけないクラスの中に書く、そのためクラスプロパティメソッドインスタンスの順に書く
クラスの値が持つ範囲(フィールド)別名メンバ変数
フィールドの値を取得、設定する窓口(プロパティ)、隠蔽。
クラス外部から見るとメンバ変数(フィールド)のように振る舞い、 クラス内部から見るとメソッドのように振舞う



| name | age |
|:----:|:----:|
| 田中 | 18 |
| 佐藤 | 22 | 
| 山本 | 34 |
このような表を作りたいとする。

```php
index4.php

<?php

// Staffというクラス(型)を宣言。クラスの1文字目は大文字(Pascal)
class Staff {

  >// property
  public $name;
  public $age;

}

//クラスStaffのインスタンスを作成
$tanaka = new Staff;

//インスタンス名->プロパティ名  ※プロパティの"$"はつけない
//tanakaというインスタンスのプロパティ$nameに、tanakaを挿入。
$tanaka->name = "tanaka";

echo $tanaka->name; // tanaka

```

//クラスStaffのインスタンスを作成。(引数で$nameを入れてあげます。)
$tanaka = new Staff("tanaka");

echo $tanaka->name; // tanaka
$tanaka->Hello(); // hi, i am tanaka!

流れ↓
uncs(p/i)ci=using,namespace,class,
      (public) static void Main(string[] args)/public PROPERTY(int Age{get; set;})/public interface
      constructa(値代入),instance(←new演算子)



<b>・public以外のアクセシビリティ</b>
public	どこからでもアクセス可能
protected クラス内部と派生クラスの内部からのみアクセス可能
private protected(C# 7.2)同一プロジェクト内のクラス内部と派生クラスの内部からのみアクセス可能
private	クラス内部からのみアクセス可能



+ <b>自動実装プロパティ2(新しい書き方)</b>
            // var ... new... {instance}
            // 実行文

```c#
using System;

namespace memberlist

{
    class Person
    {
        //private string name;//ﾌｨｰﾙﾄﾞ
        //private int age;

        public string Name { get; set; }
        //{
        //    get { return name; }
        //    set { name = value; }
        //}
        //get{return ﾌｨｰﾙﾄﾞ;}set{ﾌｨｰﾙﾄﾞ=value}
        //getで値呼び出せる、setで値設定できる


        public int Age { get; set; }
        //{
        //    get { return age; }
        //    set { age = value; }
        //}
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var person= new Person { Name = "シュミット・ダニエル", Age = 1992 };
　　　　　　　Console.WriteLine($"{person.Name}は{person.Age}年生まれです。");
            //var p = new Person()//インスタンスにnew演算子で値代入(コンストラクタ)
            //{
            //    Name = "Taro Yamada",
            //    Age = 30
            //};

            
            //Console.WriteLine("{0} ({1})", p.Name, p.Age);
            
  　　　　　　// var ... new... {instance}
            // 実行文

            var person2 = new Person { Name = "東口　順昭", Age = 1986 };
            Console.WriteLine($"{person2.Name}は{person2.Age}年生まれです。");
        }
    }
}
```

            // var ... new... {instance}
            // 実行文

//あとはインスタンス生成してくだけ
//public string Name { get; set; }は{get;}のみでも使える
//(get-only プロパティ；読み取り専用なので、コンストラクタ内で代入するのみ)
//(この読み取りはget専用でget以外newとかはreadonlyでも可能)
//省略されたFieldはどこ行ったのか、BackingFieldに格納されてるらしい(必要なったら勉強)
//Field、setのみならず、値代入(コンストラクタ)も省略できるようなった。
//uncs(p/i)ci

<b>・自動プロパティでクラスとプロパティのみになり、コンストラクタはget;}後ろに="ダニエル";でOK
(プロパティは必ずクラスにつき、静的メソッドの中にはつけない、そのためクラスプロパティメソッドインスタンスの順なり、インスタンスはクラス内のプロパティ下の後ろのメソッド内で記述する事になる)
また、インスタンス化はNew演算子でvar p=new 変数名とすれば使える、インスタンスで変数は{p.変数名}とする。</b>

```c#

using System;

namespace practice3
{

    class Program
    {
        public string Name { get; } = "ダニエル";
        public string Age { get; } = "1991";

        public string Name2 { get; } = "シュミット";
        public string Age2 { get; } = "1992";

        static void Main(string[] args)
        {
            var p = new Program();
            Console.WriteLine($"{p.Name}は{p.Age2}年生まれ");
            //staticなメソッドなので変数が含まれるとオブジェクト参照が必要です。というエラー(文字のみならOK)
            //static内でインスタンス化すれば普通に使える(それがNew演算子)var p = new Program();の部分と{}内p.変数名とする
        }
    }
``` 

</details></div>








<details><summary><b>⑤配列(コレクション) New演算子</b></summary><div>
上記の自動プロパティで静的メソッドでインスタンス化のためNew使ったが配列でも使う

<b>・配列の宣言と初期化</br>

```c#

        static void Main(string[] args)
        {
　　　　　　　var vs = new[] { "あああ","123","daniel" };//全部暗黙
            Console.WriteLine($"{vs[0]}");

            int[] numbers = new int[3] { 4, 5, 6 };//同時宣言

            //int[] numbers = new int[3];//宣言
            //numbers[0] = 4;//初期化
            //numbers[1] = 5;//初期化

            for (int a = 0; a < numbers.Length; a++)
            {
                Console.WriteLine("{0}番目の要素の値は{1}です。", a + 1, numbers[a]);
            }

```

実行結果
あああ
1番目の要素の値は4です。
2番目の要素の値は5です。
3番目の要素の値は6です。
ダニエルは1992年生まれ

配列は変数の並び。100個の変数が必要なら
int a, b, c, d, e, ...;//このようにいちいち作るわけにはいかない
<b>int[] a = new int[100]</b>;//このようにすれば
a[0]，a[1]，a[2]，……，a[99]//という100個の変数が生成される。

<b>・配列 COLLECTION LIST
var vs = new[] { "あああ","123","daniel" };
<font color="DarkSlateGray">List(リスト)//list.Add("GHI");//動的に変更
LinkedList(二重リンクリスト)//linkedlist.AddFirst("GHI");//線形データ構造なので要素を追加(削除)すると、元の要素が横にずれてくれる(未知数データの場合使う)
HashSet(セット)HashSet内に指定した要素が存在するかどうかを調べるため
Dictionary(ディクショナリ)連想配列。辞書は単語と意味、Dictionaryはキーと値、dict.Add(1,"One");
Queue(キュー)待ち行列。FIFOスタイル(First In First Out)要素削除せずともFirst Outするため要素数はnのまま循環できる
Stack(スタック)派遣してた時のホテルに重ねた皿LIFOスタイル(Last in First Out)新しい実行履歴から見れる</b> 
以上は配列のデータ構造で、どういう順番で表示するかは別個作る。
データ構造は、
[1] 要素を1つ入れる
[2] 要素を1つ取り出す
だけです。
入れたとおりの順序で取り出されてくるのがキュー、
逆順になる(最後に入れたのが最初に出てくる)のがスタック。

他説明
コンテナのためのおまじない
// デフォルトだと、自動的に用意されます
`using System;`
// リスト、連想配列を使うために必要です
`using System.Collections.Generic;`
// 順序つき連想配列を使うために必要です
`using System.Collections.Specialized;`
// コンテナに関するライブラリを使うために必要です
`using System.Linq;`

コンテナの実例（果物の名前）
// string[]というのは、"文字列(string)が入った配列（コンテナの一種）ですよという意味
// fruitsは配列の名前。中に2つ以上のデータが入ることが前提なので、複数形にします
// {}の中に、順番にデータを書いていきます
// データの中身は、"peach"（桃）, "cherry"（さくらんぼ）, "tangerine"（みかん）, "apple"（りんご）
// 『,』（コンマ）区切りで並べていきます
`string[] fruits = {"peach", "cherry", "tangerine", "apple"};`





何個あるかチェック
Console.WriteLine(severalEvens.Length);


[LinkedList線形データ構造](https://www.c-sharpcorner.com/article/linked-list-implementation-in-c-sharp/)
[[C#]配列の初期化いろいろ](https://qiita.com/urushibata/items/f5bcae4958badab1e2ec)




</details></div>

</details></div>




<details><summary><b>10.データ型 早見表</b></summary><div>


| Alias    | .NET型 | 説明                                                 | Size (bits) | Range (Values)                                          |
|----------|-----------|------------------------------------------------------|-------------|---------------------------------------------------------|
| byte     | byte      | 符号なし(byteに限り元々Uなし)                         | 8           | 0 to 255                                                |
| $\color{red}{\rm s}$byte    | SByte     | 符号あり(なので$\color{red}{\rm Signed}$)                                   | 8           | -128 to 127                                             |
| int      | Int32     | 符号あり($\color{red}{\rm Signed}$)                                     | 32          | -2,147,483,648 to 2,147,483,647                         |
| $\color{blue}{\rm u}$int     | UInt32    | 符号なし($\color{blue}{\rm Unsigned}$)                                   | 32          | 0 to 4294967295                                         |
| short    | Int16     | 符号あり($\color{red}{\rm Signed}$)                                     | 16          | -32,768 to 32,767                                       |
| $\color{blue}{\rm u}$short   | UInt16    | 符号なし($\color{blue}{\rm Unsigned}$)                                   | 16          | 0 to 65,535                                             |
| long     | Int64     | 符号あり($\color{red}{\rm Signed}$) $\color{silver}{\rm サL}$                                     | 64          | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| $\color{blue}{\rm u}$long    | UInt64    | 符号なし($\color{blue}{\rm Unsigned}$) $\color{silver}{\rm サL}$                                   | 64          | 0 to 18,446,744,073,709,551,615                         |
| float    | Single    | 単精度浮動小数点Single-precision floating point type | 32          | -3.402823e38 to 3.402823e38                             |
| double   | Double    | 倍精度浮動小数点Double-precision floating point type $\color{silver}{\rm サD}$ | 64          | -1.79769313486232e308 to 1.79769313486232e308           |
| char     | Char      | 文字型(Character type)                               | 16          | Unicode文字                            |
| bool     | Boolean   | ブーリアン型                                         | 8           | True or False 複雑な演算                                |
| object   | Object    | 基底の型 Base object たぶん全ての型を継承してる      |             |                                                         |
| string   | String    | 文字列型                                             |             |                                                         |
| decimal  | Decimal   | 範囲も精度も高い10進数演算(小数点OK) $\color{silver}{\rm サM}$                  | 128         | (+ or -)1.0 x 10e-28 to 7.9 x 10e28                     |
| DateTime | DateTime  | 日付時刻 ※他の日付系統どうなる？               |             | 0:00:00am 1/1/01 to 11:59:59pm 12/31/9999               |

*C#型:(C#で使用する別名の事{エイリアス})
*.NET型:.Net Coreや.NET Frameworkで使用できる共通言語(クロスプラットフォームなら.Net Core)
*Byte:何Byte使うか、必要なストレージ量(扱いたい値が大きくなる程32.64.128..と当然使用ストレージも増加)
*範囲:扱える値の範囲、shortは16ビットだから約3万で短いけどintは32Bなので約2兆！小数点基本double
*.NET型System.はusing Systemすれば不要
*Mの表記は<b>サフィックス</b>(暗黙の変換を防ぐ decimalM, doubleはD, Lでlong/ulong, Uでuint/ulong)
*bit数見て幅、size抑えてメモリ節約
*範囲調べるConsole.WriteLine($"<b>int:{int.MinValue}~{int.MaxValue}</b>");
*数値調べるConsole.WriteLine(<b>100.GetType()</b>);
*英語の方が理解しやすい事に気付いた(日本語も覚える必要あるけど。海外とのアドバンテージを感じる…)

[table作成](http://www.tablesgenerator.com)
[参考①tutorialsteacher](http://www.tutorialsteacher.com/csharp/csharp-data-types)
[参考②wiki](https://ja.wikipedia.org/wiki/C_Sharp%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B#%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%9E%8B)

</div></details>

<details><summary><b>11.変換/int.Parse/ToString</b></summary><div>
byte ~ = byte.Parse() ~ Convert to int/str
// int.TryParseはparseの成否を返すが、成功の場合は変換結果がnumberへ格納される 失敗は何も返さない
bool result = int.TryParse("1234", out number)
 //out ～はメソッド内からメソッド外へデータを受け渡す(numberに一旦値代入して定数にしないとエラー！)

ReadLineで数値のユーザー入力の際strをint等に"変換"しないと計算できないから。
(数値を文字にするToString、文字の日付を日付にするDateTime.Parse)

```c#

Console.Write("1の位の整数を入力してください:");//intとわかってるので下記で入力と同時に変換
int x = int.Parse(Console.ReadLine());//int.Parse/Convert.ToInt32
Console.WriteLine($"その数字を2倍すると{x * 2}ですね？");
```

</div></details>


<details><summary><b>12.構造体struct</b></summary><div>
ユーザー定義型と同じ振る舞い?使い所必要な時勉強
structを宣言して構造化(パッケージ化)(メンバーを決める)

```c#

struct PERSON
{ 
char name; 
int age; 
float sincho; 
float taijyu; 
}
```

</div></details>

<details><summary><b>13.浮動小数点数型(BMIと利息)</b></summary><div>
浮動は123.45や1.2345×10^2のように"."が左右にふわふわするから。
(だからfloat:ただほぼ使われてないdouble常用)
では何故わざわざ複雑な呼び?数式するか？気になった結果→PCは0と1で構成されていて
(0と1で2進数、人は0～9の10進数)"."を扱わない。
そこでPCに12345E-002。仮数12345*基数10の指数-2乗という覚え方させて123.45を理解させた。
(123.45は<b>123.45*10^-2で12345E-002</b>、E=Exponential(指数)の頭文字で、ここでは*基数^(=*10^)の代わり)
</br>
ex)BMI計算コード作る練習(Mathクラスを用いて)
public static class Math //Mathクラスは色んな式を求める事ができるクラス
<font color="Red">累乗Pow=x^n</font>、<font color="Red">abs=絶対値:原点からの距離</font>
切り捨て上げFloor,Truncateどちらも単に小数点以下切り捨て//double h=$\color{blue}{\rm Math.Floor/Truncate(±val）}$
また(val/-val*valの部分は何でもいい)で調整するがFloorの-valは正方向のTruncateと違い1.5が単に符号付き-1.5、負方向に丸めるので-2)
豆知識unityのC#は独特だが例としてunityEngine.Mathf.Absがある。Unityはクロプラなので重いが安全。 

```c#

累乗	      double e = Math.Pow(2, 3);//2の3乗
    	    Console.WriteLine(e);8

1.5丸め     Console.WriteLine($"{Math.Ceiling(val)},{Math.Ceiling(-val)}");//2,-1   Ceiling 両方天井・正と正
            Console.WriteLine($"{Math.Truncate(val)},{Math.Truncate(-val)}");//1,-1 Truncate単に切捨・定と正
            Console.WriteLine($"{Math.Floor(val)},{Math.Floor(-val)}");//1,-2       Floor    両方床 ・定と負



・BMI計算で使う
            Console.Write("身長(m)は何mですか。");
            double f = double.Parse(Console.ReadLine());
            Console.Write("体重(kg)は何kgですか。");
            double g = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("BMI={0:#.#}", g/Math.Pow(f, 2));
```


・利息計算で使う
(decimal=10進演算で精度、範囲ともにup)
複雑なので使う事があれば勉強。今は端折る。
[C#でローン返済額計算](https://books.google.co.jp/books?id=yTmSCgAAQBAJ&pg=PA83&lpg=PA83&dq=C%23+decimal+%E5%88%A9%E6%81%AF&source=bl&ots=zSTA26mzYl&sig=R6tRx5hjOr8z2UscRGaFZt24_gk&hl=ja&sa=X&ved=2ahUKEwiBksjx2MPdAhVIv7wKHS0FBv0Q6AEwAXoECAkQAQ#v=onepage&q=C%23%20decimal%20%E5%88%A9%E6%81%AF&f=false)

</div></details>

<details><summary><b>14.char 一文字</b></summary><div>
index化して変換できる

```c#

         
            string p = "ihj";//宣言
            char[] array = p.ToCharArray();//変換
            array[2] = 'q';//何文字目
            p = new string(array);//pにarrayかけた(これないとただの宣言止まり)
            Console.WriteLine(p);//ihq array[2]は012ときて3文字目
            Console.WriteLine('q');//q
            Console.WriteLine("q");//q
```
</div></details>



<details><summary><b>15.bool(if(条件!){}else{}) (true or false)</b></summary><div>



```c#


            Console.Write("名前を入力してください");
            string name1 = "okabe";
            name1 = (Console.ReadLine());
            if (name1 != "okabe")
                Console.WriteLine("Welcome " + name1);
            else
                Console.WriteLine("We don't know your name.");
            //boolは数値でも便利
            int mynumber = 2;
            if (mynumber >= 2)
                //>,<だとfalseなので何も返さないが>=,==,=<でtrueなので文字列発動
                Console.WriteLine($"Your number is {mynumber}");
            //分岐が複数ある場合else if
            int mynumber1 = 2;
            if (mynumber1 > 2)
            {
                Console.WriteLine("Your number is greater than two. ");
            }
                else if (mynumber1 == 2)
            {
                Console.WriteLine("Your number is equal to two.");
            }
            else
            {
                Console.WriteLine("We don't know your number.");
            }

            
            Console.WriteLine("1+1=?");//答えは2
            int r;
            r = int.Parse(Console.ReadLine());
            if (r > 5)
            {
                Console.WriteLine($"{r}より小さい数値です");
            }
            else if (r > 2)
            {
                Console.WriteLine("Close!");//close=近い,おしい
            }
            else if (r == 2)
            {
                Console.WriteLine("true!");//以下else if..
            }
            else
            {
                Console.WriteLine($"{r}より大きい数値です");
            }
```

</div></details>


<details><summary><b>16.リテラル(=値)暗黙の変換 値から型/型から範囲 確認方法</b></summary><div>           
            
```c#

            //GetType(型調べる)
            Console.WriteLine(100.GetType());//int
            Console.WriteLine(5.1.GetType());//double
            Console.WriteLine(1.7.GetType());//double
            Console.WriteLine(3.4.GetType());//double
            //MaxValue(範囲調べる)
            Console.WriteLine($"int:{int.MinValue}~{int.MaxValue}");
```
</div></details>