本日は C# の小ネタ枠です。
IEquatable で Class の等価性チェックを実装する方法についてです。
前回記事
以下の前回記事の付随記事です。
bluebirdofoz.hatenablog.com
Classの比較処理を実装する
前回記事で Class のみ ReactiveProperty の差分チェックが意図通りに動作しませんでした。
何らかの理由で Struct や Record が利用できない場合は IEquatable インタフェースの Equals を実装して比較の方法を指定できます。
値の比較が行われるように前回のコードを変更してみました。
・ReactivePropertyTest2.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; public class ReactivePropertyTest2 : MonoBehaviour { /// <summary> /// Class /// </summary> private class CheckClass : System.IEquatable<CheckClass> { public bool onoff; /// <summary> /// 比較処理 /// </summary> /// <param name="other"></param> /// <returns></returns> public bool Equals(CheckClass other) { return onoff == other.onoff; } } // 各ReactiveProperty変数 private ReactiveProperty<CheckClass> checkClassProp = new ReactiveProperty<CheckClass>(new CheckClass()); void Start() { // Class 変更検知時の処理 checkClassProp .Subscribe(checkstate => { Debug.Log($"CheckClass Changed! : {checkstate.onoff}"); }) .AddTo(this); } /// <summary> /// 全ての bool を True に変更 /// </summary> [ContextMenu("ON")] void ChangeOn() { ChangeStates(true); } /// <summary> /// 全ての bool を False に変更 /// </summary> [ContextMenu("OFF")] void ChangeOff() { ChangeStates(false); } void ChangeStates(bool isOnOff) { var checkClass = new CheckClass() { onoff = isOnOff }; checkClassProp.Value = checkClass; } }
以下の通り、これで false -> false への変化の場合で通知が発生しないようになりました。