Upload
shota-baba
View
2.453
Download
0
Embed Size (px)
Citation preview
知って得する C#
株式会社ハ・ン・ド
プログラマ
馬場翔太
http://baba-s.hatenablog.com/
スライド内容
1. C#の機能紹介
2. C#のツール紹介
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
値型で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
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
Unityにおける??演算子の使用例(1)
// if文の場合
var boxCollider =
gameObject.GetComponent<BoxCollider>();
if (boxCollider == null)
{
boxCollider =
gameObject.AddComponent<BoxCollider>();
}
http://udasankoubou.blogspot.jp/2013/08/unitynull.html
Unityにおける??演算子の使用例(2)
// ??演算子の場合
var boxCollider =
gameObject.GetComponent<BoxCollider>() ??
gameObject.AddComponent<BoxCollider>();
http://udasankoubou.blogspot.jp/2013/08/unitynull.html
インスタンス生成が不可能なクラスを作る
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
ローカル変数の型の宣言を省略する(1)
varキーワード
// varキーワードを使わない場合の宣言
string name = "";
MyClass obj = new MyClass();
Dictionary<string, MyClass> dict =
new Dictionary<string, MyClass>();
ローカル変数の型の宣言を省略する(2)
varキーワード
// varキーワードを使う場合の宣言
var name = "";
var obj = new MyClass();
var dict = new Dictionary<string, MyClass>();
既存の型にメソッドを追加する(1)
拡張メソッド
// 文字列を大文字に変換する(通常の関数の場合) public static class StringUtility
{
public static string UpperCase(string str)
{
// ...
}
}
str = StringUtility.UpperCase(str);
http://ufcpp.net/study/csharp/sp3_extension.html
既存の型にメソッドを追加する(2)
拡張メソッド
// 文字列を大文字に変換する(拡張メソッドの場合) public static class StringUtility
{
public static string UpperCase(this string str)
{
// ...
}
}
str = str.UpperCase();
http://ufcpp.net/study/csharp/sp3_extension.html
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
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
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
オブジェクトの初期化をスマートに書く(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
オブジェクトの初期化をスマートに書く(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
一時的に利用する型の定義を省略する
匿名型
// 匿名型を使わない定義の場合
var characterId = 0;
var characterName = "";
// 匿名型を使う定義の場合
var character = new { Id = 0, Name = "" };
// character.Id
// character.Name
http://ufcpp.net/study/csharp/sp3_inference.html
配列を作成する際に型を省略する
暗黙型付け配列
// 通常の配列作成
var array = new string[] { "1", "2", "3", "4", };
// 暗黙型付け配列
var array = new [] { "1", "2", "3", "4", };
http://gushwell.ldblog.jp/archives/51115733.html
引数の順序を自由に書く
名前付き引数
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
高速な繰り返し処理を書く(1)
ForEachメソッド
// foreach文の場合
foreach (int n in list)
{
Console.WriteLine(n);
}
http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_03/extremecs_03_12.html
高速な繰り返し処理を書く(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
検索に特化したメソッドを使う(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
検索に特化したメソッドを使う(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
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
安全にキャストする
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
読み取り専用の配列やリストを作る(1)
ReadOnlyCollectionクラス
private List<int> datas = new List<int>();
// ReadOnlyCollectionを使用しないで公開
public List<int> Datas
{
get { return datas; }
}
http://fernweh.jp/b/csharp-readonly-collections/
読み取り専用の配列やリストを作る(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/
他のプログラムを起動する
Processクラス
// メモ帳を起動する
Process.Start("Notepad");
// ファイルを指定してメモ帳を起動する
Process.Start("Notepad", @"C:¥Hoge.txt");
// 規定のエディタで画像ファイルを開く(関連付け起動) Process.Start(@"C:¥Hoge.bmp");
http://jeanne.wankuma.com/tips/csharp/process/
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);
}
}
SQLライクなループ構文を書く(2)
LINQ
// 偶数を検索する
var array = new []{ 1, 2, 3, 4, 5 };
// LINQを使用する場合
var result = from x in array
where x % 2 == 0
select x;
SQLライクなループ構文を書く(3)
LINQ
// 数を数える
// ループ構文を使用する場合
foreach (var n in list)
{
if (n == 0)
{
num++;
}
}
SQLライクなループ構文を書く(4)
LINQ
// 数を数える
// LINQを使用する場合
var num = (from n in list where n == 0).Count();
C#のツール紹介
ReSharper(Visual Studioのアドイン)
できること
• コード監視
• ハイライト拡張
• クラスや変数の使用箇所の検索
• リファクタリング
• タスク管理
コード監視
• 未定義の関数を作成
• 命名規則の確認
• コードの簡略化
未定義の関数を作成
命名規則の確認
varキーワードに置き換える
null許容型に置き換える
null合体演算子に置き換える
初期化子に置き換える
初期化子に置き換える
暗黙型付け配列に置き換える
ハイライト拡張
ハイライト拡張
• 未使用のusingや変数、関数が灰色になる
• エラーになるコードが赤色になる
• コーディングルールに沿わないコードに破線が付く
30日間無料
ありがとうございました