第1章 
 基本編 
Java講座を読んだ人や、他のプログラム言語をやったことある人向けに書いてあるです
変数が何かとか、条件文が何かとは書いてないです〜。その辺りは
Java講座に詳しく載ってるです〜。説明の中にはJavaと比較しているところがあったり
するです。Javaをやった事無い人は無視していいです〜。
注意:サンプルプログラムと書かれていないところのプログラムをコピー&ペーストし
て利用しようと思ってもコンパイルされない場合があるです。理由は、スペースが全角
だからです〜。うまくコピー&ペーストすれば、いけるかも。

C#.NET(以下C#)とは?
 Microsoftが作った言語で、.NET Framework上で動くアプリケーションを作る事が
 できるです。C#で書かれたコードをコンパイルすると
 MSIL(Microsoft Intermediate Language)という中間言語に置き換わるです。
 このMSILを実行するのが.NET Frameworkです。この実行する部分をとくに
 CLR(Common Language Runtime)と呼んでるです。
 それぞれのプラットフォームに合ったネイティブコードにコンパイルして実行するです。
 例:プラットフォームがWindowsならネイティブコード(この例だとWindowsで動くコード)
 中間言語にすることよって、プラットフォームに依存しないアプリケーションを作る
 ことができるです。Javaに似た構造ですね!

        .NETに対応した言語(C#.NET VB.NET、・・・)
             ↓コンパイル
           中間言語(MSIL)
             ↓CLRによって実行
       プラットフォーム(Windows、Linux、・・・)

今現在、正式に対応しているプラットフォームはWindowsだけです。でもLinuxでも動
かすことは可能です。monoやDotGNUというプロジェクトを使えば


言語の構造
サンプルプログラム1_1
1:
2:
3:
4:
class Rei1_1{
   static void Main(){
   }
}

これがC#で書く一番簡単なプログラムです〜。Javaを見てきた人は、Javaにそっくり
だと思うかもしれないです。static void Main()を
public static void main(string[] args)なんて書いたら、区別付かないですね!
今書いたように書くこともできるです。


コメント
 コメントは、コード1行を注釈したい場合は、 //
 複数行を一度に注釈したい場合は、 /* と */ で囲むです。

 //コメント(注釈)です〜
 
 /*
 複数行のコメントを書いてみるです。
 コメントは、あったほうが分かりやすいですね!
 */
 


文字列の出力(標準出力)
 System.Console.WriteLine()メソッドを使うです。
 例:System.Console.WriteLine("C#ってJavaに似てるです〜");
 実行すると C#ってJavaに似てるです〜 と出力された後に改行されるです。
 改行したくない場合は、System.Console.Write()メソッドを使うです。
 例:System.Console.Write("C#ってJavaに似てるです〜(改行されないVer)");

 文字列+変数名を出力させたいとき。ここでは変数Aの値は10です。
 ※10はAという変数に入ってるとする
  System.Console.WriteLine("変数Aの値は" + A);
  System.Console.WriteLine("変数Aの値は{0}",A);
 どちらもAの値を出力させることが出来るです。2番目の方は{0}の中にAの値が
 入ってくるです。A=10でB=20のときだと上の2つの出力は次のようになるです。
  System.Console.WriteLine("変数Aの値は" + A + "、変数Bの値は" + B);
  System.Console.WriteLine("変数Aの値は{0}、変数Bの値は{1}", A, B);

 計算式を書いて計算結果を出力させる
  System.Console.WriteLine(5 + 4);         9と出力される
  System.Console.WriteLine("5 + 4 = " + (5 + 4));  5 + 4 = 9と出力
 文字列を一緒に出力されたい場合は計算式を ( と ) で囲むです。
 または、変数の出力のときの2個目のやり方を使って
  System.Console.WriteLine("5 + 4 = {0}", 5+4);
 と出力させることも可能です〜


文字列の入力(標準入力)
 System.Console.ReadLine()メソッドを使う
 例:string str = System.Console.ReadLine();
 変数strにキーボードから入力した値が入ってくるです。
 stringは、文字列型の変数です。
 
 整数値を入力させたい場合は、入力で受け取った文字列型の値を
 整数型に変換してあげないといけないです。
  string str = System.Console.ReadLine();
  int num = Int32.Parse(str);
 intは、整数型の変数です。
 =演算子は右側で処理した値を左側の変数に代入するです。
 
 整数型に変換する方法は、他にも
  int num = int.Parse(str);
  int num = Convert.ToInt32(str);
 があるです。

標準入出力を使ったサンプルプログラム
サンプルプログラム1_2
1:
2:
3:
4:
5:
6:
7:
8:
class Rei1_2{
    static void Main(){
        System.Console.Write("入力:");
        string str = Console.ReadLine();
        
        System.Console.WriteLine("入力した値:" + str);
    }
}

代入
 文字列の入力でちょっと触れたですが代入するときは =演算子 を使うです。
  a = 10; //変数aに10を代入
  a = b; //変数aに変数bを代入
  a = 1 + 2; //変数aに1+2の結果を代入(aには3が入る)
 Javaのときもそうだったんですが、かならず命令(メソッド)を書いた後や変数宣言
 をした後、式を書いたあとなどには、最後に ; を付けるです。
 class a{; や }; は 駄目です。{ や } などの最後には付けないです。コメントのとき
 も付けないです。


変数の型
変数の型名有効範囲
sbyte 1バイト整数型(-128 〜 127)
byte 1バイト整数型(0 〜 255)
short 2バイト整数型(-32,768 〜 32,767)
ushort 2バイト整数型(0 〜 65535)
int 4バイト整数型(-2,147,483,648 〜 2,147,483,647)
uint 4バイト整数型(0 〜 4,294,967,295)
long 8バイト整数型(-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807)
ulong 8バイト整数型(0 〜 18,446,744,073,709,551,615)
float 4バイト単精度浮動小数点
double 8バイト倍精度浮動小数点
char 2バイト 文字型(\u0000 〜 \uffff)
bool true、false

 他の言語と比べるとなんか型が多いですね!符号有り(+と−)が扱えると符号無
 (+)だけの両方が存在するからです。Javaの場合は、符号無は無いです。C/C++だと
 変数の型の前にunsignedを付けていたと思うです。C#の場合はその頭文字を取って型
 にしちゃったのだと思うです。uがあれば符号無ってことになるです。byte以外は


定数
 定数の宣言は、変数の型の前にconstを付けるだけでOKです。
 例:int型の定数10を宣言する
 const int a = 10;


計算するときの演算子
 Javaと同じです。 演算子一覧
 1つ違うのは、シフト演算子の >>> は無いです。
 インクリメント演算子とデクリメント演算子もあるです。
 a++; a=a+1;に同じ。 b--; b=b-1;に同じ


演算と精度
 System.Console.WriteLine("6 / 4 = " + (6 / 4));としたとき普通に考えると
 6/4なので答えは1.5と出力されるはずです。しかしこれを実行すると1という結果が
 出てきてしまうです。これは、int型同士の計算なので答えもint型になってしまうか
 らです。正しく1.5と出力されたい場合は、どちらか1つ(6か4)をdouble型にキャスト
 してあげればいいです〜。
 精度ちは違うですが、string型をint型にというのは、できないです。これは別な方法
 を使うです。


条件判断
 C#の分岐命令は、if文を使うです。Javaと同じです。
 複数分岐するときに使うswitch文は若干Javaと違うところがあるです。
 
 例1:もし変数aの値が1だったら変数aの値を0にする
  if(a == 1){
    a = 0;
  }
 
 例2:もし変数aの値が1だったら変数aの値を0にする。そうでなければ1にする
  if(a == 1){
    a = 0;
  }
  else{
    a = 1;
  }
 
 例3:変数aが1のときC#と表示。2のときJavaと表示。3のときC言語と表示。
    それ以外のときVBと表示させる。
  1.if〜else if〜else文を使う
   if(a == 1){
     System.Console.WriteLine("C#");
   }
   else if(a == 2){
     System.Console.WriteLine("Java");
   }
   else if(a == 3){
     System.Console.WriteLine("C言語");
   }
   else{
     System.Console.WriteLine("VB");
   }
  
  2.switch文を使う
   switch(a){
     case 1: System.Console.WriteLine("C#"); break;
     case 2: System.Console.WriteLine("Java"); break;
     case 3: System.Console.WriteLine("C言語"); break;
     default: System.Console.WriteLine("VB"); break;
   }
  
 C#でswitch文を使う場合break;を基本的に省略することはできないです。
 case 1:を実行した後にcase 2:を処理させたい場合はgoto文を使うです。
 今回の例だとgoto case 2;のように使うです。この後にbreak;は書かないです。
 gotoを使うときだけbreak;を省略することができるです。(省略と言わないかも
 
 case 1: System.Console.WriteLine("C#"); break;と書いたですが
 次のように
 case 1:
   System.Console.WriteLine("C#");
   break;
 複数処理の場合はこう書くです。複数処理を横に書いて行くとみにくいからです。
 
 switch文とgoto文を使ったサンプル。普通はこんなことやらないです。
 お勧めできないです。マネはしない方がいいです〜
サンプルプログラム1_3
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
class Rei1_3{
    static void Main(){
        int a = 1;
        switch(a){
            case 1:  System.Console.WriteLine("C#");    goto default;
            case 2:  System.Console.WriteLine("Java");  goto case 3;
            case 3:  System.Console.WriteLine("C言語"); break;
            default: System.Console.WriteLine("VB");    goto case 2;
        }
    }
}

関係演算子一覧表
演算子使用例
説明
== a == b aとbが同じときtrueを返す
!= a != b aとbが違うときtrueを返す
>= a >= b aがb以上のときtrueを返す
> a > b aがbより大きいときtrueを返す
<= a <= b aがb以下のときtrueを返す
< a < b aがbより小さいときtrueを返す


繰り返し
 C#の繰り返し方法は大きく分けて、for文とwhile文とforeach文の3つがあるです。

 例1:for文を使って1〜10までの数値を表示させる
  for(int i=1; i<=10; i++){
    System.Console.WeiteLine(i);
  }
  C/C++やJavaをやってる人なら書き方が同じなので分かるですが、書き方が違う言語を
  やって来た人にとっては、よく分からないですね。
  @ まず最初にint i=1;を実行するです。これはiの初期値を決めてるです。
    今回は1〜10までと例に書いてあるので1にしてるです。
  A 次にi<=10;を見るです。これは、iが10以上か比べてるです。この条件が正しい
    とき { と } の間を処理するです。今回はSystem.Console.WeiteLine(i);の1行を
    実行してるですね!
  B 実行し終わるとi++をするです。これはiに1を足してるです。
    そうしたら、Aに戻るです。これを繰り返して行くと最終的にはiの値が11になっ
    て条件が一致しなくなるです。そして終了するです。iが10まで繰り返したことに
    なるですね!COBOLをやって来た人は終了条件じゃないので戸惑うかもしれないで
    す。Aで判断するのは繰り返し条件です。

 例2:while文を使って-1が入力されるまで繰り返す
  int a = 0;
  while(a != -1){
   string str = System.Console.ReadLine();
   int a = int.Parse(str);
  }
  a != -1を見るです。この条件が正しいとき繰り返すです。今回の場合最初aを0で
  初期化してるのでaは-1でないという条件が正しいことになるです。そしたら { と
  }の間を処理するです。処理内容はaに入力した結果を入れてるです。そしたらまた
  条件が正しいか見ていくです。これを条件が正しい限りずっと実行するです。
  while()をwhile(true)と書くと無限ループを作ることができるです。

 例3:do〜while文を使って-1が入力されるまで繰り返す
  do{
   string str = System.Console.ReadLine();
   int a = int.Parse(str);
  }while(a != -1);
  do〜while文は、かならず1回は{ と }の中を処理するです。例2の場合、入力がさ
  れるまでと書いてあるので最低1回は実行させると分かってるです。こんなときは
  do〜while文を使うです〜。処理が終わるとa != -1を見て条件が正しいか比べる
  です。正しければ再び{ と }の中を処理するです。

 例4:foreach文を使ってと行きたいところですが・・・配列をまだやって無いので
   例を出すことができないです〜。配列が終わったらやるです。
配列
 一次元配列
 //例1
 //配列を宣言したと同時に、要素数10個分確保する。
 //このとき、0〜9番目の値には、0が格納される。
 int[] arr1 = new int[10];
 
 //例2
 int[] arr2; //配列を宣言する。
 arr2 = new int[10]; //要素数10個分確保する。
 
 //例3
 //配列を宣言したと同時に、10個分の値を確保
 //※値を同時に定義するときは[]の中に要素数を定義してはいけないです。
 int[] arr3 = {2,4,8,16,32,64,128,256,512,1024};
 //arr3とやっていることは、同じです。
 int[] arr4 = new int[]{2,4,8,16,32,64,128,256,512,1024};
 
 //配列に値を代入していく
 for(int i=0; i   arr1[i] = i*2;
 }
 
 //配列の値を出力していく
 for(int i=0; i   System.Console.WriteLine(arr1[i]);
 }
 
 配列に値を代入していくときや出力するときに、繰り返し条件でarr1.Lengthという
 変数が出てきてるですが、これは、arr1の配列の要素数を持っている変数です。実際
 は変数ではなく、プロパティというものです。
 今回だと、arr1.Lengthは10ですね!
 Javaとの違いは、Lengthの頭文字が大文字になっているところですね。
 
 二次元配列
 //例1
 //2行3列の2次元配列を宣言する。
 int[,] arr5 = new int[2,3];
 一次元のときのように宣言と要素確保を別々に分けて書くこともできるです。
 //例2
 int[,] arr6;
 arr6 = new int[2,3];
 そして、宣言と同時に値もセットしたいときは次のようになるです。
 //※値を同時に定義するときは[,]の中に要素数を定義してはいけないです。
 int[,] arr7 = {
  {1,2,3}
  ,{2,4,6}
 };
 
 int[,] arr7 = {の行をint[,] arr7 = new int[,]{と書いても同じです。
 
 二次元配列の要素数の取得は次のようになるです。
 arr7.Length・・・・・arr7の要素数全てなので、今回だと6です。
 arr7.GetLength(0)・・arr7の行数(0次元目)で今回だと2です。
 arr7.GetLength(1)・・arr7の行数(1次元目)で今回だと3です。
 int[0次元目,1次元目]のようになっているです。
 Javaだと、arr[][]のような書き方ですね。
 Javaの書き方で二次元配列を定義しようとすると実は別の意味をもった配
 列になってしまうです。その名もジャグ配列で、通称!?配列の配列です。
 
 ジャグ配列
 二次元配列を宣言するときに縦の要素数だけを指定して、横の要素数を指定しないで、
 宣言するです〜
 そして、横の要素数を一次元配列と見立てて、さっき宣言した一次元配列に入れて
 いくという何ともすごい技です〜。
 このサンプルプログラムだと
 0番目の要素には要素数が3個の配列が入ってくるです。
 1番目の要素には要素数が5個の配列が入ってくるです。
 これによってあたかも二次元配列のようになっていくです〜
サンプルプログラムOmake1CS
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
class Omake1CS{
    static void Main(){
        int[][] arr = new int[2][];
        arr[0] = new int[3];
        arr[1] = new int[5];

        for (int i=0;i<arr.Length;i++){
            for (int j=0;j<arr[i].Length;j++){
                arr[i][j] = j;
            }
        }

        for (int i=0;i<arr.Length;i++){
            for (int j=0;j<arr[i].Length;j++){
                System.Console.Write(arr[i][j] + "  ");
            }
            System.Console.WriteLine("");
        }
    }
}
※見覚えのある内容だな〜とかの突っ込みは無しでお願いです。


配列とforeach文
 繰り返しのところで無視していたforeach文の登場です。
 foreach文は、配列の要素数分だけ自動的にループしてくれる便利な命令です。
 例1:配列でやった例3の値を出力するときに使うと次のようになるです。
 foreach(int n in arr3){
   System.Console.WriteLine(n);
 }
 arr3の配列を最後まで見に行っていないとき、
 arr3の0番目の値を変数nに入れて、その値を出力するです。
 次にarr3の配列を最後まで見てないので1番目の値を変数nに入れ、出力するです。
 以降、arr3の値(1024)まで順に出力して行くです。
 処理の特徴は要素数を意識しないで最後まで配列の値を処理することができるです。
 Javaでも1.5からこの機能は取り入れられているです。構文は多少違うですが。
 その辺りは、Java5の新機能のfor文を見てほしいです。