Skip to content

Instantly share code, notes, and snippets.

View ufcpp's full-sized avatar

Nobuyuki Iwanaga ufcpp

View GitHub Profile
@ufcpp
ufcpp / Slice.cs
Created February 1, 2015 15:29
Array Slicing
public void QuickSort(int[] map, int left, int right)
{
do
{
// 中略
if (j - left <= right - i)
{
if (left < j) QuickSort(map, left, j);
left = i;
}
@ufcpp
ufcpp / Completeness.cs
Created February 2, 2015 15:52
Completeness for type pattern matching
class Message { }
class A : Message { }
class B : Message { }
class C : Message { }
class PatternMatching
{
public static void Match(Message m)
{
if (m is A) { /* ... */ return; }
@ufcpp
ufcpp / CompleteTypeHierarchy.cs
Last active August 29, 2015 14:14
Complete type hierarchy
abstract class Message
{
// コンストラクターを private に
private Message() { }
// inner クラスであれば private なコンストラクターにアクセスできる
// なので、以下の A, B, C はコンパイルできる
public sealed class A : Message { }
public sealed class B : Message { }
public sealed class C : Message { }
@ufcpp
ufcpp / AfterFix.cs
Created February 5, 2015 02:59
doc comment めんどくせー
class Point
{
public int X { get; private set; }
public int Y { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="x"><see cref="X"/></param>
/// <param name="y"><see cref="Y"/></param>
@ufcpp
ufcpp / BattleAction.cs
Created February 5, 2015 13:36
type pattern matching
/// <summary>
/// バトル中のアクション。
/// </summary>
public abstract class BattleAction
{
public abstract void ApplyTo(Unit u);
}
/// <summary>
/// 攻撃アクション。
@ufcpp
ufcpp / AsPatternMatching.cs
Last active August 29, 2015 14:14
type pattern matching
public static void ShowBattleAction(BattleAction action)
{
var heal = action as Heal;
if (heal != null) ShowHeal(heal);
var attack = action as Attack;
if (attack != null) ShowAttack(attack);
}
// C# 5 以前で、きっちり作るなら
// プロパティ1つごとに5か所ずつ同じものを書かないと行けない
// しかも、プロパティ/フィールド、コンストラクターで結構場所が離れる
public class Point
{
public int X { get { return _x; } }
private readonly int _x;
public int Y { get { return _y; } }
private readonly int _y;
@ufcpp
ufcpp / Decomposition.cs
Created February 6, 2015 17:50
decomposition of data types
// composition
var expr = Add(Mult(Const(2), X()), Const(1));
// decomposition
switch (expr)
{
case Add(Mult(var a, var x), var b): ...;
}
@ufcpp
ufcpp / BetternessRule.cs
Created February 8, 2015 11:02
overload resolution: betterness rule
using static System.Console;
class Program
{
static void Main()
{
X(0); // object
X(""); // string
}
@ufcpp
ufcpp / DerivedRatherThanBase.cs
Last active August 29, 2015 14:15
overload resolution: derived rather than base
using static System.Console;
class Program
{
static void Main()
{
Derived.X(0); // object
Derived.X(""); // object。型よりも派生クラス側が優先
Base.X(""); // string
}