Net State Machine
v0.4.0
مكتبة منشئ أجهزة الحالة لـ .NET.
يوضح المثال التالي بعض وظائف آلة الحالة.
باستخدام Enderlook.StateMachine؛ الفئة العامة Character {private static StateMachineFactory <States, Events, Character>؟ مصنع؛ خاص للقراءة فقط عشوائي rnd = جديد ()؛ خاص للقراءة فقط StateMachine <States، Events، Character> StateMachine؛ صحة int الخاصة = 100؛ طعام int خاص = 100؛ حالات التعداد الخاص {Sleep، Play، GettingFood، Hunt، Gather،} التعداد الخاص Events{HasFullHealth,LowHealth,IsHungry,IsNoLongerHungry,} مهمة عامة ثابتة غير متزامنة Task Main(){Character Character = new();while (true){Console.Clear();// تنفيذ مكالمة تحديث لجهاز الحالة وتمرير معلمة عشوائية لها.// المعلمة عامة لذا لا يتم تخصيصها لأنواع القيم.// يتم تمرير هذه المعلمة إلى المشتركين المفوض الذي يقبل نوع الوسيطة العامة في توقيعه.// إذا كنت لا ترغب في تمرير معلمة، يمكنك إزالة استدعاء الأسلوب .With().// يمكن أيضًا استخدام نظام المعلمة هذا مع حدث الحريقmethods.character. StateMachine.With(character.rnd.NextSingle()).Update();Console.WriteLine($"الحالة: {character.stateMachine.CurrentState}.");Console.WriteLine($"الصحة: {character.health}.");Console.WriteLine($"Food: {character.food}.");await Task.Delay( 10).ConfigureAwait(false);}}public Character(){// إنشاء مثيل للحالة Machine.stateMachine = GetStateMachineFactory().Create(this); // بدلاً من ذلك، إذا كنت تريد تمرير المعلمات إلى تهيئة جهاز الحالة، فيمكنك القيام بما يلي: // StateMachine = GetStateMachineFactory().With(parameter).Create(this). // يمكن ربط الطريقة `.With(parameter)` عدة مرات حسب حاجتك. // النمط `stateMachine.With(p1).With(p2)...With(pn).SomeMethod(...)` صالح أيضًا للطرق `Fire()` و`FireImmediately()` و`Update ()`.}StateMachineFactory ثابت خاص<States, Events, Character> GetStateMachineFactory(){if (المصنع ليس فارغًا)return مصنع؛StateMachineFactory<الحالات، الأحداث، الشخصية>؟ Factory_ = StateMachine<States, Events, Character>// يتم إنشاء أجهزة الحالة من المصانع مما يجعل إنشاء مثيلات متعددة// أرخص في كل من وحدة المعالجة المركزية والذاكرة نظرًا لأن الحساب يتم مرة واحدة ويتم مشاركته بين المثيلات التي تم إنشاؤها..CreateFactoryBuilder()// يحدد الحالة الأولية لجهاز الحالة.// تحدد المعلمة الثانية كيفية تنفيذ مفوضي OnEntry أثناء تهيئة جهاز الحالة،//InitializationPolicy.Ignore يعني أنه ينبغي عليهم ذلك لا يمكن تشغيلها..SetInitialState(States.Sleep,InitializationPolicy.Ignore)// تكوين حالة..In(States.Sleep)// يتم تنفيذها في كل مرة ندخل فيها إلى هذه الحالة..OnEntry(() => Console.WriteLine( "الذهاب إلى السرير."))// يتم تنفيذه في كل مرة نخرج فيها من هذه الحالة..OnExit(() => Console.WriteLine("Getting up.")// يتم تنفيذه في كل مرة يتم فيها تنفيذ طريقة التحديث (إما Update() أو With<T>(T).Update()) وتكون في هذه الحالة.// توفر جميع الأحداث تحميلًا زائدًا لتمرير المستلم، لذلك يمكن تحديد معلماتها أثناء إنشاء مثيلات ملموسة.// يوفر أيضًا تحميلًا زائدًا لتمرير معلمة من النوع التعسفي، بحيث يمكن تحديد معلماتها أثناء استدعاء With<T>(T).Update().// يوفر أيضًا الزائد لتمرير كل من المستلم ومعلمة نوع عشوائي.// تنطبق هذه الأحمال الزائدة أيضًا على طرق OnEntry(...) وOnExit(...) وIf(...) وDo(...)..OnUpdate(@this => @this.OnUpdateSleep ()).On(Events.HasFullHealth)// يتم تنفيذه في كل مرة يتم فيها تشغيل هذا الحدث في هذه الحالة..Do(() => Console.WriteLine("اختر الألعاب."))// حالة جديدة لـ Transite..Goto(States.Play)// بدلاً من ذلك، يمكنك تكوين سياسة تنفيذ الحدث أثناء عملية النقل.// استدعاء الطريقة أعلاه يعادل:// .OnEntryPolicy(TransitionPolicy.ChildFirstWithCulling).OnExitPolicy(TransitionPolicy.ParentFirstWithCulling) .Goto(States.Play)..On(Events.IsHungry)// قم بتنفيذ المكالمة التالية فقط إذا كان الشرط هو true..If(@this => @this.IsVeryWounded())// بقينا في حالتنا الحالية دون تنفيذ OnEntry أو مندوبي OnExit..StaySelf()// الطريقة أعلاه هي اختصار لـ:// .OnEntryPolicy( TransitionPolicy.Ignore).OnExitPolicy(TransitionPolicy.Ignore).Goto(States.Sleep).// إذا أردنا تنفيذ هؤلاء المفوضين فيمكننا ذلك use:// .GotoSelf(false)// وهو اختصار:// .OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclusive).OnExitPolicy(TransitionPolicy.ParentFirstWithCullingInclusive).Goto(States.Sleep).// إذا أردنا أيضًا التنفيذ مندوبو الانتقال من الحالات الأصلية (وهو أمر غير مفيد في هذا المثال منذ ذلك الحين State.Sleep ليست حالة فرعية) يمكننا القيام بها:// .GotoSelf(true)// وهو اختصار:// .OnEntryPolicy(TransitionPolicy.ChildFirst).OnExitPolicy(TransitionPolicy.ParentFirst).Goto(States.Sleep) .// وإلا قم بتنفيذ المكالمة التالية إذا كان الشرط صحيحًا..If(@this => @this.IsWounded()).Goto(States.Gather)// وإلا قم بالتنفيذ دون قيد أو شرط..Goto(States.Hunt)// تجاهل هذا الحدث في هذا الانتقال.// (إذا لم نضيف هذا وقمنا بطرده عن طريق الخطأ تم طرح استثناء لهذا الحدث)..Ignore(Events.LowHealth)// وهو اختصار:// .On(Events.LowHealth).OnEntryPolicy(TransitionPolicy.Ignore).OnExitPolicy(TransitionPolicy.Ignore).Goto(States.Sleep)..In(States.Play).OnUpdate(@this => @this.OnUpdatePlay()) .On(Events.IsHungry).If(@this => @this.IsWounded()).Goto(States.Gather).Goto(States.Hunt).In(States.GettingFood).OnEntry(() => Console.WriteLine("الذهاب لتناول الطعام.")).OnExit( () => Console.WriteLine("توقف عن الذهاب لتناول الطعام.")).In(States.Gather)// يحدد أن هذه الحالة هي حالة فرعية لحالة أخرى.// هذا يعني أن OnUpdate يفوض سيتم أيضًا تشغيل الحالة الأصلية. // أيضًا اعتمادًا على OnEntryPolicy وOnExitPolicy التي تم تكوينها أثناء التحولات، // قد يتم تشغيل مندوبي OnEntry وOnExit المشتركين في هذه الحالة أثناء التحولات في الحالات الفرعية..IsSubStateOf(States.GettingFood).OnUpdate ((الحرف @this، المعلمة العائمة) => @this.OnUpdateGather(parameter)).On(Events.IsNoLongerHungry).If(@this => @this.IsWounded()).Goto(States.Sleep).Goto(States.Play).On(Events.HasFullHealth).Goto(States.Hunt).In(States.Hunt).IsSubStateOf(States.GettingFood). OnEntry(() => Console.WriteLine("انحني.")).OnExit(() => Console.WriteLine("Drop" Bow.")).OnUpdate((الحرف @this، المعلمة العائمة) => @this.OnUpdateHunt(parameter)).On(Events.IsNoLongerHungry).Goto(States.Sleep).On(Events.LowHealth).Goto( States.Sleep).Finalize();// المتشابك مفيد لتقليل استخدام الذاكرة في حالات تعدد مؤشرات الترابط.// وذلك لأن المصنع يحتوي على بيانات مشتركة بين المثيلات،// لذلك إذا تم إنشاء مثيلين من مصنعين مختلفين، فسوف يستهلك ذلك ذاكرة أكبر// من المثيلين اللذين تم إنشاؤهما من نفس المصنع.Interlocked.CompareExchange(reffactory,factor_, null);returnfactory;}private bool IsVeryWounded( ) => الصحة <= 50;منطقي خاص IsWounded() => صحة <= 75;فراغ خاص OnUpdateHunt(حظ عائم){food += (int)MathF.Round(rnd.Next(8) * الحظ);if (food >= 100){food = 100;stateMachine.Fire(Events.IsNoLongerHungry); // بدلاً من ذلك، إذا كنت تريد تمرير المعلمات إلى تهيئة جهاز الحالة، فيمكنك القيام بما يلي: // StateMachine.With(paramter).Fire(Events.IsNoLongerHungry);}health -= (int)MathF.Round(rnd.Next(6) * (1 - الحظ));if (health <= 20)stateMachine. Fire(Events.LowHealth);}الفراغ الخاص OnUpdateGather(الحظ العائم){food += (int)MathF.Round(rnd.Next(3) * الحظ);if (food >= 100){food = 100;stateMachine.Fire(Events.IsNoLongerHungry);}if (rnd.Next(1) % 1 = = 0){الصحة++;إذا (الصحة >= 100){الصحة = 100;stateMachine.Fire(Events.HasFullHealth);}}}private void OnUpdatePlay(){food -= 3;if (food <= 0){food = 0;stateMachine.Fire(Events.IsHungry);}}private void OnUpdateSleep(){health++;if (health >= 100){health = 100;stateMachine.Fire(Events.HasFullHealth);}food -= 2;if (food <= 0){food = 0;stateMachine.Fire(Events.IsHungry);}}}
فئة مختومة عامة StateMachine<TState, TEvent, TRecipient>حيث TState : notnullwhere TEvent : notnull{// احصل على الحالة الحالية (الفرعية) لهذه الحالة Machine.public TState CurrentState { get; }/// احصل على الحالة الحالية (الفرعية) وجميع حالاتها الأصلية hierarchy.public ReadOnlySlice<TState> CurrentStateHierarchy { get; }/// الحصول على قبول الأحداث حسب الحالة الحالية (الفرعية). public ReadOnlySlice<TEvent> CurrentAcceptedEvents { get; }/// إنشاء منشئ مصنع.public static StateMachineBuilder<TState, TEvent, TRecipient> CreateFactoryBuilder();/// احصل على الحالة الأصلية للحالة المحددة.// إذا لم تكن الحالة حالة فرعية، فسيتم إرجاع false.public bool GetParentStateOf(حالة TState, [NotNullWhen(true)] خارج TState؟parentState);/// احصل على التسلسل الهرمي الأصلي للحالة المحددة. إذا لم تكن الحالة حالة فرعية، فسيتم إرجاع فارغة. إذا كانت الحالة الحالية هي الحالة المحددة أو حالة فرعية (متداخلة) لتلك الحالة المنطقية العامة المحددة IsInState(TStatestate);/// أطلق حدثًا على جهاز الحالة.// إذا كان جهاز الحالة يطلق حالة بالفعل، فسيتم وضعه في قائمة الانتظار للتشغيل بعد اكتمال الحدث الحالي.public void Fire(TEvent @event); /// أطلق حدثًا على جهاز الحالة. /// لن يتم إدراج الحدث في قائمة الانتظار ولكن سيتم تشغيله بالفعل، متجاهلاً الأحداث التي تم وضعها مسبقًا. /// إذا تم إدراج الأحداث اللاحقة أثناء تنفيذ الأمر عمليات الاسترجاعات لهذا الحدث، سيتم تشغيلها أيضًا بعد الانتهاء من هذا الحدث.public void FireImmediately(TEvent @event);/// تنفيذ عمليات الاسترجاعات التحديث المسجلة في الحالة الحالية.public void Update();/// يخزن المعلمة (المعلمات) التي يمكن تمريرها إلى المفوضين المشتركين.public ParametersBuilder With<T>(T المعلمة)؛ البنية العامة للقراءة فقط ParametersBuilder{// المتاجر يمكن تمرير معلمة إلى callbacks.public ParametersBuilder With<TParameter>(معامل TParameter);/// مثل Fire(TEvent) في الفئة الأصلية ولكنها تتضمن جميع القيمة المخزنة التي يمكن تمريرها إلى المفوضين المشتركين.public void Fire( TEvent);/// مثل FireImmediately(TEvent) في الفئة الأصلية ولكنه يتضمن جميع القيمة المخزنة التي يمكن تمريرها إلى المفوضين المشتركين.public void FireImmediately(TEvent);/// مثل Update(TEvent) في الفئة الأصلية ولكنه يتضمن جميع القيمة المخزنة التي يمكن تمريرها إلى المفوضين المشتركين.public void Update(TEvent);}بنية عامة للقراءة فقط تهيئة ParametersBuilder{// يخزن معلمة يمكن تمريرها إلى callbacks.publicInitializeParametersBuilder With<TParameter>(معامل TParameter);/// إنشاء الحالة Machine.public StateMachine<TState, TEvent, TRecipient> Create(TRecipient Recipient);}}فئة عامة مختومة StateMachineFactory<TState, TEvent, TRecipient>حيث TState : notnullwhere TEvent : notnull{// إنشاء جهاز حالة تم تكوينه وتهيئته باستخدام التكوين الذي يوفره هذا Factory.public StateMachine<TState, TEvent, TRecipient> إنشاء (مستلم TRecipient)؛/// يخزن المعلمة (المعلمات) التي يمكن تمريرها إلى المفوضين المشتركين.public StateMachine<TState, TEvent, TRecipient>.InitializeParametersBuilder With<T>(T Parameter);}فئة مختومة عامة StateMachineBuilder<TState ، TEvent، TRecipient>: IFinalizablewhere TState: notnullwhere TEvent: notnull{// يحدد الحالة الأولية لجهاز الحالة.// تحدد "initializationPolicy" كيفية تشغيل المفوضين المشتركين في أفران OnEntry للحالة المحددة (والحالات الأصلية) أثناء تهيئة جهاز الحالة.public StateMachineBuilder <TState, TEvent, TRecipient> SetInitialState(حالة TState, ExecutionPolicyInitializationPolicy = ExecutionPolicy.ChildFirst);/// أضف حالة جديدة أو قم بتحميل الحالة المضافة مسبقًا.public StateBuilder<TState, TEvent, TRecipient> In(TState State);/// إنشاء مصنع من استخدام builder.public StateMachineFactory< كتكوين TState, TEvent, TRecipient> Finalize();} فئة عامة مختومة StateBuilder<TState, TEvent, TRecipient> : IFinalizablewhere TState : notnullwhere TEvent : notnull{// إعادة الاتصال بـ StateMachineBuilder<TState, TEvent, TRecipient>.In(TState State).public StateBuilder<TState, TEvent, TRecipient> In(TStatestate);/// توجيه الدعوة إلى StateMachineBuilder<TState, TEvent, TRecipient>.Finalize();public StateMachineFactory<TState, TEvent, TRecipient> Finalize();/// وضع علامة على هذه الحالة كحالة فرعية للحالة المحددة.public StateBuilder<TState, TEvent, TRecipient> IsSubStateOf(TStatestate);/ // يحدد الإجراء الذي سيتم تنفيذه عند الدخول إلى هذه الحالة.public StateBuilder<TState, TEvent, TRecipient> OnEntry(Action action);/// مثل OnEntry(Action) ولكن قم بتمرير المستلم كمعلمة.public StateBuilder<TState, TEvent, TRecipient> OnEntry(Action<TRecipient> action);// نفس OnEntry (الإجراء) ولكن مرر إلى المفوض أي معلمة تم تمريرها أثناء المكالمة والتي تطابق نوع المعلمة العامة. /// إذا لم يتم العثور على معلمة تم تمريرها مع المعلمة العامة المحددة، تم تجاهله.public StateBuilder<TState, TEvent, TRecipient> OnEntry<TParameter>(Action<TParameter> action);// الإصدار المدمج من OnEntry(Action<TRecipient>) وOnEntry(Action<TParameter>).public StateBuilder<TState ، TEvent، TRecipient> OnEntry<TParameter>(Action<TRecipient, TParameter> action);// يحدد الإجراء الذي سيتم تنفيذه عند الخروج من هذه الحالة.public StateBuilder<TState, TEvent, TRecipient> OnExit(Action action);/// مثل OnExit(Action) ولكن قم بتمرير المستلم كمعلمة. public StateBuilder<TState, TEvent, TRecipient> OnExit(Action<TRecipient> action);/// مثل OnExit(Action) ولكن قم بتمرير أي معلمة تم تمريرها أثناء المكالمة إلى المفوض والتي تتطابق مع نوع المعلمة العامة. /// إذا لم يتم العثور على أي معلمة تم تمريرها مع المعلمة العامة المحددة، فسيتم تجاهلها.public StateBuilder<TState, TEvent, TRecipient> OnExit <TParameter>(Action<TParameter> action);/// الإصدار المدمج من OnExit(Action<TRecipient>) و OnExit(Action<TParameter>).public StateBuilder<TState, TEvent, TRecipient> OnExit<TParameter>(Action<TRecipient, TParameter> action);/// تحديد الإجراء المطلوب تنفيذه عند تحديث هذه الحالة.public StateBuilder<TState, TEvent, TRecipient> OnUpdate(Action action);/// مثل OnUpdate(Action) ولكن قم بتمرير المستلم كـ بارامترات.public StateBuilder<TState, TEvent, TRecipient> OnUpdate(Action<TRecipient> action);/// مثل OnUpdate(Action) ولكن قم بتمرير إلى المفوض أي معلمة تم تمريرها أثناء المكالمة والتي تطابق المعلمة العامة type.public StateBuilder< TState, TEvent, TRecipient> OnUpdate<TParameter>(Action<TParameter> action);/// نسخة مجمعة من OnUpdate(Action<TRecipient>) وOnUpdate(Action<TParameter>)./// إذا لم يتم العثور على أي معلمة تم تمريرها مع المعلمة العامة المحددة، فسيتم تجاهلها.public StateBuilder<TState, TEvent, TRecipient> OnUpdate<TParameter>(Action< TRecipient، TParameter> action)؛/// أضف سلوكًا يتم تنفيذه أثناء إطلاق الحدث المحدد.public TransitionBuilder<TState, TEvent, TRecipient, StateBuilder<TState, TEvent, TRecipient>> On(TEvent @event);// يتجاهل الحدث المحدد./// إذا لم تتم إضافة أي سلوك إلى حدث وتم تشغيله، فسيتم طرحه . يؤدي هذا إلى منع الرمي عن طريق تجاهل المكالمة على all.public StateBuilder<TState, TEvent, TRecipient> Ignore(TEvent @event);}فئة مغلقة عامة TransitionBuilder<TState, TEvent, TRecipient, TParent> : IFinalizable, ITransitionBuilder<TState>حيث TState : notnullwhere TEvent : notnull{// أضف انتقالًا فرعيًا يتم تنفيذه عندما يقوم المندوب بإرجاع true.public TransitionBuilder<TState, TEvent, TRecipient, TransitionBuilder<TState, TEvent, TRecipient, TParent>> If(Func<bool>guard);/// نفس If(Func<bool>) ولكن قم بتمرير المستلم كمعلمة.public TransitionBuilder<TState، TEvent، TRecipient، TransitionBuilder<TState، TEvent, TRecipient, TParent>> If(Func<TRecipient, bool>guard);/// مثل If(Func<bool>) ولكن قم بتمرير إلى المفوض أي معلمة تم تمريرها أثناء المكالمة والتي تطابق المعلمة العامة type.public TransitionBuilder <TState، TEvent، TRecipient، TransitionBuilder<TState، TEvent، TRecipient، TParent>> if<TParameter>(Func<TParameter, bool>guard);/// الإصدار المدمج من If(Func<TRecipient, bool>) وIf(Func<TParameter, bool>).public TransitionBuilder<TState, TEvent, TRecipient, TransitionBuilder <TState, TEvent, TRecipient, TParent>> إذا كان <TParameter>(Func<TParameter, bool>guard);// تحديد الإجراء الذي سيتم تنفيذه عند رفع الحدث.public TransitionBuilder<TState, TEvent, TRecipient, TParent> Do(Action action);/// مثل Do(Action) ولكن قم بتمرير المستلم كـ المعلمة.public TransitionBuilder<TState, TEvent, TRecipient, TParent> Do(Action<TRecipient> action);/// نفس Do(Action) لكن قم بتمرير أي معلمة تم تمريرها أثناء المكالمة إلى المفوض والتي تطابق نوع المعلمة العامة. // إذا لم يتم العثور على أي معلمة تم تمريرها مع المعلمة العامة المحددة، فسيتم تجاهلها.public TransitionBuilder<TState, TEvent, TRecipient, TParent> Do<TParameter> (إجراء <TParameter>)؛ /// الإصدار المدمج من Do(Action<TRecipient>) وDo(Action<TParameter>).public TransitionBuilder<TState, TEvent, TRecipient, TParent> Do<TParameter>(Action<TRecipient, TParameter> action);// تكوين سياسة كيفية تنفيذ المفوضين المشتركين في خطاف الإدخال.// إذا لم تكن هذه الطريقة كذلك تم تنفيذ السياسة الافتراضية هي TransitionPolicy.ParentFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnEntryPolicy(TransitionPolicy Policy);/// تكوين سياسة كيفية تنفيذ المفوضين المشتركين في خطاف الخروج. /// إذا لم يتم تنفيذ هذه الطريقة، فإن السياسة الافتراضية هي TransitionPolicy.ChildFirstWithCulling.public GotoBuilder<TState ، TEvent، TRecipient، TParent> OnExitPolicy (سياسة النقل) ؛ /// يحدد الحالة التي ينتقل إليها هذا الانتقال./// وهذا يعادل: OnEntryPolicy(TransitionPolicy.ChildFirstWithCulling).OnExitPolicy(TransitionPolicy.ParentFirstWithCulling).Goto(state).public TParent Goto(TStatestate);/// تحديد الانتقال إلى الحالة الحالية./// إذا كان runParentsActions صحيحًا: إجراءات OnExit وOnEntry لـ سيتم تنفيذ الحالة الحالية (ولكن ليس الحالات الأصلية في حالة كون الحالة الحالية حالة فرعية). /// هذا يعادل OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclusive).OnExitPolicy(TransitionPolicy.ParentFirstWithCullingInclusive).Goto(currentState)./// إذا runParentActions خطأ: إجراءات OnExit و OEntry للحالة الحالية (والآباء في حالة سيتم تنفيذ الحالة الحالية كونها حالة فرعية)./// هذا يعادل OnEntryPolicy(TransitionPolicy.ChildFirst).OnExitPolicy(TransitionPolicy.ParentFirst).Goto(currentState).public TParent GotoSelf(bool runParentsActions = false);/// يحدد لن يكون لها أي انتقال إلى أي حالة، لذلك لن يتم رفع أي حدث OnEntry أو OnExit./// هذا يعادل OnEntryPolicy(TransitionPolicy.Ignore).OnExitPolicy(TransitionPolicy.Ignore).GotoSelf().public TParent StaySelf();}فئة مغلقة عامة GotoBuilder<TState, TEvent, TRecipient, TParent> : IGoto<TState>حيث TState : notnullwhere TEvent : notnull{// تكوين سياسة كيف يجب تنفيذ المفوضين المشتركين في خطاف الإدخال./// إذا لم يتم تنفيذ هذه الطريقة، فإن السياسة الافتراضية هي TransitionPolicy.ParentFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnEntryPolicy(TransitionPolicy Policy);// Configures سياسة كيفية تنفيذ المفوضين المشتركين عند خطاف الخروج. /// إذا لم يتم تنفيذ هذه الطريقة، فستكون السياسة الافتراضية هو TransitionPolicy.ChildrenFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnExitPolicy(TransitionPolicy Policy);// يحدد الحالة التي ينتقل إليها هذا الانتقال.public TParent Goto(TState State);/// يحدد الانتقال إلى التيار State./// هذا اختصار لـ Goto(currentState).public TParent GotoSelf();}/// يحدد سياسة الانتقال بين حالتين./// هذا يضبط كيفية تشغيل المفوضين المشتركين في الولايات أثناء الانتقال بين الولايات. التعداد العام TransitionPolicy{// يحدد أنه لا ينبغي تشغيل المفوضين المشتركين.Ignore = 0,/// تحديد تشغيل المفوضين المشتركين على الوالدين أولاً.ParentFirst = 1,/// تحديد تشغيل المفوضين المشتركين على الأطفال أولاً.ChildFirst = 2,/// يحدد أن المفوضين المشتركين على الآباء يتم تشغيلهم أولاً من (باستثناء) الأصل المشترك الأخير بين الحالتين.ParentFirstWithCulling = 3,/// يحدد أن المفوضين المشتركين على الأطفال يتم تشغيلهم أولاً حتى الوصول (باستثناء) الأخير الأصل المشترك بين الحالتين.ChildFirstWithCulling = 4,/// يحدد أن المفوضين المشتركين على الوالدين يتم تشغيلهم أولاً من (بما في ذلك) الأصل المشترك الأخير بين الحالتين States.ParentFirstWithCullingInclusive = 5,/// تحديد تشغيل المفوضين المشتركين على الأطفال أولاً حتى الوصول (بما في ذلك) إلى آخر أصل مشترك بين الحالتين.ChildFirstWithCullingInclusive = 6,}/// يمثل شريحة من البيانات. بنية عامة للقراءة فقط ReadOnlySlice <T> : IReadOnlyList<T>{/// احصل على العنصر المحدد في ملف Index.public T this[int الفهرس] {احصل على؛ }/// احصل على عدد الشريحة. public int Count { get; }/// احصل على <see cref="ReadOnlyMemory{T}"/> لهذه الشريحة. ذاكرة ReadOnlyMemory<T> العامة { get; }/// احصل على <see cref="ReadOnlySpan{T}"/> من هذه الشريحة.public ReadOnlySpan<T> Span { get; }/// احصل على عداد الشريحة.public Enumerator GetEnumerator();/// عداد <see cref="ReadOnlySlice{T}"/>.public struct Enumerator : IEnumerator<T>{// احصل على العنصر الحالي من enumerator.public T Current { get؛ }/// ينتقل إلى العنصر التالي في enumeration.public bool MoveNext();/// إعادة تعيين التعداد.public void Reset();}}