21. インターフェイスやデリゲートを使った依
存切り
循環依存をなくすための定石
class A class B
{ {
B _b; A _a;
} }
class A class B : IB
{ {
IB _b; A _a;
} }
C#の場合はデリゲート
interface IB 一方通行に (関数ポインターみたいなもの)
{ を使うことも多い。
}
22. インターフェイスやデリゲートを使った依
存切り
例: いわゆるprintfデバッグ
Unityの場合、UnityEngine.Debugクラスを利用
ログの出力先
中核処理側(Unityに依存したくない)
を
public class Debug 外部から与え
{ る
public static Action<string> Logger { get; set; }
public static void Write(string message)
{
if (Logger != null) Logger(message);
}
}
画面側(Unityを利用)
Models.Debug.Logger = UnityEngine.Debug.Log;
26. イベントの例
例: WPFアプリ(C#、デスクトップ向けGUI)
using System;
using System.Windows;
using System.Windows.Controls;
public class Program
{
[STAThread]
static void Main() ボタンが押された時の
{ イベント登録
処理
var button = new Button { Content = "ここを押せ" };
button.Click += (sender, e) => MessageBox.Show("ようこそ");
var win = new Window { Content = button };
var app = new Application();
app.Run(win);
}
}
36. LINQ
C#は、SQL的なデータ処理が得意
C# 3.0で導入されたLINQ(Language Integrated Query)
例: 顧客データ一覧から、女性客の年齢分布を求める
var 女性客の年齢分布 =
from c in 顧客一覧
where c.性別 == "女"
group c.年齢 by c.年齢 into g
orderby g.Key
select new { 年齢 = g.Key, 数 = g.Count() };
クエリ式
• SQL的なクエリを書ける
• selectが末尾にくるくらいで、かなりSQLその
まんま
• C#の型をそのまま使える(補完も効く)
38. データ処理のパーツ
条件選択、グループ化、整列、集計、射影
入力 出力
集計 射影
a α
b β
c グループ 集計 射影 γ
d
条件選択 整列 δ
化
・・・
・・・
where group by order by 集計 射影
・
・・
from select
Aggregate,
Sum, Countなど
だいたいSQLと一緒
39. 一時リストを作っちゃダメ
例: 偶数だけ選択、二乗を計算
悪い例(一時リストを作成)
var results = new List<int>();
foreach (var x in data)
{
if ((x % 2) == 0)
results.Add(x * x);
}
良い例(LINQ)
var results = data
.Where(x => (x % 2) == 0)
.Select(x => x * x);