Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

山椒の味は大人の味

山椒の味は大人の味
NGK2013B – 名古屋合同懇親会 2013忘年会

http://www.kekyo.net/2013/12/14/%e5%b1%b1%e6%a4%92%e3%81%ae%e5%91%b3%e3%81%af%e5%a4%a7%e4%ba%ba%e3%81%ae%e5%91%b3-ngk2013b/

  • Be the first to comment

  • Be the first to like this

山椒の味は大人の味

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

    Be the first to comment

    Login to see the comments

山椒の味は大人の味 NGK2013B – 名古屋合同懇親会 2013忘年会 http://www.kekyo.net/2013/12/14/%e5%b1%b1%e6%a4%92%e3%81%ae%e5%91%b3%e3%81%af%e5%a4%a7%e4%ba%ba%e3%81%ae%e5%91%b3-ngk2013b/

Views

Total views

4,793

On Slideshare

0

From embeds

0

Number of embeds

3,859

Actions

Downloads

3

Shares

0

Comments

0

Likes

0

×