50
知って得する C# 株式会社ハ・ン・ド プログラマ 馬場翔太 http://baba-s.hatenablog.com/

知って得するC#

Embed Size (px)

Citation preview

Page 1: 知って得するC#

知って得する C#

株式会社ハ・ン・ド

プログラマ

馬場翔太

http://baba-s.hatenablog.com/

Page 2: 知って得するC#

スライド内容

1. C#の機能紹介

2. C#のツール紹介

Page 3: 知って得するC#

C#の機能紹介

Page 4: 知って得するC#

クラスの定義を複数のファイルに分ける

partialキーワード

// CharacterA.cs

public partial class Character

{

private int id;

}

// CharacterB.cs

public partial class Character

{

private string name;

}

http://d.hatena.ne.jp/pknight/20130206/1360151414

Page 5: 知って得するC#

値型でnullを扱う

null許容型

int? x = 123;

int? y = null;

http://ufcpp.net/study/csharp/sp2_nullable.html http://bleis-tift.hatenablog.com/entry/cmp_Option_Nullable

Page 6: 知って得するC#

nullチェックと代入をスマートに書く

??演算子(null合体演算子)

// 条件演算子の場合

z = x != null ? x : y;

// ??演算子の場合

z = x ?? y;

http://d.hatena.ne.jp/pknight/20130206/1360145446 http://odashinsuke.hatenablog.com/entry/20090522/1243002878

Page 7: 知って得するC#

Unityにおける??演算子の使用例(1)

// if文の場合

var boxCollider =

gameObject.GetComponent<BoxCollider>();

if (boxCollider == null)

{

boxCollider =

gameObject.AddComponent<BoxCollider>();

}

http://udasankoubou.blogspot.jp/2013/08/unitynull.html

Page 8: 知って得するC#

Unityにおける??演算子の使用例(2)

// ??演算子の場合

var boxCollider =

gameObject.GetComponent<BoxCollider>() ??

gameObject.AddComponent<BoxCollider>();

http://udasankoubou.blogspot.jp/2013/08/unitynull.html

Page 9: 知って得するC#

インスタンス生成が不可能なクラスを作る

staticクラス

// privateコンストラクタの場合

public class MyClass

{

private MyClass(){}

}

// staticクラスの場合

public static class MyClass

{

}

http://ufcpp.net/study/csharp/oo_static.html#class http://ykimisaki.hatenablog.jp/entry/2013/07/10/220545

Page 10: 知って得するC#

ローカル変数の型の宣言を省略する(1)

varキーワード

// varキーワードを使わない場合の宣言

string name = "";

MyClass obj = new MyClass();

Dictionary<string, MyClass> dict =

new Dictionary<string, MyClass>();

Page 11: 知って得するC#

ローカル変数の型の宣言を省略する(2)

varキーワード

// varキーワードを使う場合の宣言

var name = "";

var obj = new MyClass();

var dict = new Dictionary<string, MyClass>();

Page 12: 知って得するC#

既存の型にメソッドを追加する(1)

拡張メソッド

// 文字列を大文字に変換する(通常の関数の場合) public static class StringUtility

{

public static string UpperCase(string str)

{

// ...

}

}

str = StringUtility.UpperCase(str);

http://ufcpp.net/study/csharp/sp3_extension.html

Page 13: 知って得するC#

既存の型にメソッドを追加する(2)

拡張メソッド

// 文字列を大文字に変換する(拡張メソッドの場合) public static class StringUtility

{

public static string UpperCase(this string str)

{

// ...

}

}

str = str.UpperCase();

http://ufcpp.net/study/csharp/sp3_extension.html

Page 14: 知って得するC#

Unityにおける拡張メソッドの使用例(1)

// エラー

transform.position.x = 0;

// OK

var pos = transform.position;

pos.x = 0;

transform.position = pos;

http://kou-yeung.hatenablog.com/entry/2013/11/18/233000

Page 15: 知って得するC#

Unityにおける拡張メソッドの使用例(2)

// 通常の関数の場合

public static class TransformUtility

{

public static void SetPositionX(Transform transform, float x)

{

var pos = transform.position;

pos.x = x;

transform.position = pos;

}

}

TransformUtility.SetPositionX(transform, 0);

http://kou-yeung.hatenablog.com/entry/2013/11/18/233000

Page 16: 知って得するC#

Unityにおける拡張メソッドの使用例(3)

// 拡張メソッドの場合

public static class TransformUtility

{

public static void SetPositionX(this Transform transform, float x)

{

var pos = transform.position;

pos.x = x;

transform.position = pos;

}

}

transform.SetPositionX(0);

http://kou-yeung.hatenablog.com/entry/2013/11/18/233000

Page 17: 知って得するC#

オブジェクトの初期化をスマートに書く(1)

初期化子

// Add関数による初期化(List型)

var list = new List<int>();

list.Add(1);

list.Add(2);

list.Add(3);

// 初期化子による初期化(List型)

var list = new List<int>{ 1, 2, 3, };

http://cs.hatenablog.jp/entry/2013/06/24/190945

Page 18: 知って得するC#

オブジェクトの初期化をスマートに書く(2)

初期化子

// Add関数による初期化(Dictionary型)

var dict = new Dictionary<string, int>();

dict.Add("one", 1);

dict.Add("two", 2);

// 初期化子による初期化(Dictionary型)

var dict = new Dictionary<string, int>()

{

{ "one", 1 },

{ "two", 2 },

};

http://cs.hatenablog.jp/entry/2013/06/24/190945

Page 19: 知って得するC#

一時的に利用する型の定義を省略する

匿名型

// 匿名型を使わない定義の場合

var characterId = 0;

var characterName = "";

// 匿名型を使う定義の場合

var character = new { Id = 0, Name = "" };

// character.Id

// character.Name

http://ufcpp.net/study/csharp/sp3_inference.html

Page 20: 知って得するC#

配列を作成する際に型を省略する

暗黙型付け配列

// 通常の配列作成

var array = new string[] { "1", "2", "3", "4", };

// 暗黙型付け配列

var array = new [] { "1", "2", "3", "4", };

http://gushwell.ldblog.jp/archives/51115733.html

Page 21: 知って得するC#

引数の順序を自由に書く

名前付き引数

static int Sum(int x = 0, int y = 0, int z = 0)

{

}

int s1 = Sum(x: 1, y: 2, z: 3);

int s2 = Sum(y: 2, z: 3, x: 1);

int s3 = Sum(y: 1);

http://noriok.hatenadiary.jp/entry/2013/08/18/014408

Page 22: 知って得するC#

高速な繰り返し処理を書く(1)

ForEachメソッド

// foreach文の場合

foreach (int n in list)

{

Console.WriteLine(n);

}

http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_03/extremecs_03_12.html

Page 23: 知って得するC#

高速な繰り返し処理を書く(2)

ForEachメソッド

// 配列の場合

Array.ForEach(array, n => Console.WriteLine(n));

// List型の場合

list.ForEach(n => Console.WriteLine(n));

http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_03/extremecs_03_12.html

Page 24: 知って得するC#

検索に特化したメソッドを使う(1)

Findメソッド

// foreach文の場合

var result = 0;

foreach (var n in list)

{

if (n == 0)

{

result = n;

}

}

http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_04/extremecs_04_03.html

Page 25: 知って得するC#

検索に特化したメソッドを使う(2)

Findメソッド

// 配列の場合

var result = Array.Find(array, n => n == 0);

// List型の場合

var result = list.Find(n => n == 0);

http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_04/extremecs_04_03.html

Page 26: 知って得するC#

newで生成するオブジェクトを定数にする

static readonly

// OK

private const int MaxValue = 100;

// エラー

private const Vector2 Position =

new Vector2(100, 100);

// OK

private static readonly Vector2 Position =

new Vector2(100, 100);

http://msdn.microsoft.com/ja-jp/library/aa645753.aspx

Page 27: 知って得するC#

安全にキャストする

as演算子

// 失敗したら例外発生

var str = (string)obj;

// 失敗したらnullを返す

var str = obj as string;

http://ichitcltk.hustle.ne.jp/gudon/modules/pico_rd/index.php?content_id=131

Page 28: 知って得するC#

読み取り専用の配列やリストを作る(1)

ReadOnlyCollectionクラス

private List<int> datas = new List<int>();

// ReadOnlyCollectionを使用しないで公開

public List<int> Datas

{

get { return datas; }

}

http://fernweh.jp/b/csharp-readonly-collections/

Page 29: 知って得するC#

読み取り専用の配列やリストを作る(2)

ReadOnlyCollectionクラス

private List<int> datas = new List<int>();

// ReadOnlyCollectionを使用して公開

public ReadOnlyCollection<int> Datas

{

get { return datas.AsReadOnly(); }

}

http://fernweh.jp/b/csharp-readonly-collections/

Page 30: 知って得するC#

他のプログラムを起動する

Processクラス

// メモ帳を起動する

Process.Start("Notepad");

// ファイルを指定してメモ帳を起動する

Process.Start("Notepad", @"C:¥Hoge.txt");

// 規定のエディタで画像ファイルを開く(関連付け起動) Process.Start(@"C:¥Hoge.bmp");

http://jeanne.wankuma.com/tips/csharp/process/

Page 31: 知って得するC#

SQLライクなループ構文を書く(1)

LINQ // 偶数を検索する

var array = new []{ 1, 2, 3, 4, 5 };

// ループ構文を使用する場合

var result = new List<int>();

foreach (var x in array)

{

if (x % 2 == 0)

{

result.Add(x);

}

}

Page 32: 知って得するC#

SQLライクなループ構文を書く(2)

LINQ

// 偶数を検索する

var array = new []{ 1, 2, 3, 4, 5 };

// LINQを使用する場合

var result = from x in array

where x % 2 == 0

select x;

Page 33: 知って得するC#

SQLライクなループ構文を書く(3)

LINQ

// 数を数える

// ループ構文を使用する場合

foreach (var n in list)

{

if (n == 0)

{

num++;

}

}

Page 34: 知って得するC#

SQLライクなループ構文を書く(4)

LINQ

// 数を数える

// LINQを使用する場合

var num = (from n in list where n == 0).Count();

Page 35: 知って得するC#

C#のツール紹介

Page 36: 知って得するC#

ReSharper(Visual Studioのアドイン)

Page 37: 知って得するC#

できること

• コード監視

• ハイライト拡張

• クラスや変数の使用箇所の検索

• リファクタリング

• タスク管理

Page 38: 知って得するC#

コード監視

• 未定義の関数を作成

• 命名規則の確認

• コードの簡略化

Page 39: 知って得するC#

未定義の関数を作成

Page 40: 知って得するC#

命名規則の確認

Page 41: 知って得するC#

varキーワードに置き換える

Page 42: 知って得するC#

null許容型に置き換える

Page 43: 知って得するC#

null合体演算子に置き換える

Page 44: 知って得するC#

初期化子に置き換える

Page 45: 知って得するC#

初期化子に置き換える

Page 46: 知って得するC#

暗黙型付け配列に置き換える

Page 47: 知って得するC#

ハイライト拡張

Page 48: 知って得するC#

ハイライト拡張

• 未使用のusingや変数、関数が灰色になる

• エラーになるコードが赤色になる

• コーディングルールに沿わないコードに破線が付く

Page 49: 知って得するC#

30日間無料

Page 50: 知って得するC#

ありがとうございました