lets enjoy c#!

61
わんくま同盟 http://www.wankuma.com/ Let’s Enjoy C#! まさる@わんくま同盟 http://blogs.wankuma.com/masaru/

Upload: sho-takano

Post on 24-May-2015

2.524 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

Let’s Enjoy C#!

まさる@わんくま同盟

http://blogs.wankuma.com/masaru/

Page 2: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

自己紹介

• ハンドルまさる• 性別 見ての通り♂

• 職業 SE兼プログラマ(C#がメイン)• 趣味

– 楽器演奏 バスクラリネット

– 読書•小説•技術書•ビジネス書

Page 3: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

詳しくは…

まさるblogでググってくださいませ<(_ _)>

Page 4: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

Agenda

• C#ってどんなの?• C#の歩み• C#のすごいところ

Page 5: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

Page 6: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• Microsoftが.NET構想用に開発– 開発の中心はDelphiの祖”アンダース・ヘルスバーグ”

• CLSに準拠した.NET Framework用の言語– ECMA、JISによって言語仕様は標準化されている

• C/C++、Java、VB、Pascalなど、さまざまな言語の仕様を取り込んでいる

Page 7: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#の文法– いわゆる”中括弧言語”

• C、Javaに似ている• Javaな人は取っ組みやすい

・・・けど、違う部分もあるので注意

Page 8: Lets Enjoy C#!

わんくま同盟 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!”);}

Page 9: Lets Enjoy C#!

わんくま同盟 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);}

Page 10: Lets Enjoy C#!

わんくま同盟 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;}

Page 11: Lets Enjoy C#!

わんくま同盟 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() { }}

Page 12: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#の型– 値型

•値自体を格納する型• ValueType構造体を派生した型• int、datetimeなど

– 参照型•値への”参照”を格納する型• Objectクラスを派生した型• string、配列など

Page 13: Lets Enjoy C#!

わんくま同盟 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

Page 14: Lets Enjoy C#!

わんくま同盟 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

Page 15: Lets Enjoy C#!

わんくま同盟 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; } }}

Page 16: Lets Enjoy C#!

わんくま同盟 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

Page 17: Lets Enjoy C#!

わんくま同盟 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のみ公開

Page 18: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– delegate(デリゲート):移譲

• Cで言う関数ポインタ•メソッドへの”参照”を保持する型•用途

– クラスでなくメソッド単位で、ロジックを切り替えるため(Strategyパターン)

– 後述するイベント(Observerパターン)– etc...

Page 19: Lets Enjoy C#!

わんくま同盟 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");}

Page 20: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– event(イベント)

•オブジェクトの内部の状態が変更を外部に通知する仕組み

– いわゆるObserverパターン– 前述のデリゲートを使って、ある状態になったとき呼び出されるメソッドを登録する

Page 21: Lets Enjoy C#!

わんくま同盟 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){}

Page 22: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– Attribute(属性)

•型、メンバにメタデータを付加する– 例えばシリアライズ可能なクラス

» JavaはSerializableインターフェイス実装» C#はSerializable属性を付加

[Serializable]public class MySerializableClass{ public Hoge = “”;}

Page 23: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– Attribute(属性)

•他には・・・– デザイナサポート– NUnitのテストクラス、メソッド– etc...

•メタデータなので、適用範囲は無限大– 設定した属性はリフレクションで取得可能

Page 24: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– ポインタ

• C、C++などと同等のもの•ただし、利用可能となる条件は厳しい

– コンパイルオプション「/unsafe」の指定– unsafeブロック、もしくはunsafeキーワードがつけられたブロック内

Page 25: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#ってどんなの?

• C#独特の仕様– ポインタ

public void MyMethod() { unsafe { int* hoge = null; int a = 1; hoge = &a; } }

Page 26: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

Page 27: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• 2002年 C# 1.0– 記念すべき最初のバージョン– これまで説明したような機能が盛り込まれた

Page 28: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• 2003年 C# 1.2– .NET Framework 1.1 に合わせてバージョンアップ

– 変更箇所•バグフィックスが主

Page 29: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• 2005年 C# 2.0– .NET Framework 2.0 に合わせてバージョンアップ•様々な言語仕様が追加された

– C#は2.0からといっても過言ではない

– 変更箇所•ジェネリクス• 匿名メソッド

• partialクラス• staticクラス• null許容型

Page 30: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– ジェネリクス•クラスの内部で使用する型をパラメータで指定•あらゆる型を用いた共通処理を記述可能

• おもな適用先– List等のコレクション

Page 31: Lets Enjoy C#!

わんくま同盟 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];}

非ジェネリック ジェネリック

Page 32: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– 匿名メソッド•メソッドを定義せず、直接デリゲートに処理を格納できる

• 匿名メソッドの内部では、外のスコープのローカル変数も使える

つまり、クロージャ(Closure)

Page 33: Lets Enjoy C#!

わんくま同盟 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

コード 実行結果

Page 34: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– partialクラス(部分クラス)• 一つのクラスの定義を複数の箇所で記述できる

•用途– デザイナ生成部分とビジネスロジックを分けて記述

– 対象オブジェクトごとにコードを分けて記述

– etc...

Page 35: Lets Enjoy C#!

わんくま同盟 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

Page 36: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– staticクラス(静的クラス)•インスタンス化不可のクラス• staticなメンバのみ持てる•利用方法

– 算術計算など、インスタンス化不要なメソッド群を定義する、など

Page 37: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– staticクラス

public static MyStaticClass{ public static int Count;

public static void MyStaticMethod() { }}

Page 38: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 2.0 の新機能

– null許容型(Nullableクラス)• null代入が可能な値型

– 通常の値型はnull代入不可

Page 39: Lets Enjoy C#!

わんくま同盟 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; // これでもよい

}

Page 40: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• 2008年 C# 3.0– .NET Framework 3.5 に合わせてバージョンアップ•数々の生産性が上がるような仕様が追加された

– 変更箇所•型推論

•ラムダ式

• 匿名型

•オブジェクト初期化子、コレクション初期化子

•自動プロパティ

• LINQ

Page 41: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– 型推論•型を指定せずに変数が書ける

•ただし制限事項がある– ローカル変数のみ

– 同時に変数の初期化を行う必要あり

– 初期化する際、型が一意に定まる

Page 42: Lets Enjoy C#!

わんくま同盟 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>>();// こういう長い名前の型を左辺に指定しなくてもよくなる

}

Page 43: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– ラムダ式• 匿名メソッドのsyntax sugar•デリゲートの記述方法の一つ

– ラムダ式という概念についてはWikipediaあたりを参照してください(^^;

ラムダ式を使うとクロージャが簡単に書ける!

Page 44: Lets Enjoy C#!

わんくま同盟 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での同等の記述

Page 45: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– 匿名型•スコープ内でのみ使用可能な型を定義

•型推論を使用した場合のみ使える

Page 46: Lets Enjoy C#!

わんくま同盟 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 ); }

Page 47: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– 自動プロパティ• privateフィールドを自動的に用意してくれる

• get,setそれぞれアクセス指定可能

Page 48: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– 自動プロパティ

public class Employee{ public string Name { get; set; } public string Organization { get; set; }}

Page 49: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– オブジェクト初期化子•オブジェクトのプロパティを簡単に初期化できる構文

– コレクション初期化子•コレクションの要素を簡単に初期化できる構文

Page 50: Lets Enjoy C#!

わんくま同盟 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 = “ぱよストア” } };}

Page 51: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• C# 3.0 の新機能

– LINQ•様々なオブジェクトをターゲットに、クエリ式でアクセスできる

– Object– XML– SQL

これまで紹介した新機能は、

すべてLINQのためのもの

Page 52: Lets Enjoy C#!

わんくま同盟 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));}

Page 53: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#の歩み

• 2009年? C# 4.0– Visual Studio 2010の発表に合わせてリリース

予定

– 追加される機能の予定• 動的型付変数

– 動的言語のように書ける?

• 並列処理のサポート– マルチスレッドプログラミングを簡単に

詳細は割愛!

Page 54: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#のすごいところ

Page 55: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#のすごいところ

• 思考→プログラムに落とし込みやすい

– 型推論、ラムダ式、LINQなどを使うと、ロジック以外の雑多なことから解放される

• なんといってもデリゲート– プログラムをクラスという縛りから解放してくれる

– ラムダ式を使えば簡単に書ける

Page 56: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

C#のすごいところ

• 実はWindows APIとの親和性が高い

– いざとなれば、APIを直にたたくことも可能• P/Invokeね

– さらにポインタも使える– COMとの相互運用もサポート

• ちょっと注意が必要だけど

Page 57: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

まとめ

Page 58: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

まとめ

• C#はWindowsの現実を踏まえたごった煮言語(©猪俣健太郎さん)

– 低レベルから高レベルまで幅広くカバー

• 機能は豊富だが使いやすく設計されている

– 怖くないよ!

• 特にC# 3.0で追加された仕様群は生産性を数倍アップさせてくれる

– 可能性を秘めている・・・

Page 59: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

まとめ

しっかり使いこなして

定時で帰りましょう

v(^ ^)v

Page 60: Lets Enjoy C#!

わんくま同盟 http://www.wankuma.com/

おしまい!ご静聴ありがとうございました

<(_ _)>

Page 61: Lets Enjoy C#!

わんくま同盟 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