SlideShare a Scribd company logo
1 of 11
Download to read offline
山椒の味は大人の味 
NGK2013B –名古屋合同懇親会2013忘年会–Kouji Matsui @kekyo
自己紹介 
kekyo(けきょ) 
会社やってます。現在はフレームワークのアーキテクト しています。 
主に.NET Framework C#使いです。C++とかアセンブラ もやります。大体1から10まで全部やってしまうので、 出来るだけ拘束具をはめてます。
山椒と言えば... 
やっぱりウナギですね。 ウナギは絶滅が危惧されてい るようで、名古屋人には残念 なことです。 
鰻丼にふりかける山椒は、 苦くも旨い、そういう話です。
.NET Frameworkの山椒とは 
オブジェクト参照の事ですよ、奥さん。 
おいしいですなぁ。でも、独自の味付けのお蔭で、素材本来の 参照が生かせないんですよ。 
で、味付けって、何? 
「Equals」と「GetHashCode」ですよ。
料理ごとの調味料♪ 
材料:Equals: 1オーバーライド GetHashCode: 1オーバーライド public override boolEquals(objectobj) { returnunagi_.Equals(((UnaDon)obj).unagi_); } public override intGetHashCode() { returnunagi_.GetHashCode(); }
素材の味が知りたいよね 
同じウナギかどうかを確認するには、 「object.ReferenceEquals」を使えばいい。 // これは私の鰻丼? varunadon1 = newUnaDon(); varunadon2 = unadon1; varunadon3 = newUnaDon(); Debug.Assert(object.ReferenceEquals(unadon1, unadon2) == true); Debug.Assert(object.ReferenceEquals(unadon1, unadon3) == false); 
で、参照のハッシュコードは?
加工されていると分からない 
GetHashCodeがオーバーライドされていると、本来の参照 ハッシュコードを取得できなくなります。 
そこで、名代秘伝の技を使うわけです。その名も「Emit」。 // 動的にクラスとメソッドを作っちゃう。取り合えず、イメージはこんな感じ public static classObjectReference{ public static intGetReferenceHashCode(objectinstance) { // (C#では書けない、あんなことやこんなこと...) } }
下積みは省略して、秘伝のタレ 
「object.GetHashCode」は仮想メソッドです。これを呼び 出す時はIL命令「CallVirt」を使います。 
しかし、ここでは掟を破って「Call」を使う。 varobjectGetHashCodeMethod= typeof(object).GetMethod(“GetHashCode”); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Call, objectGetHashCodeMethod); ilGenerator.Emit(OpCodes.Ret); getHashCodeDynamic_ = (Func<object, int>)Delegate.CreateDelegate( typeof(Func<object, int>), typeBuilder.CreateType().GetMethod(“GetReferenceHashCode”)); 
えええ?!
そして名工の治具へ 
出来上がったデリゲートを 「ObjectReferenceEqualityComparer」に組み込みます。 public sealed classObjectReferenceEqualityComparer: IEqualityComparer{ public intGetHashCode(objectinstance) { returngetHashCodeDynamic_(instance); } public boolEquals (objectx, objecty) { return object.ReferenceEquals(x, y); } } 
うひょうひょうひょうひ
これで多い日でも安心 varhashSet= newHashSet<UnaDon>(newObjectReferenceEqualityComparer()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon()); hashSet.Add(newUnaDon());
ご静聴ありがとうございました 
Advent LINQやってます。 http://kekyo.wordpress.com/ 
おもちゃの行進曲@音楽研究所http://www.asahi-net.or.jp/~HB9T-KTD/music/Japan/Studio/midi.html

More Related Content

Viewers also liked

メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばKouji Matsui
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate languageKouji Matsui
 
抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へ抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へKouji Matsui
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホンKouji Matsui
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成Kouji Matsui
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式Kouji Matsui
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITKouji Matsui
 

Viewers also liked (7)

メタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらばメタプログラミングでExcel仕様書よさらば
メタプログラミングでExcel仕様書よさらば
 
Hello! intermediate language
Hello! intermediate languageHello! intermediate language
Hello! intermediate language
 
抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へ抽象太郎ものがたり そして伝説へ
抽象太郎ものがたり そして伝説へ
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 
式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式式の体を成して無い式を式の体を成すように式と式木で何とかする式
式の体を成して無い式を式の体を成すように式と式木で何とかする式
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 

More from Kouji Matsui

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Kouji Matsui
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewKouji Matsui
 
What's Functional?
What's Functional?What's Functional?
What's Functional?Kouji Matsui
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTEKouji Matsui
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculatorKouji Matsui
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhereKouji Matsui
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of ReferenceKouji Matsui
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.Kouji Matsui
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and TaskKouji Matsui
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPSKouji Matsui
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basicsKouji Matsui
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN LinkingKouji Matsui
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組みKouji Matsui
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話Kouji Matsui
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions IIIKouji Matsui
 

More from Kouji Matsui (20)

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
 
Fun with BrainPad
Fun with BrainPadFun with BrainPad
Fun with BrainPad
 
What's Functional?
What's Functional?What's Functional?
What's Functional?
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTE
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculator
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhere
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of Reference
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and Task
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basics
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話不健康なIt戦士を健康的にするアレの話
不健康なIt戦士を健康的にするアレの話
 
Final LINQ extensions III
Final LINQ extensions IIIFinal LINQ extensions III
Final LINQ extensions III
 

山椒の味は大人の味