lets enjoy c#!
TRANSCRIPT
わんくま同盟 http://www.wankuma.com/
Let’s Enjoy C#!
まさる@わんくま同盟
http://blogs.wankuma.com/masaru/
わんくま同盟 http://www.wankuma.com/
自己紹介
• ハンドルまさる• 性別 見ての通り♂
• 職業 SE兼プログラマ(C#がメイン)• 趣味
– 楽器演奏 バスクラリネット
– 読書•小説•技術書•ビジネス書
わんくま同盟 http://www.wankuma.com/
詳しくは…
まさるblogでググってくださいませ<(_ _)>
わんくま同盟 http://www.wankuma.com/
Agenda
• C#ってどんなの?• C#の歩み• C#のすごいところ
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• Microsoftが.NET構想用に開発– 開発の中心はDelphiの祖”アンダース・ヘルスバーグ”
• CLSに準拠した.NET Framework用の言語– ECMA、JISによって言語仕様は標準化されている
• C/C++、Java、VB、Pascalなど、さまざまな言語の仕様を取り込んでいる
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#の文法– いわゆる”中括弧言語”
• C、Javaに似ている• Javaな人は取っ組みやすい
・・・けど、違う部分もあるので注意
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• Javaとの文法の違い– 文字列の比較
• JavaではString.equalsメソッドを用いる
• C#では、string型は==で比較する
String hoge = “fuga”;if ( “target”.equals(hoge) ) { System.out.println(“Hit!”);}
string hoge = “fuga”;if ( hoge == “target” ){ Console.WriteLine(“Hit!”);}
わんくま同盟 http://www.wankuma.com/
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/
C#ってどんなの?
• Javaとの文法の違い– switchで使用できる型
• Javaは整数型か列挙型• C#は文字列も可能
int hoge;switch ( hoge ) { case 1 : break;
case 2 : break;}
string hoge;switch ( hoge ){ case “a” : break;
case “b” : break;}
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• Javaとの文法の違い– メソッドのオーバーライド
• Javaは既定でオーバーライド可能• C#は既定でオーバーライド不可
class Parent { public void hoge() { }}
class Child extends Parent { public void hoge() { }}
class Parent { public virtual void Hoge() { }}
class Child : Parent { public override void hoge() { }}
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#の型– 値型
•値自体を格納する型• ValueType構造体を派生した型• int、datetimeなど
– 参照型•値への”参照”を格納する型• Objectクラスを派生した型• string、配列など
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#の型– 値型
1 int a;2 int b;3 a = 1;
a a
1 2
1 a
3
b b101
102
103
104
105
101
102
103
104
105
101
102
103
104
105
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#の型– 参照型
1 string a;2 string b;3 a = “hoge”;
a a
1 2
address:104
ho
a
3
b b101
102
103
104
105
101
102
103
104
105
101
102
103
104
105
:
わんくま同盟 http://www.wankuma.com/
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/
C#ってどんなの?
• C#独特の仕様– プロパティ
• setのみ、getのみでwrite only、read only
public class MyClass{ private string name; public string Name { set { this.name = value; } }}
write only
public class MyClass{ private string name; public string Name { get { return this.name; } }}
read only
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– プロパティ
• get、setそれぞれにアクセス修飾子指定可能
public class MyClass{ private string name; public string Name { get { return this.name; } private set { this.name = value; } }}
getのみ公開
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– delegate(デリゲート):移譲
• Cで言う関数ポインタ•メソッドへの”参照”を保持する型•用途
– クラスでなくメソッド単位で、ロジックを切り替えるため(Strategyパターン)
– 後述するイベント(Observerパターン)– etc...
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– delegate(デリゲート):移譲
delegate void MyDelegate(string s);
static void Method1(string s){ // ~}
static void Method2(string value){ // ~}
static void Main(string[] args){ MyDelegate myDelegate;
if (IsA) { myDelegate = Method1; } else { myDelegate = Method2; } myDelegate("hoge");}
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– event(イベント)
•オブジェクトの内部の状態が変更を外部に通知する仕組み
– いわゆるObserverパターン– 前述のデリゲートを使って、ある状態になったとき呼び出されるメソッドを登録する
わんくま同盟 http://www.wankuma.com/
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/
C#ってどんなの?
• C#独特の仕様– Attribute(属性)
•型、メンバにメタデータを付加する– 例えばシリアライズ可能なクラス
» JavaはSerializableインターフェイス実装» C#はSerializable属性を付加
[Serializable]public class MySerializableClass{ public Hoge = “”;}
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– Attribute(属性)
•他には・・・– デザイナサポート– NUnitのテストクラス、メソッド– etc...
•メタデータなので、適用範囲は無限大– 設定した属性はリフレクションで取得可能
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– ポインタ
• C、C++などと同等のもの•ただし、利用可能となる条件は厳しい
– コンパイルオプション「/unsafe」の指定– unsafeブロック、もしくはunsafeキーワードがつけられたブロック内
わんくま同盟 http://www.wankuma.com/
C#ってどんなの?
• C#独特の仕様– ポインタ
public void MyMethod() { unsafe { int* hoge = null; int a = 1; hoge = &a; } }
わんくま同盟 http://www.wankuma.com/
C#の歩み
わんくま同盟 http://www.wankuma.com/
C#の歩み
• 2002年 C# 1.0– 記念すべき最初のバージョン– これまで説明したような機能が盛り込まれた
わんくま同盟 http://www.wankuma.com/
C#の歩み
• 2003年 C# 1.2– .NET Framework 1.1 に合わせてバージョンアップ
– 変更箇所•バグフィックスが主
わんくま同盟 http://www.wankuma.com/
C#の歩み
• 2005年 C# 2.0– .NET Framework 2.0 に合わせてバージョンアップ•様々な言語仕様が追加された
– C#は2.0からといっても過言ではない
– 変更箇所•ジェネリクス• 匿名メソッド
• partialクラス• staticクラス• null許容型
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– ジェネリクス•クラスの内部で使用する型をパラメータで指定•あらゆる型を用いた共通処理を記述可能
• おもな適用先– List等のコレクション
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– ジェネリクス
public void Main(){ ArrayList list = new ArrayList(); list.Add(“hoge”); list.Add(“foo”); list.Add(“bar”);
// キャストが必要 string item = (string)list[1];}
public void Main(){ List<string> list = new List<string>(); list.Add(“hoge”); list.Add(“foo”); list.Add(“bar”);
// キャストが不要 string item = list[1];}
非ジェネリック ジェネリック
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– 匿名メソッド•メソッドを定義せず、直接デリゲートに処理を格納できる
• 匿名メソッドの内部では、外のスコープのローカル変数も使える
つまり、クロージャ(Closure)
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能• 匿名メソッド
delegate MyDelegate(string s);public void Main(){ int num = 5; MyDelegate mydlg = delegate(string s) { for ( int i = 0; i < num; i++ ) { Console.WriteLine(s); } }; mydlg(“hoge”);}
hogehogehogehogehoge
コード 実行結果
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– partialクラス(部分クラス)• 一つのクラスの定義を複数の箇所で記述できる
•用途– デザイナ生成部分とビジネスロジックを分けて記述
– 対象オブジェクトごとにコードを分けて記述
– etc...
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– partialクラス
public class Hoge : Form{ private TextBox nameTextBox = new TextBox();
this.Controls.Add(nameTextBox);
this.nameTextBox.Click += nameTextBox_Click;}
public partial class Hoge{ private nameTextBox_Click (object sender, EventArgs e) { MessageBox.Show( nameTextBox.Text); }}
Hoge.Designer.cs Hoge.cs
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– staticクラス(静的クラス)•インスタンス化不可のクラス• staticなメンバのみ持てる•利用方法
– 算術計算など、インスタンス化不要なメソッド群を定義する、など
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– staticクラス
public static MyStaticClass{ public static int Count;
public static void MyStaticMethod() { }}
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 2.0 の新機能
– null許容型(Nullableクラス)• null代入が可能な値型
– 通常の値型はnull代入不可
わんくま同盟 http://www.wankuma.com/
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/
C#の歩み
• 2008年 C# 3.0– .NET Framework 3.5 に合わせてバージョンアップ•数々の生産性が上がるような仕様が追加された
– 変更箇所•型推論
•ラムダ式
• 匿名型
•オブジェクト初期化子、コレクション初期化子
•自動プロパティ
• LINQ
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– 型推論•型を指定せずに変数が書ける
•ただし制限事項がある– ローカル変数のみ
– 同時に変数の初期化を行う必要あり
– 初期化する際、型が一意に定まる
わんくま同盟 http://www.wankuma.com/
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/
C#の歩み
• C# 3.0 の新機能
– ラムダ式• 匿名メソッドのsyntax sugar•デリゲートの記述方法の一つ
– ラムダ式という概念についてはWikipediaあたりを参照してください(^^;
ラムダ式を使うとクロージャが簡単に書ける!
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– ラムダ式public void Main(){ var list = new List<string>(); list.Add(“hoge”); list.Add(“foo”); list.Add(“bar”);
list.ForEach( s => Console.WriteLine(“名前:” + s) );}
coll = [ “hoge” ,”foo” ,”bar” ]
coll.each { |s| puts “名前:” + s}
※Rubyでの同等の記述
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– 匿名型•スコープ内でのみ使用可能な型を定義
•型推論を使用した場合のみ使える
わんくま同盟 http://www.wankuma.com/
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/
C#の歩み
• C# 3.0 の新機能
– 自動プロパティ• privateフィールドを自動的に用意してくれる
• get,setそれぞれアクセス指定可能
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– 自動プロパティ
public class Employee{ public string Name { get; set; } public string Organization { get; set; }}
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– オブジェクト初期化子•オブジェクトのプロパティを簡単に初期化できる構文
– コレクション初期化子•コレクションの要素を簡単に初期化できる構文
わんくま同盟 http://www.wankuma.com/
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/
C#の歩み
• C# 3.0 の新機能
– LINQ•様々なオブジェクトをターゲットに、クエリ式でアクセスできる
– Object– XML– SQL
これまで紹介した新機能は、
すべてLINQのためのもの
わんくま同盟 http://www.wankuma.com/
C#の歩み
• C# 3.0 の新機能
– LINQpublic 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/
C#の歩み
• 2009年? C# 4.0– Visual Studio 2010の発表に合わせてリリース
予定
– 追加される機能の予定• 動的型付変数
– 動的言語のように書ける?
• 並列処理のサポート– マルチスレッドプログラミングを簡単に
詳細は割愛!
わんくま同盟 http://www.wankuma.com/
C#のすごいところ
わんくま同盟 http://www.wankuma.com/
C#のすごいところ
• 思考→プログラムに落とし込みやすい
– 型推論、ラムダ式、LINQなどを使うと、ロジック以外の雑多なことから解放される
• なんといってもデリゲート– プログラムをクラスという縛りから解放してくれる
– ラムダ式を使えば簡単に書ける
わんくま同盟 http://www.wankuma.com/
C#のすごいところ
• 実はWindows APIとの親和性が高い
– いざとなれば、APIを直にたたくことも可能• P/Invokeね
– さらにポインタも使える– COMとの相互運用もサポート
• ちょっと注意が必要だけど
わんくま同盟 http://www.wankuma.com/
まとめ
わんくま同盟 http://www.wankuma.com/
まとめ
• C#はWindowsの現実を踏まえたごった煮言語(©猪俣健太郎さん)
– 低レベルから高レベルまで幅広くカバー
• 機能は豊富だが使いやすく設計されている
– 怖くないよ!
• 特にC# 3.0で追加された仕様群は生産性を数倍アップさせてくれる
– 可能性を秘めている・・・
わんくま同盟 http://www.wankuma.com/
まとめ
しっかり使いこなして
定時で帰りましょう
v(^ ^)v
わんくま同盟 http://www.wankuma.com/
おしまい!ご静聴ありがとうございました
<(_ _)>
わんくま同盟 http://www.wankuma.com/
参考資料
• 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 Libraryhttp://msdn.microsoft.com/ja-jp/library/kx37x362(VS.80).aspx
• C# - Wikipediahttp://ja.wikipedia.org/wiki/C_Sharp