8. Windows
WinForms, WPF
Mac
Xamarin.Mac
Windows Tablet
Windows Store Application
Web Application
ASP.NET MVC/WebAPI, OWIN
Cloud
Windows Azure, AWS
C# Everywhere
Game
Unity, PlayStation Mobile SDK
Mobile
Xamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
Embedded
Windows Embedded
.NET Micro Framework
NUI
Kinect, LeapMotion
9. Windows
WinForms, WPF
Mac
Xamarin.Mac
Windows Tablet
Windows Store Application
Web Application
ASP.NET MVC/WebAPI, OWIN
Cloud
Windows Azure, AWS
C# Everywhere - Current
Game
Unity, PlayStation Mobile SDK
Mobile
Xamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
Embedded
Windows Embedded
.NET Micro Framework
NUI
Kinect, LeapMotion
10. Windows
WinForms, WPF
Mac
Xamarin.Mac
Windows Tablet
Windows Store Application
Web Application
ASP.NET MVC/WebAPI, OWIN
Cloud
Windows Azure, AWS
C# Everywhere - Future
Game
Unity, PlayStation Mobile SDK
Mobile
Xamarin.iOS
Xamarin.Android
Windows Phone 8 SDK
Embedded
Windows Embedded
.NET Micro Framework
NUI
Kinect, LeapMotion
23. public interface ITypedConnection : IDisposable
{
DbConnection Slave { get; }
DbConnection Master { get; }
}
public BattleEntity SelectById(BattleConnection battle, int id)
{
return battle.Master.Query<BattleEntity>("select * from battle where id = @id", new { id });
}
public UserEntity SelectById(UserInfoConnection user, int id)
{
return user.Master.Query<UserEntity>("select * from user where id = @id", new { id });
}
コーディング時のミス防止(間違った接続の利用はコンパイル時に弾かれる)
テーブルの別DBへの分割時にも完全にコンパイルチェックが効くので安全に行える
C#(というか型付き言語)を使う利点
38. 言語構文レベルでサポートされる非同期
var names = Members.Select(x => new
{
Name = x.GetName()
})
.ToArray();
var names = await Members.Select(async x => new
{
Name = await x.GetNameAsync()
})
.WhenAll();
Membersが10人だとして、GetNameが
2msかかると、同期だと10 * 2 = 20ms
非同期で一気に同時に取得すれば
2ms で済む
39. // 例えばmemcachedの場合
var memcached = new MemcachedClient();
// 3回アクセスがあって辛ぽよ
var a = memcached.Get("hoge"); // +10ms = 10ms
var b = memcached.Get("hage"); // +10ms = 20ms
var c = memcached.Get("huga"); // +10ms = 30ms
// 1度に問い合わせて、分配
var all = memcached.Get(new[] { "hoge", "hage", "huga" }); // +10ms
var a2 = all["hoge"];
var b2 = all["hage"];
var c2 = all["huga"];
別に非同期構文とかなくてもできるじゃん!?
40. // 例えばmemcachedの場合
var memcached = new MemcachedClient();
// 3回アクセスがあって辛ぽよ
var a = memcached.Get("hoge"); // +10ms = 10ms
var b = memcached.Get("hage"); // +10ms = 20ms
var c = memcached.Get("huga"); // +10ms = 30ms
// 1度に問い合わせて、分配
var all = memcached.Get(new[] { "hoge", "hage", "huga" }); // +10ms
var a2 = all["hoge"];
var b2 = all["hage"];
var c2 = all["huga"]; でもIncrとか、Get以外のコマンドは?
それに、こうしたコードってオブジェク
トモデルでまとめにくい!
性能優先 vs 設計優先の対立になるの?
42. 全てが非同期で自動でパイプライン化される
var a = redis.TryGet("hoge"); // Taskなのでひどぅーき
var b = redis.TryGet("huga");
var c = redis.TryGet("hage");
await Task.WhenAll(a, b, c); // 10ms
43. var frontHPs = await field.OwnGuild.Members
.Where(x => x.Position == Position.Front)
.Select(async x => new
{
Name = await x.Name,
CurrentHP = (await x.UserStatus).CurrentHP
})
.WhenAll();
x.Nameやx.UserStatusはRedisへの
通信、こうして書いたコードは、自
動的にパイプライン化されて非同期
実行されている
// 自分の実行可能(TP不足じゃないとか)なアビリティをActionTypeでグループ分け
var abilities = (await field.OwnStatus.GetCommandAbilities())
.Where(x => x.CanExecute == CanExecuteReason.CanExecute)
.GroupBy(x => x.ActionType);
LINQと相性良い、
IntelliSensable超大事
そうしたLINQableのための
設計と性能が両立できる