#contents
*言語の特徴 [#a6035d70]
C#はMicrosoftが同社の.NET Frameworkでの中心言語とすべく開発した、比較的新しい言語です。
それまでの主要な言語(C++、Java、Visual Basic、Delphiなど)を下地に設計しているため、
実務的な「使える」言語になっています。

開発環境は無料ですし、GUIアプリも、Webアプリも、ゲームだって効率よく作成できます。
そこのあなた、C#でプログラミング始めてみませんか?

*開発環境の導入 [#c8aabc8b]
C#の開発環境としては、
Microsoft社が初心者向けに無料で提供しているVisual C# 2005 Express Edtion(以下Visual C#)を使用するのが簡単です。
ただし、Visual C#はWebインストールの場合はユーザー登録が必要です。
それが嫌な方は、isoイメージからインストールすることができます。
また、IDEのような大きなソフトをインストールしたくない方はコンパイラといくつかのツールがセットになった.NET Framework 2.0 SDKをインストールしてもいいでしょう。
以下、それぞれのインストール方法について説明します。

**Visual C# 2005 Express Edtionの場合 [#adf40e87]
Webインストールの場合、基本的に難しい点はありません。
[[MicrosoftのVisual C#のページ:http://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/]]で「Webからインストール」をクリックし、インストールするだけです。
途中、「SQL Server 2005 Express Edition」をインストールするかどうかのチェックがありますが、ハードディスクに余裕があるなら入れておいたほうがいいでしょう。
インストールが完了するとユーザー登録を促されますので登録します。

isoイメージからインストールする場合、[[ここ:http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/]]を参考にしてください。
isoイメージからなんらかのソフトウェアでファイルを展開します。インストール自体はWeb版と同様です。こちらの場合、ユーザー登録が必要ないようです(本スレJavaの人より。多謝)。

ドキュメントとして「[[MSDN Express Library:http://download.microsoft.com/download/5/7/b/57b8cf33-4cb4-466d-aca1-e4b1f64a3508/msdnixp.exe]]」があります。
なるべくならこれもインストールしておきましょう。

**.NET Framework 2.0 SDKの場合 [#nf08860a]
まだ.NET Framework 2.0をインストールしていない方は、SDKをインストールする前にインストールしておきます。
Windows Updateのカスタム更新で.NET Framework 2.0を追加するか、
-[[.NET Framework 2.0:http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=ja]]
-[[.NET Framework 2.0 日本語language pack:http://www.microsoft.com/downloads/details.aspx?familyid=39C8B63B-F64B-4B68-A774-B64ED0C32AE7&displaylang=ja]]
からダウンロードできます。

上記2つをインストール済みなら、[[Microsoftの.NET Frameworkのダウンロードページ:http://www.microsoft.com/japan/msdn/netframework/downloads/]]から
.NET Framework 2.0 SDK 日本語版をダウンロードし、インストールします。

*開発環境の利用 [#t13dbfdd]
ソースコードをexeファイルなどに変換するために「コンパイル」という作業が必要になります。
ソースコードをコンパイルするためのソフトウェアを「コンパイラ」と呼び、C#のコンパイラはcsc.exeです。
ソースコードはテキストエディタ(Visual C#には強力なエディタがもれなく付いてきます)で記述し、csという拡張子で保存します。
以下、それぞれの環境でのコンパイルの仕方を説明します。

**Visual C# 2005 Express Edition [#f7a9ba21]
IDEを利用したプログラムの作成方法を説明します。
Visual C#をインストールすると.NET Framework 2.0 SDKもインストールされるため、次節の.NET Framework 2.0 SDKでのやり方でもプログラムを作成可能です。

***コンソールアプリケーション [#h49520f5]
+Visual C#を起動します
+メニューの「ファイル」→「新規作成」→「プロジェクト」でプロジェクトの作成ダイアログが表示されます
+プロジェクトの種類は「Visual C#」の「Windows」、テンプレートは「コンソール アプリケーション」を選びます
+プロジェクト名は好きな名前をつけてください
+「OK」を押すとプロジェクトが生成されます
+メニューの「ビルド」→「ソリューションのビルド」でビルド(いわゆるコンパイルなどを行います)します
+メニューの「デバッグ」→「デバッグなしで開始」で作成したプログラムを実行します

***GUIアプリケーション [#v27157b5]
基本的にはコンソールアプリケーションと同じですが、プロジェクトの種類を選ぶ際に「Windows アプリケーション」を選択します。

その他、詳しい使い方はヘルプや解説書、解説サイトを参照してください。

**.NET Framework 2.0 SDK [#fd849ff9]
***コンソールアプリケーション [#a5511c98]
コマンドプロンプトでの操作が基本となります。
[[コマンドプロンプトを使ってみよう!:http://ykr414.com/dos/]]などを参考に、
「cd」「dir」くらいは使えるようになっておいてください。
コンパイラのある場所(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727)にパスが通っていませんので、必要ならばパスを通してください。
「パスを通す」の意味がわからない方は、
「スタート」→「すべてのプログラム」→「Microsoft .NET Framework SDK v2.0」→「SDK コマンドプロンプト」で起動できる、SDK コマンドプロンプトを使用しましょう。
パスを通す必要がありません。

例えばexample.csというソースをコンパイルする場合、ソースのあるフォルダに移動して
 csc example.cs
でコンパイルを実行します。
エラーがなければ、ソースコードのあるフォルダにexample.exeが生成されているはずです。ダブルクリックするか、
 example
で実行できます。

***GUIアプリケーション [#da6fdd4f]
基本的にはコンソールアプリケーションと同じですが、コンパイラに引数として/target:winexeを渡します。
MyGUI.csをコンパイルしたい場合、
 csc /target:winexe MyGUI.cs
となります。

*初めてのプログラム [#id0c4dcf]
**コンソール版Hello World [#j99ece3a]
以下のコードをコンパイルして実行してみましょう。
 using System;
 
 namespace VIP
 {
     class MyFirstApp
     {
         public static void Main()
         {
             Console.WriteLine("Hello World!");
         }
     }
 }
実行すると、コマンドプロンプトに
 Hello World!
と表示されます。
**GUI版Hello World [#i7b04644]
続いて、GUIアプリケーションも製作してみましょう。
以下のコードをコンパイルし、コマンドプロンプト上で実行するか、生成されたexeファイルをダブルクリックしてみましょう。
 using System;
 using System.Windows.Forms;
 
 namespace VIP
 {
     class MyFirstGUIApp : Form
     {
         public MyFirstGUIApp()
         {
             this.MouseClick += delegate(Object sender, MouseEventArgs e) { MessageBox.Show("Hello World!"); };
         }
        
         public static void Main()
         {
             Application.Run(new MyForm());
         }
     }
 }
ウィンドウの内側をクリックすると「Hello World」と書かれたメッセージボックスが出てくるはずです。

*C#チュートリアル(Pythonのぱくり) [#mb63807a]
**Visual Studio 2005の使い方 [#ac7d1fb8]
C#の開発はVisual Studioを使用するのが便利です。タダですしね。ただし結構重いソフトなので[[SharpDevelop:http://sharpdevelop-jp.sourceforge.jp/]]などの使用も検討しましょう。導入方法は上記の通りです。

***プロジェクト [#xc367d09]
「ファイル」→「新しいプロジェクト」で新しいプロジェクトを作ることが出来ます。ソフトウェアは普通複数のソースファイルやリソースなどから構成されます。それらを1つにまとめて扱うものがプロジェクトです。1アプリ1プロジェクトが普通でしょうか。

新しいプロジェクトにはいろいろ種類があります。スクリーンセーバースタートキットとムービーコレクションスタートキットはサンプルプログラムです。オンラインテンプレートの検索は機能してません(笑)。

これからのチュートリアルではWindowsアプリケーションとコンソールアプリケーションを使います。それぞれ[[GUI:http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9]]と[[CUI:http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%82%AB%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9]]に相当します。作るアプリケーションによってどちらかを選択します。

まずはコンソールアプリケーションを選択しましょう。

***ソリューションエクスプローラ [#r440f567]
右側にソリューションエクスプローラがあります。ここはソリューション(今はプロジェクトと同義だと思ってください)に存在しているファイルなどが表示されます。.csのファイルがC#のソースです。

***編集画面 [#nc4f5ad2]
真ん中のコードが表示されている画面を編集画面といいます。コードなどはここに表示され、編集することになります。タブもついています。

***HelloWorld [#vde94afe]
HelloWorldを作成しましょう。Program.csが開いていると思いますが、そこに書き足します。

C#は最初の"おまじない"が多い言語だと思います。あとからいろいろ解説します。とりあえずVSが自動で作ってくれるので置いておきましょう。

static void Main(string[] args)を探しましょう。ここがプログラムが最初に実行される場所になります。{}の中に命令を書くことになります。文字を表示する命令は System.Console.WriteLine("HelloWorld"); です(長い^^)。

***IntelliSense [#a2195f00]
VSにはIntelliSenseと呼ばれる入力を補助してくれる機能があります。Sから入力すると候補が絞られていきます。.やTabと打つと残りは自動で入力されます。そこでまたConsoleと打っていきます。以下同様。この機能をうまくつかうとスペルミスなどを防げるので積極的に使用しましょう。

***コードスニペット [#xaeb902f]
それでも表示するだけなのに長い^^ 。そのためコードスニペットというものが用意されています。Ctrl+k , Ctrl+x , cw , Enter と打つとあら不思議!

***実行 [#td974dc9]
「デバッグ」→「デバッグ開始」またはF5または緑の三角ボタンで実行できます。
ただすぐに画面が消えてしまいますのでデバッグなしで実行をすると表示された画面を確認できます。

***Windowsアプリケーション [#v445c96b]
次にWindowsアプリケーションを作成しましょう。新しいプロジェクトを作成します。すると編集画面にコードではなくウィンドウが表示されたと思います。これはデザイナといいます。左のツールボックスには部品が納められています。適当にButtonなどをフォームにドラッグしてみましょう。ボタンが追加されましたか?大きさや位置の変更なども出来ます。

***プロパティウィンドウ [#n9a8c3a0]
右側にプロパティと書かれた場所がると思います。ここはボタンを選択したらボタンの設定を変更したり出来ます。試しにBackColorを変更してみましょう。

***実行 [#xd925912]
実行はコンソールアプリケーションと一緒です。F5でおk

**表示 [#zece29b7]
***文字の表示 [#hd4a5707]
文字の表示はさっきと同じ
System.Console.WriteLine(); です。()の中に"HelloWorld"と書くと画面にHelloWorldと表示されます。文字は""で囲むことになってます。お兄さんとのお約束だ。

***計算しよう [#p3e07ba0]
()の中にかけるのは文字だけではありません。8+5と書いてみましょう。(""はつけてはいけません 数字なので)。13と表示されましたか?掛け算は* 割り算は/の記号を使います。コンピュータの世界のしきたりです。郷に入っては郷に従いましょう。

**変数 [#p48dfbfb]
変数とはデータを保存しておく箱のようなものです。です。型名とは保存するデータの種類のことです。文字列は string 整数はintなどがあります。先ほどのWriteLineを消して
 string message = "働け";
 System.Console.WriteLine(message);
にしてみましょう 。messageという単語ではなくて働けとでましたね?これが変数です。

***いろいろな型 [#i2869e59]
intは整数型です。整数を入れることが出来ます。整数なので小数点がつく数などは入れられません。

doubleは倍精度浮動小数点とか小難しい名前がついてますが小数点とかいれられます。

***変数の宣言 [#sdb4f370]
 int hankei;
とすればhankeiというint型の変数を用意することが出来ます。これを''変数の宣言''と
いいます。書式は
 型名 変数名 (=初期値);
です。宣言は変数を使う前に1回だけ必ずする必要があります。

***代入 [#h8f06ea2]
変数に値を入れることを''代入''といいます。
 変数名 = データ;
左に変数名、右に入れたいデータを書きます。右から左に向かって値が入ることになります。数学の=(等号)とは意味が違うので注意してください。hankeiに30を入れたいときは
 hankei = 30;
と書きます。

***変数の利用 [#g9c8a4c6]
数値型の変数は計算に使ったりできます。例を示します。
 int a = 30;
 int b = 10;
 int c;
 
 //cの中身は40になる
 c = a + b;

**構文 [#r4b03710]
***for構文 [#o649d366]
たとえば1から10まで順に足していきたいというように、何かを繰り返したいという事があります。その時に使うのがforです。
 for(初期値の式;繰り返し条件;増減){}
実際に例を見たほうが早いでしょう。1から10を足すプログラムです。
 int result = 0; //答えを入れます。

 for(int i=1; i <= 10; i++)
 {
  result += i;
 }
いきなり特殊な書き方をしてしまいましたが少しづつ解説します。
まずint i=0の文はforに入る前に1回だけ実行されます。何回回ったかを数えるカウンタです。名前はなんでもいいのですが慣例的にiなどが使われます。

i <= 10 は繰り返し条件です。iの値が10以下の間繰り返しなさいということです。

i++は省略した書き方でiに1を足しなさいという命令です。よく使いますので覚えておきましょう。ループが1回まわる度に実行されるのでiがループの回数を数えていることになりますね。

result += iはresult = result + iの省略した形です。1+2+3+4+5+6+7+8+9+10をしている事が分かるでしょうか?わからない場合は悩んで下さい^^

***if構文 [#tf5c0e20]
ifは条件分岐構文と呼ばれます。こういうときはこうするなど条件によって処理の内容を変えたいとき使います。
 if(条件式)
 {
  真のときの内容
 }
 else
 {
  偽のときの内容
 }
elseは無くてもかまいません。以下にサンプルを示します。

 string zokusei = "neet";
 
 if(zokusei == "neet")
 {
  System.Console.WriteLine("負け組");
 }
 else
 {
  System.Console.WriteLine("勝ち組");
 }
==は数学でいう=(等号)です。左右のものが等しいか見ています。
zokuseiがneetなら負け組と表示し、それ以外なら勝ち組と表示します。

**メソッド(関数) [#me04bbc9]
プログラミングにおける関数は数学の関数と似ています。たとえばx = log 10ならxは1ですね。このときのlogを対数関数と呼びます。この関数は10を入れたら1が返ってくると考えることが出来ます。この最初に渡す情報を''引数(ひきすう)''といい、返ってくる値のことを''戻り値''または''返り値''と呼びます。

関数の宣言
 戻り値の型 関数名(引数のリスト)

では先ほどの1から10まで足す動作を関数化しましょう。

 int dondontasu()
 {
  for(int i=1; i <= 10; i++)
  {
   result += i;
  }
 
  return result
 }
好きなところでdondontasu()を呼び出してあげれば1から10まで足した数を取得できます。returnの後は戻り値を書きます。しかしこれではあまり汎用性がありません。1からnまで足す関数に改造しましょう。
 int dondontasu(int n)
 {
  for(int i=1; i <= n; i++)
  {
   result += i;
  }
 
  return result
 }
実際に呼び出すときは
 int a;
 a = dondontasu(10);
 
 System.Console.WriteLine(a);
のように呼び出します。

**プロパティ [#p0257199]
さてC#の特徴としてプロパティがあります。いわゆるアクセッサです。外からは変数のように見えますが、内部では関数のように振舞います。例を見てみましょう。
 public string name
 {
  get
  {
   return this.myName;
  }
  set
  {
    if(value != null)
     this.myName = value;
  }
 }
外部から利用するときはhoge.nameのように変数ぽく利用できます。またgetだけ書くと読み取り専用になります。見やすいですね。

**オブジェクト指向 [#u5340645]
C#では言語仕様でオブジェクト指向が強力にサポートされています。本格的な勉強は他に譲るとしてここでは簡単に解説します。

***概念 [#v0465f16]
オブジェクト指向とは僕はよくLEGOブロックに例えます。既に用意されたブロックを組み合わせていくようにプログラムすることと言えるかもしれません。

*サンプルプログラム1 アナログ時計 [#f0b14c49]
**目的 [#ra3de55e]
このプログラムでは関数、グラフィックス、イベント、数学などをさらっと学んでもらう。これはゲームなんかにも応用できるので学んで損はないはずだ。

ちなみに数学は高校レベルのだけど偏差値40の俺が教えるから泥舟に乗ったつもりでよろしく

わからないところは本スレで聞けばOK

**概要 [#u9863857]
プログラムは次のような感じになる。頭に入れておこう
+1秒おきに鳴るタイマーをセット(イベント)
+タイマーが鳴ると時刻を取得
+針を描画
+以下繰り返し

**実習 [#w36f9d19]
***タイマーをセットする [#r00a3353]
まずは普通にwindowsアプリケーションを選んで準備しよう。今回は簡単のため300×320の決め打ちでいきます。Form1のプロパティ 配置のところのsizeを300,320にしてください

次はタイマーコントロールを設置します。左のツールボックスからTimerをダブルクリック。Timerコントロールのintervalプロパティを1000に(単位はミリ秒なので)

できたtimer1をダブルクリックすれば
 private void timer1_Tick(object sender, System.EventArgs e){・・・
が勝手に作られているはずです。これが1秒ごとに呼び出されます。本当はいろいろ書かないといけないけどVisual Studioはなんと''全自動''。楽しちゃえ

ここで画面を更新してあげればいいですね。
 private void timer1_Tick(object sender, System.EventArgs e)
 {
    this.Refresh();
 }

***時刻を取得 [#j9a7cf80]
まずはPaintイベントを受け取りましょう。
 private void Form1_Paint(object sender,  System.Windows.Forms.PaintEventArgs e)
 {
 }
IDEならマウスだけでいけますね。これからは{}の中に書いていきます。

時刻の取得はDateTime.Nowでできます。
 DateTime dt = DateTime.Now;
でdt.Hourで時刻が取り出せます。以下同様

***描画の準備 [#y0e3216c]
まずキャンパスを準備しましょう。
 Graphics g = e.Graphics;
 g.Clear(Color.White);
ここではgがキャンパスです。1行目でキャンパスを取得して、2行目で白で塗りつぶしてます。これで準備完了

***数学のお勉強 [#j002f5e8]
今回は簡単のため針は線で描きます。線は始点と終点がわかれば描けます。始点は中心の(150,150)に今回はしましょう。お勉強するのは終点の求め方です。図で適当に解説します

#ref(fig1.gif)

 private Point calc_endPoint(int r,int t,int interval)
 {
   //r:半径 t:時間 interval|目盛りの間隔
   double cof = 2*Math.PI/interval;
 
   int x = (int)(r*Math.Sin(cof*t))+center.X;
   int y = (int)(-r*Math.Cos(cof*t))+center.Y;
 
   return new Point(x,y);
 }
終点を求める関数はこんな感じ。rは長さですね
 private readonly Point center = new Point(150,150);
は適当に用意しといてください

***針を描画 [#v9a8572c]
DrawLineの使い方はMSDNでも見てもらうとしてこんな感じ
 g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(100,dt.Hour,12));	//時
 g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint(130,dt.Minute,60));  //分
 g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(130,dt.Second,60));   //秒
色は見やすいように適当に。3や1のところが太さですね。後ろの引数は始点と終点を表してます。

***ソース全景 [#a06b7188]
	//ここは自動で書かれると思います 結構省略してます
	private System.Windows.Forms.Timer timer1;
	
	private void InitializeComponent()
	{
		this.timer1.Enabled = true;
		this.timer1.Interval = 1000;
		this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
	
		this.ClientSize = new System.Drawing.Size(292, 286);
	}
	
	//こっから書いてね
	private readonly Point center = new Point(150,150);
	
	private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
	{
		DateTime dt = DateTime.Now;
	
		Graphics g = this.CreateGraphics();
		g.Clear(Color.White);
	
		g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(100,dt.Hour,12));	//時
		g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint(130,dt.Minute,60));  //分
		g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(130,dt.Second,60));   //秒
	}
	
	
	private Point calc_endPoint(int r,int t,int interval)
	{
		//r:半径 t:時間 interval|目盛りの間隔
		double cof = 2*Math.PI/interval;
	
		int x = (int)(r*Math.Sin(cof*t))+center.X;
		int y = (int)(-r*Math.Cos(cof*t))+center.Y;
	
		return new Point(x,y);
	}
	
	private void timer1_Tick(object sender, System.EventArgs e)
	{
		this.Refresh();
	}

**最後に [#xe303871]
ファイル添付できるようになったら図とかソースとうpします
間違ってたら書き直してくれ

文字盤とかは簡単にできるはずなんで自分で用意してやってみてください

*参考文献 [#n3993ce9]
**参考サイト [#u4b676a8]
-C#入門
--初心者向け
---[[C# によるプログラミング入門:http://ufcpp.net/study/csharp/]]
--プログラミング経験者向け
---[[@IT 連載 改訂版 C#入門:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/index.html]]
-Tips、テクニック集
--[[C#,VB.NET入門:http://jeanne.wankuma.com/]]
--[[C# Tips:http://www.woodensoldier.info/computer/CSharp.htm]]
--[[矢沢久雄の早わかりGoFデザインパターン:http://itpro.nikkeibp.co.jp/article/COLUMN/20051201/225570/]]
**参考書籍 [#rb492f41]
-C#入門
--初心者向け
---独習C# 第2版(ハーバート・シルト著、翔泳社)
--プログラミング経験者向け
---プログラミングC# 第4版(Jesse Liberty 著、オライリー)

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS