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.

0

Share

Download to read offline

山椒の味は大人の味

Download to read offline

山椒の味は大人の味
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/

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • 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

山椒の味は大人の味 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,847

On Slideshare

0

From embeds

0

Number of embeds

3,893

Actions

Downloads

3

Shares

0

Comments

0

Likes

0

×