Lets Enjoy C#!1. Let’s Enjoy C#!
まさる@わんくま同盟
http://blogs.wankuma.com/masaru/
わんくま同盟 http://www.wankuma.com/
2. 自己紹介
• ハンドル まさる
• 性別 見ての通り♂
SE兼プログラマ(C#がメイン)
• 職業
• 趣味
– 楽器演奏 バスクラリネット
– 読書
• 小説
• 技術書
• ビジネス書
わんくま同盟 http://www.wankuma.com/
6. C#ってどんなの?
• Microsoftが.NET構想用に開発
– 開発の中心はDelphiの祖”アンダース・ヘル
スバーグ”
• CLSに準拠した.NET Framework用の言語
– ECMA、JISによって言語仕様は標準化されてい
る
• C/C++、Java、VB、Pascalなど、さまざま
な言語の仕様を取り込んでいる
わんくま同盟 http://www.wankuma.com/
7. C#ってどんなの?
• C#の文法
– いわゆる”中括弧言語”
• C、Javaに似ている
• Javaな人は取っ組みやすい
・・・けど、違う部分もあるので注意
わんくま同盟 http://www.wankuma.com/
8. C#ってどんなの?
• Javaとの文法の違い
– 文字列の比較
• JavaではString.equalsメソッドを用いる
String hoge = “fuga”;
if ( “target”.equals(hoge) ) {
System.out.println(“Hit!”);
}
• C#では、string型は==で比較する
string hoge = “fuga”;
if ( hoge == “target” )
{
Console.WriteLine(“Hit!”);
}
わんくま同盟 http://www.wankuma.com/
9. C#ってどんなの?
• Javaとの文法の違い
– forとforeach
String[] strArray = new String[] {
“hoge”, “foo”, “bar” };
for ( String item : strArray ) {
System.out.println(item);
}
string[] strArray = new string[] {
“hoge”, “foo”, “bar” };
foreach ( string item in strArray )
{
Console.WriteLine(item);
}
わんくま同盟 http://www.wankuma.com/
10. C#ってどんなの?
• Javaとの文法の違い
– switchで使用できる型
• Javaは整数型か列挙型
• C#は文字列も可能
int hoge; string hoge;
switch ( hoge ) { switch ( hoge )
case 1 : {
break; case “a” :
break;
case 2 :
break; case “b” :
} break;
}
わんくま同盟 http://www.wankuma.com/
11. C#ってどんなの?
• Javaとの文法の違い
– メソッドのオーバーライド
• Javaは既定でオーバーライド可能
• C#は既定でオーバーライド不可
class Parent { class Parent {
public void hoge() { public virtual void Hoge() {
} }
} }
class Child extends Parent { class Child : Parent {
public void hoge() { public override void hoge() {
} }
} }
わんくま同盟 http://www.wankuma.com/
12. C#ってどんなの?
• C#の型
– 値型
• 値自体を格納する型
• ValueType構造体を派生した型
• int、datetimeなど
– 参照型
• 値への”参照”を格納する型
• Objectクラスを派生した型
• string、配列など
わんくま同盟 http://www.wankuma.com/
13. C#ってどんなの?
• C#の型
– 値型
1 int a;
2 int b;
3 a = 1;
1 2 3
a a a
1
101 101 101
b
b
102 102 102
103 103 103
104 104 104
105 105 105
わんくま同盟 http://www.wankuma.com/
14. C#ってどんなの?
• C#の型
– 参照型
1 string a;
2 string b;
3 a = “hoge”;
1 2 3
a a a
address:104
101 101 101
b
b
102 102 102
103 103 103
h
104 104 104
o
105 105 105
:
わんくま同盟 http://www.wankuma.com/
15. C#ってどんなの?
• C#独特の仕様
– プロパティ
• クラスのフィールドへのアクセサ
– Javaではgetter、setterメソッドで実現
public class MyClass
{
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; }
}
}
わんくま同盟 http://www.wankuma.com/
16. C#ってどんなの?
• C#独特の仕様
– プロパティ
• setのみ、getのみでwrite only、read only
write only read only
public class MyClass public class MyClass
{ {
private string name; private string name;
public string Name public string Name
{ {
set { this.name = value; } get { return this.name; }
} }
} }
わんくま同盟 http://www.wankuma.com/
17. C#ってどんなの?
• C#独特の仕様
– プロパティ
• get、setそれぞれにアクセス修飾子指定可能
getのみ公開
public class MyClass
{
private string name;
public string Name
{
get { return this.name; }
private set { this.name = value; }
}
}
わんくま同盟 http://www.wankuma.com/
18. C#ってどんなの?
• C#独特の仕様
– delegate(デリゲート):移譲
• Cで言う関数ポインタ
• メソッドへの”参照”を保持する型
• 用途
– クラスでなくメソッド単位で、ロジックを切り替えるた
め(Strategyパターン)
– 後述するイベント(Observerパターン)
– etc...
わんくま同盟 http://www.wankuma.com/
19. C#ってどんなの?
• C#独特の仕様
– delegate(デリゲート):移譲
delegate void MyDelegate(string s); static void Main(string[] args)
{
static void Method1(string s) MyDelegate myDelegate;
{
// ~ if (IsA)
} {
myDelegate = Method1;
static void Method2(string value) }
{ else
// ~ {
} myDelegate = Method2;
}
myDelegate(quot;hogequot;);
}
わんくま同盟 http://www.wankuma.com/
20. C#ってどんなの?
• C#独特の仕様
– event(イベント)
• オブジェクトの内部の状態が変更を外部に通知す
る仕組み
– いわゆるObserverパターン
– 前述のデリゲートを使って、ある状態になったとき呼び
出されるメソッドを登録する
わんくま同盟 http://www.wankuma.com/
21. C#ってどんなの?
• C#独特の仕様
– event(イベント)
public Form1()
{
InitializeComponent();
this.button1.Click += Method1;
this.button1.Click += Method2;
}
private void Method1(object sender, EventArgs e)
{
}
private void Method1(object sender, EventArgs e)
{
}
わんくま同盟 http://www.wankuma.com/
22. C#ってどんなの?
• C#独特の仕様
– Attribute(属性)
• 型、メンバにメタデータを付加する
– 例えばシリアライズ可能なクラス
» JavaはSerializableインターフェイス実装
» C#はSerializable属性を付加
[Serializable]
public class MySerializableClass
{
public Hoge = “”;
}
わんくま同盟 http://www.wankuma.com/
23. C#ってどんなの?
• C#独特の仕様
– Attribute(属性)
• 他には・・・
– デザイナサポート
– NUnitのテストクラス、メソッド
– etc...
• メタデータなので、適用範囲は無限大
– 設定した属性はリフレクションで取得可能
わんくま同盟 http://www.wankuma.com/
24. C#ってどんなの?
• C#独特の仕様
– ポインタ
• C、C++などと同等のもの
• ただし、利用可能となる条件は厳しい
– コンパイルオプション「/unsafe」の指定
– unsafeブロック、もしくはunsafeキーワードがつけられ
たブロック内
わんくま同盟 http://www.wankuma.com/
25. C#ってどんなの?
• C#独特の仕様
– ポインタ
public void MyMethod()
{
unsafe
{
int* hoge = null;
int a = 1;
hoge = &a;
}
}
わんくま同盟 http://www.wankuma.com/
27. C#の歩み
• 2002年 C# 1.0
– 記念すべき最初のバージョン
– これまで説明したような機能が盛り込まれた
わんくま同盟 http://www.wankuma.com/
28. C#の歩み
• 2003年 C# 1.2
– .NET Framework 1.1 に合わせてバージョンア
ップ
– 変更箇所
• バグフィックスが主
わんくま同盟 http://www.wankuma.com/
29. C#の歩み
• 2005年 C# 2.0
– .NET Framework 2.0 に合わせてバージョンア
ップ
• 様々な言語仕様が追加された
– C#は2.0からといっても過言ではない
– 変更箇所
• ジェネリクス
• 匿名メソッド
• partialクラス
• staticクラス
• null許容型
わんくま同盟 http://www.wankuma.com/
30. C#の歩み
• C# 2.0 の新機能
– ジェネリクス
• クラスの内部で使用する型をパラメータで指定
• あらゆる型を用いた共通処理を記述可能
• おもな適用先
– List等のコレクション
わんくま同盟 http://www.wankuma.com/
31. C#の歩み
• C# 2.0 の新機能
– ジェネリクス
非ジェネリック ジェネリック
public void Main() public void Main()
{ {
ArrayList list = List<string> list =
new ArrayList(); new List<string>();
list.Add(“hoge”); list.Add(“hoge”);
list.Add(“foo”); list.Add(“foo”);
list.Add(“bar”); list.Add(“bar”);
// キャストが必要 // キャストが不要
string item = (string)list[1]; string item = list[1];
} }
わんくま同盟 http://www.wankuma.com/
32. C#の歩み
• C# 2.0 の新機能
– 匿名メソッド
• メソッドを定義せず、直接デリゲートに処理を格
納できる
• 匿名メソッドの内部では、外のスコープのローカ
ル変数も使える
つまり、クロージャ(Closure)
わんくま同盟 http://www.wankuma.com/
33. C#の歩み
• C# 2.0 の新機能
• 匿名メソッド
コード 実行結果
delegate MyDelegate(string s); hoge
public void Main() hoge
{ hoge
int num = 5; hoge
MyDelegate mydlg = delegate(string s) { hoge
for ( int i = 0; i < num; i++ )
{
Console.WriteLine(s);
}
};
mydlg(“hoge”);
}
わんくま同盟 http://www.wankuma.com/
34. C#の歩み
• C# 2.0 の新機能
– partialクラス(部分クラス)
• 一つのクラスの定義を複数の箇所で記述できる
• 用途
– デザイナ生成部分とビジネスロジックを分けて記述
– 対象オブジェクトごとにコードを分けて記述
– etc...
わんくま同盟 http://www.wankuma.com/
35. C#の歩み
• C# 2.0 の新機能
– partialクラス
Hoge.Designer.cs Hoge.cs
public class Hoge : Form public partial class Hoge
{ {
private TextBox nameTextBox = private nameTextBox_Click
new TextBox(); (object sender, EventArgs e)
{
this.Controls.Add(nameTextBox); MessageBox.Show(
nameTextBox.Text);
this.nameTextBox.Click += }
nameTextBox_Click; }
}
わんくま同盟 http://www.wankuma.com/
36. C#の歩み
• C# 2.0 の新機能
– staticクラス(静的クラス)
• インスタンス化不可のクラス
• staticなメンバのみ持てる
• 利用方法
– 算術計算など、インスタンス化不要なメソッド群を定義
する、など
わんくま同盟 http://www.wankuma.com/
37. C#の歩み
• C# 2.0 の新機能
– staticクラス
public static MyStaticClass
{
public static int Count;
public static void MyStaticMethod()
{
}
}
わんくま同盟 http://www.wankuma.com/
38. C#の歩み
• C# 2.0 の新機能
– null許容型(Nullableクラス)
• null代入が可能な値型
– 通常の値型はnull代入不可
わんくま同盟 http://www.wankuma.com/
39. C#の歩み
• C# 2.0 の新機能
– null許容型
public void Main()
{
int? a = null;
int b = a *2 ?? 0; // ??:左項がnullの場合、右項を適用
Nullable<decimal> c = null; // これでもよい
}
わんくま同盟 http://www.wankuma.com/
40. C#の歩み
• 2008年 C# 3.0
– .NET Framework 3.5 に合わせてバージョンア
ップ
• 数々の生産性が上がるような仕様が追加された
– 変更箇所
• 型推論
• ラムダ式
• 匿名型
• オブジェクト初期化子、コレクション初期化子
• 自動プロパティ
• LINQ
わんくま同盟 http://www.wankuma.com/
41. C#の歩み
• C# 3.0 の新機能
– 型推論
• 型を指定せずに変数が書ける
• ただし制限事項がある
– ローカル変数のみ
– 同時に変数の初期化を行う必要あり
– 初期化する際、型が一意に定まる
わんくま同盟 http://www.wankuma.com/
42. C#の歩み
• C# 3.0 の新機能
– 型推論
public void Main()
{
var s = “hoge”; // string型
var a = 100; // int型
var f = 1.1; // double型
s = 100; // コンパイルエラー
// すでに型が定まった変数に別の型の値は入れられない
var dic = new Dictionary<string, List<decimal>>();
// こういう長い名前の型を左辺に指定しなくてもよくなる
}
わんくま同盟 http://www.wankuma.com/
43. C#の歩み
• C# 3.0 の新機能
– ラムダ式
• 匿名メソッドのsyntax sugar
• デリゲートの記述方法の一つ
– ラムダ式という概念についてはWikipediaあたりを参照し
てください(^^;
ラムダ式を使うとクロージャが簡単に書
ける!
わんくま同盟 http://www.wankuma.com/
44. C#の歩み
• C# 3.0 の新機能
– ラムダ式 ※Rubyでの同等の記述
public void Main() coll = [
{ “hoge”
var list = new List<string>(); ,”foo”
list.Add(“hoge”); ,”bar” ]
list.Add(“foo”);
list.Add(“bar”); coll.each { |s|
puts “名前:” + s
list.ForEach( }
s => Console.WriteLine(“名前:” + s)
);
}
わんくま同盟 http://www.wankuma.com/
45. C#の歩み
• C# 3.0 の新機能
– 匿名型
• スコープ内でのみ使用可能な型を定義
• 型推論を使用した場合のみ使える
わんくま同盟 http://www.wankuma.com/
46. C#の歩み
• C# 3.0 の新機能
– 匿名型
public void Main()
{
var taro = new { Name = “太郎”, Age = 27, Sex = “男” };
Console.WriteLine(“私の名前は{0}です。”
+ “年は{1}です。”
+ “性別は見ての通り{2}です。”
,taro.Name
,taro.Age
,taro.Sex
);
}
わんくま同盟 http://www.wankuma.com/
47. C#の歩み
• C# 3.0 の新機能
– 自動プロパティ
• privateフィールドを自動的に用意してくれる
• get,setそれぞれアクセス指定可能
わんくま同盟 http://www.wankuma.com/
48. C#の歩み
• C# 3.0 の新機能
– 自動プロパティ
public class Employee
{
public string Name { get; set; }
public string Organization { get; set; }
}
わんくま同盟 http://www.wankuma.com/
49. C#の歩み
• C# 3.0 の新機能
– オブジェクト初期化子
• オブジェクトのプロパティを簡単に初期化できる
構文
– コレクション初期化子
• コレクションの要素を簡単に初期化できる構文
わんくま同盟 http://www.wankuma.com/
50. C#の歩み
• C# 3.0 の新機能
– オブジェクト初期化子、コレクション初期化子
public void Main()
{
var empList = new List<Employee> {
new Employee { Name = “太郎”, Organization = “ほげCorp.” }
,new Employee { Name = “次郎”, Organization = “ふが商店” }
,new Employee { Name = “花子”, Organization = “ぱよストア” }
};
}
わんくま同盟 http://www.wankuma.com/
51. C#の歩み
• C# 3.0 の新機能
– LINQ
• 様々なオブジェクトをターゲットに、クエリ式で
アクセスできる
– Object
– XML
– SQL
これまで紹介した新機能は、
すべてLINQのためのもの
わんくま同盟 http://www.wankuma.com/
52. C#の歩み
• C# 3.0 の新機能
– LINQ
public void Main()
{
var emps = new List<Employee> {
new Employee { Name = “太郎”, Organization = “ほげCorp.” }
,new Employee { Name = “次郎”, Organization = “ふが商店” }
,new Employee { Name = “花子”, Organization = “ぱよストア” }
};
var query = from emp in emps
where emp.Name.EndWith(“郎”)
select new { EmpName = emp.Name, EmpOrg = emp.Organization };
query.ForEach(emp => Console.WriteLine(emp.EmpName));
}
わんくま同盟 http://www.wankuma.com/
53. C#の歩み
• 2009年? C# 4.0
– Visual Studio 2010の発表に合わせてリリース
予定
– 追加される機能の予定
• 動的型付変数
– 動的言語のように書ける?
• 並列処理のサポート
– マルチスレッドプログラミングを簡単に
詳細は割愛!
わんくま同盟 http://www.wankuma.com/
55. C#のすごいところ
• 思考→プログラムに落とし込みやすい
– 型推論、ラムダ式、LINQなどを使うと、ロジ
ック以外の雑多なことから解放される
• なんといってもデリゲート
– プログラムをクラスという縛りから解放して
くれる
– ラムダ式を使えば簡単に書ける
わんくま同盟 http://www.wankuma.com/
58. まとめ
• C#はWindowsの現実を踏まえたごった煮言
語(©猪俣健太郎さん)
– 低レベルから高レベルまで幅広くカバー
• 機能は豊富だが使いやすく設計されている
– 怖くないよ!
• 特にC# 3.0で追加された仕様群は生産性を
数倍アップさせてくれる
– 可能性を秘めている・・・
わんくま同盟 http://www.wankuma.com/
61. 参考資料
• C#の現在・過去・未来
(わんくま同盟勉強会 東京#23 - えムナウさん)
http://www.wankuma.com/seminar/20080809tokyo23/Default.aspx
• 解題:私がJavaからC#に乗り換えた10の理由
(わんくま勉強会東京 #26 LT – 猪俣健太郎さん)
http://d.hatena.ne.jp/matarillo/20081116/p1
• Visual C# - MSDN Library
http://msdn.microsoft.com/ja-jp/library/kx37x362(VS.80).aspx
• C# - Wikipedia
http://ja.wikipedia.org/wiki/C_Sharp
わんくま同盟 http://www.wankuma.com/