Net State Machine
v0.4.0
ไลบรารีตัวสร้างเครื่องจักรสถานะสำหรับ .NET
ตัวอย่างต่อไปนี้แสดงฟังก์ชันบางอย่างของเครื่องสถานะ
ใช้ Enderlook.StateMachine; ตัวละครคลาสสาธารณะ {private static StateMachineFactory <States, Events, Character>? โรงงาน; ส่วนตัวแบบอ่านอย่างเดียวสุ่ม rnd = ใหม่ (); stateMachine แบบอ่านอย่างเดียวส่วนตัว <สถานะ, เหตุการณ์, ตัวละคร> stateMachine; สุขภาพ int ส่วนตัว = 100; อาหาร int ส่วนตัว = 100; รัฐ enum ส่วนตัว {นอน, เล่น, รับอาหาร, ล่า, รวบรวม,} กิจกรรม enum ส่วนตัว {HasFullHealth, LowHealth, IsHungry, IsNoLongerHungry,} public static async Task Main(){Character character = new(); While (true){Console.Clear();// ดำเนินการเรียกอัพเดตของเครื่องสถานะและส่งพารามิเตอร์ที่กำหนดเองไปให้ // พารามิเตอร์เป็นแบบทั่วไปดังนั้น ไม่ได้จัดสรรตามประเภทค่า// พารามิเตอร์นี้ถูกส่งผ่านไปยังผู้รับมอบสิทธิ์ที่สมัครสมาชิกซึ่งยอมรับประเภทอาร์กิวเมนต์ทั่วไปในลายเซ็นต์// หากคุณไม่ต้องการส่งผ่านพารามิเตอร์ คุณสามารถลบการเรียกเมธอด .With() ได้ // พารามิเตอร์นี้ ระบบยังสามารถใช้กับเหตุการณ์ไฟ method.Character.stateMachine.With(Character.rnd.NextSingle()).Update();Console.WriteLine($"State: {Character.stateMachine.CurrentState}.");Console. WriteLine($"Health: {Character.health}.");Console.WriteLine($"Food: {Character.food}.");รอ Task.Delay(10).ConfigureAwait(false);}}public Character(){// สร้างอินสแตนซ์ของ state 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 ส่วนตัวแบบคงที่ <สถานะ, เหตุการณ์, ตัวละคร> GetStateMachineFactory(){if (โรงงานไม่เป็นโมฆะ) กลับ โรงงาน; StateMachineFactory <สถานะ, เหตุการณ์, ตัวละคร>? Factory_ = StateMachine<States, Events, Character>// เครื่องสถานะถูกสร้างขึ้นจากโรงงานซึ่งทำให้การสร้างหลายอินสแตนซ์// ราคาถูกกว่าทั้ง CPU และหน่วยความจำเนื่องจากการคำนวณเสร็จสิ้นเพียงครั้งเดียวและแชร์ระหว่างอินสแตนซ์ที่สร้างขึ้น..CreateFactoryBuilder()// กำหนดสถานะเริ่มต้นของเครื่องสถานะ// พารามิเตอร์ตัวที่สองกำหนดว่าผู้รับมอบสิทธิ์ OnEntry ควรดำเนินการอย่างไรในระหว่างการเริ่มต้นเครื่องสถานะ // InitializationPolicy.Ignore หมายถึง ไม่ควรรัน..SetInitialState(States.Sleep, InitializationPolicy.Ignore)// กำหนดค่าสถานะ..ใน(States.Sleep)// ดำเนินการทุกครั้งที่เราเข้าสู่สถานะนี้..OnEntry(() => Console WriteLine("Going to bed")// ดำเนินการทุกครั้งที่เราออกจากสถานะนี้..OnExit(() => Console.WriteLine("Getting up."))// ดำเนินการทุกครั้ง วิธีการอัปเดต (อย่างใดอย่างหนึ่ง Update() หรือ With<T>(T).Update()) จะถูกดำเนินการและอยู่ในสถานะนี้// เหตุการณ์ทั้งหมดจัดให้มีการโอเวอร์โหลดเพื่อส่งผ่านผู้รับ ดังนั้นจึงสามารถใช้เป็นพารามิเตอร์ในระหว่างการสร้าง ของอินสแตนซ์ที่เป็นรูปธรรม// ยังจัดให้มีการโอเวอร์โหลดเพื่อส่งผ่านพารามิเตอร์ประเภทที่กำหนดเอง ดังนั้นจึงสามารถกำหนดพารามิเตอร์ระหว่างการเรียก With<T>(T).Update().// ยังจัดให้มีการโอเวอร์โหลดเพื่อส่งผ่านทั้งผู้รับและ พารามิเตอร์ตามอำเภอใจ type.// การโอเวอร์โหลดนี้ยังใช้กับ OnEntry(...), OnExit(...), If(...) และ Do(...) วิธีการ..OnUpdate(@this => @this.OnUpdateSleep( )).On(Events.HasFullHealth)// ดำเนินการทุกครั้งที่กิจกรรมนี้เริ่มทำงานในสถานะนี้..Do(() => Console.WriteLine("Pick toys."))// สถานะใหม่ที่จะผ่านหน้า..Goto( States.Play)// หรืออีกทางหนึ่ง คุณสามารถกำหนดค่านโยบายการดำเนินเหตุการณ์ได้ในระหว่างการเปลี่ยนแปลง// การเรียกเมธอดข้างต้นเทียบเท่ากับ:// .OnEntryPolicy(TransitionPolicy.ChildFirstWithCulling).OnExitPolicy(TransitionPolicy.ParentFirstWithCulling).Goto(States.Play)..On(Events. IsHungry)// ดำเนินการเฉพาะการโทรครั้งถัดไปหากเงื่อนไขเป็นจริง..If(@this => @ this.IsVeryWounded())// เรายังคงอยู่ในสถานะปัจจุบันของเราโดยไม่ต้องดำเนินการ OnEntry หรือผู้รับมอบสิทธิ์ OnExit..StaySelf()// วิธีการข้างต้นเป็นทางลัดของ: // .OnEntryPolicy(TransitionPolicy.Ignore).OnExitPolicy(TransitionPolicy. Ignore).Goto(States.Sleep).// หากเราต้องการดำเนินการกับผู้รับมอบสิทธิ์เหล่านั้น เราสามารถใช้:// .GotoSelf(false)// ซึ่งเป็นทางลัดของ:// .OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclude).OnExitPolicy(TransitionPolicy.ParentFirstWithCullingInclude).Goto(States.Sleep).// หากเพิ่มเติม เราต้องการดำเนินการผู้รับมอบสิทธิ์การเปลี่ยนแปลงจาก ผู้ปกครองระบุ (สิ่งที่ไม่มีประโยชน์ในตัวอย่างนี้เนื่องจาก State.Sleep ไม่ใช่รัฐย่อย) เราสามารถทำได้: // .GotoSelf(true)// ซึ่งเป็นทางลัดของ:// .OnEntryPolicy(TransitionPolicy.ChildFirst).OnExitPolicy(TransitionPolicy.ParentFirst).Goto(States.Sleep).// มิฉะนั้น จะดำเนินการเรียกครั้งถัดไปหากเงื่อนไขเป็นจริง .If(@this => @this.IsWounded()).Goto(States.Gather)// ดำเนินการอื่น โดยไม่มีเงื่อนไข..ไปที่(States.Hunt)// ละเว้นเหตุการณ์นี้ในการเปลี่ยนแปลงนี้// (หากเราไม่เพิ่มสิ่งนี้และเราทำให้เหตุการณ์นี้เกิดขึ้นโดยไม่ได้ตั้งใจ ข้อยกเว้นจะเกิดขึ้น)..ละเว้น(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("Stop going for food.")).In(States.Gather)// กำหนดว่าสถานะนี้เป็นสถานะย่อยของสถานะอื่น// ซึ่งหมายความว่า OnUpdate จะมอบหมายให้อยู่ในสถานะหลัก จะถูกเรียกใช้ด้วย// ขึ้นอยู่กับ OnEntryPolicy และ OnExitPolicy ที่กำหนดค่าไว้ในระหว่างการเปลี่ยน // ผู้รับมอบสิทธิ์ OnEntry และ OnExit ที่สมัครรับข้อมูลในสถานะนี้อาจทำงานในระหว่างการเปลี่ยนในสถานะย่อย ..IsSubStateOf(States.GettingFood).OnUpdate((Character @ นี่ พารามิเตอร์ float) => @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("Take bow.")).OnExit(() => Console.WriteLine("Drop bow")).OnUpdate((ตัวละคร @this, float parameter) => @this.OnUpdateHunt(parameter)).On(Events.IsNoLongerHungry).Goto(States.Sleep).On(Events.LowHealth).Goto(States.Sleep).Finalize();// ที่เชื่อมต่อกัน มีประโยชน์ในการลดการใช้หน่วยความจำในสถานการณ์แบบมัลติเธรด// นั่นเป็นเพราะโรงงานมีข้อมูลทั่วไประหว่างอินสแตนซ์ // ดังนั้นหากสองอินสแตนซ์ถูกสร้างขึ้นจากโรงงานที่แตกต่างกันสองแห่ง ก็จะใช้หน่วยความจำมากกว่า// มากกว่าสอง อินสแตนซ์ที่สร้างจากโรงงานเดียวกัน Interlocked.CompareExchange (อ้างอิงโรงงาน, โรงงาน_, null); คืนโรงงาน;} บูลส่วนตัว IsVeryWounded () => สุขภาพ <= 50; บูลส่วนตัว IsWounded () => สุขภาพ <= 75; โมฆะส่วนตัว OnUpdateHunt (float Luck){food += (int)MathF.Round(rnd.Next(8) * Luck);if (อาหาร >= 100){อาหาร = 100;stateMachine.Fire(Events.IsNoLongerHungry); // หรืออีกทางหนึ่งถ้าคุณต้องการส่งพารามิเตอร์ไปยังการเริ่มต้นของเครื่องสถานะ คุณสามารถทำได้: // stateMachine.With(paramter).Fire(Events.IsNoLongerHungry);}health -= (int)MathF.Round(rnd.Next(6) * (1 - โชค));if (สุขภาพ <= 20)stateMachine. Fire(Events.LowHealth);} โมฆะส่วนตัว OnUpdateGather(โชคลอย){food += (int)MathF.Round(rnd.Next(3) * โชค);if (อาหาร >= 100){food = 100;stateMachine.Fire(Events.IsNoLongerHungry);}if (rnd.Next(1) % 1 == 0){health++;if (health >= 100) {health = 100;stateMachine.Fire(Events.HasFullHealth);}}} โมฆะส่วนตัว OnUpdatePlay(){อาหาร -= 3;if (อาหาร <= 0){food = 0;stateMachine.Fire(Events.IsHungry);}} โมฆะส่วนตัว OnUpdateSleep(){health++;if (สุขภาพ >= 100){health = 100;stateMachine.Fire(กิจกรรม .HasFullHealth);}อาหาร -= 2;if (อาหาร <= 0){อาหาร = 0;stateMachine.Fire(เหตุการณ์หิว);}}}
StateMachine คลาสที่ปิดผนึกสาธารณะ <TState, TEvent, TRecipient> โดยที่ TState : notnullwhere TEvent : notnull{/// รับสถานะปัจจุบัน (ย่อย) ของเครื่องสถานะนี้ public TState CurrentState { รับ; }/// รับสถานะปัจจุบัน (ย่อย) และสถานะแม่ทั้งหมด hierarchy.public ReadOnlySlice<TState> CurrentStateHierarchy { รับ; }/// รับเหตุการณ์ที่ยอมรับตามปัจจุบัน (ย่อย) state.public ReadOnlySlice <TEvent> CurrentAcceptedEvents { รับ; }/// สร้างโรงงาน builder.public static StateMachineBuilder<TState, TEvent, TRecipient> CreateFactoryBuilder();/// รับสถานะพาเรนต์ของสถานะที่ระบุ/// หาก state ไม่ใช่สถานะย่อย จะส่งกลับ false.public bool GetParentStateOf(สถานะ TState, [NotNullWhen(true)] ออก TState? parentState);/// รับลำดับชั้นหลักของสถานะที่ระบุ หากสถานะไม่ใช่รัฐย่อย จะส่งกลับค่าว่างเปล่า public ReadOnlySlice<TState> GetParentHierarchyOf(TState state);/// รับเหตุการณ์ที่ได้รับการยอมรับโดย state.public ReadOnlySlice<TEvent> GetAcceptedEventsBy(TState state);/// กำหนด หากสถานะปัจจุบันเป็นสถานะที่ระบุหรือสถานะย่อย (ซ้อนกัน) ของ state.public bool IsInState (สถานะ TState);/// ยิงเหตุการณ์ ไปยังเครื่องสถานะ /// หากเครื่องสถานะกำลังยิงสถานะอยู่แล้ว มันจะถูกจัดคิวให้ทำงานหลังจากเสร็จสิ้นเหตุการณ์ปัจจุบัน public void Fire (TEvent @event);/// ยิงเหตุการณ์ไปยังเครื่องสถานะ / // เหตุการณ์จะไม่ถูกจัดคิวแต่จะทำงานจริง โดยไม่สนใจเหตุการณ์ที่อยู่ในคิวก่อนหน้านี้/// หากเหตุการณ์ต่อมาถูกจัดคิวระหว่างการดำเนินการเรียกกลับของเหตุการณ์นี้ เหตุการณ์เหล่านั้นจะถูกเรียกใช้หลังจากกิจกรรมนี้เสร็จสิ้น สาธารณะถือเป็นโมฆะ FireImmediately(TEvent @event);/// ดำเนินการเรียกกลับการอัปเดตที่ลงทะเบียนใน state.public void Update();/// จัดเก็บพารามิเตอร์ที่สามารถส่งผ่านไปยังผู้รับมอบสิทธิ์ที่สมัครสมาชิก Public parametersBuilder ด้วย<T>( พารามิเตอร์ T); Public Readonly struct ParametersBuilder{/// จัดเก็บพารามิเตอร์ที่สามารถส่งผ่านไปยัง callbacks.public ParametersBuilder ด้วย <TParameter> (พารามิเตอร์ TParameter); // เหมือนกับ Fire (TEvent) ใน คลาสพาเรนต์ แต่รวมค่าที่เก็บไว้ทั้งหมดที่สามารถส่งผ่านไปยังผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิก public void Fire(TEvent);/// เหมือนกับ FireImmediately(TEvent) ในคลาสพาเรนต์ แต่รวมค่าที่เก็บไว้ทั้งหมดที่สามารถส่งผ่านไปยังผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิก.public เป็นโมฆะ FireImmediately(TEvent);/// เหมือนกับ Update(TEvent) ในคลาสพาเรนต์ แต่รวมค่าที่เก็บไว้ทั้งหมดที่สามารถส่งผ่านไปยังผู้รับมอบสิทธิ์ที่สมัครสมาชิก public void Update(TEvent);} โครงสร้างแบบอ่านอย่างเดียวสาธารณะ InitializeParametersBuilder{/// จัดเก็บพารามิเตอร์ที่สามารถส่งผ่านไปยัง callbacks.public InitializeParametersBuilder ด้วย <TParameter>(พารามิเตอร์ TParameter);/// สร้างเครื่องสถานะ public StateMachine<TState, TEvent, TRecipient> สร้าง (ผู้รับ TRecipient);} } คลาสที่ปิดผนึกสาธารณะ StateMachineFactory <TState, TEvent, TRecipient> โดยที่ TState : notnull โดยที่ TEvent : notnull{/// สร้างเครื่องสถานะที่กำหนดค่าและเริ่มต้นโดยใช้การกำหนดค่าที่ได้รับจากโรงงานนี้ public StateMachine<TState, TEvent, TRecipient> สร้าง (ผู้รับ TRecipient);/// เก็บพารามิเตอร์ที่สามารถส่งผ่านไปยังการสมัครสมาชิก delegates.public StateMachine<TState, TEvent, TRecipient>.InitializeParametersBuilder ด้วย <T>(พารามิเตอร์ T);} คลาสที่ปิดผนึกสาธารณะ StateMachineBuilder<TState, TEvent, TRecipient> : IFinalizablewhere TState : notnullwhere TEvent : notnull{/// กำหนดสถานะเริ่มต้นของเครื่องสถานะ // `initializationPolicy` กำหนดวิธีการสมัครรับมอบสิทธิ์ในเตาอบ OnEntry ของสถานะที่ระบุ (และพาเรนต์ state) จะถูกรันในระหว่างการเริ่มต้น state machine.public StateMachineBuilder<TState, TEvent, TRecipient> SetInitialState (สถานะ TState, ExecutionPolicy defaultizationPolicy = ExecutionPolicy.ChildFirst);/// เพิ่มสถานะใหม่หรือโหลด state.public StateBuilder <TState, TEvent, TRecipient> ใน (สถานะ TState);/// สร้างโรงงาน จากการใช้เป็นการกำหนดค่า builder.public StateMachineFactory<TState, TEvent, TRecipient> สรุป ();} คลาสที่ปิดผนึกสาธารณะ StateBuilder<TState, TEvent, TRecipient> : IFinalizablewhere TState : notnullwhere TEvent : notnull{/// Fowards เรียกไปยัง StateMachineBuilder<TState, TEvent, TRecipient>.In(TState state).public StateBuilder<TState , TEvent, TRecipient> ใน (สถานะ TState); // ส่งต่อการโทรไปที่ StateMachineBuilder<TState, TEvent, TRecipient>.Finalize();public StateMachineFactory<TState, TEvent, TRecipient> Finalize();/// ทำเครื่องหมายสถานะนี้เป็นสถานะย่อยของ state.public StateBuilder<TState, TEvent, TRecipient> IsSubStateOf (สถานะ TState);/// กำหนดการดำเนินการที่จะดำเนินการเมื่อเข้าสู่ state.public StateBuilder<TState, TEvent, TRecipient> OnEntry (การกระทำการกระทำ); // เหมือนกับ OnEntry (การกระทำ) แต่ส่งผู้รับเป็นพารามิเตอร์ public StateBuilder<TState, TEvent, TRecipient> OnEntry (การกระทำ <TRecipient> การกระทำ);/// เหมือนกับ OnEntry (การดำเนินการ) แต่ส่งผ่านพารามิเตอร์ใดๆ ที่ส่งผ่านระหว่างการโทรไปยังผู้รับมอบสิทธิ์ซึ่งตรงกับประเภทพารามิเตอร์ทั่วไป // หากไม่พบพารามิเตอร์ที่ส่งผ่านด้วยพารามิเตอร์ทั่วไปที่ระบุ ระบบจะเพิกเฉยต่อสาธารณะ StateBuilder<TState, TEvent, TRecipient> OnEntry<TParameter>(Action<TParameter> action);/// เวอร์ชันรวมของ OnEntry(Action<TRecipient>) และ OnEntry(Action<TParameter>).public StateBuilder<TState, TEvent, TRecipient > OnEntry<TParameter>(การกระทำ<TRecipient, TParameter> การกระทำ);/// กำหนดการกระทำที่จะดำเนินการเมื่อออก fropm this state.public StateBuilder<TState, TEvent, TRecipient> OnExit(Action action);/// เหมือนกับ OnExit(Action) แต่ส่งผู้รับเป็น parameter.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 > (การกระทำ < 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>> เปิด (TEvent @event);/// ละเว้นเหตุการณ์ที่ระบุ./// หากไม่มีพฤติกรรมใดถูกเพิ่มเข้าไปในเหตุการณ์และเริ่มทำงาน มันจะโยนทิ้ง วิธีนี้จะป้องกันการโยนโดยไม่สนใจการโทรที่ all.public StateBuilder<TState, TEvent, TRecipient> Ignore(TEvent @event);}public ปิดผนึกคลาส 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>) แต่ส่งผู้รับเป็นพารามิเตอร์ 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>> ถ้า <TParameter>(Func<TParameter, bool> guard);/// เวอร์ชันรวมของ ถ้า(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) แต่ส่งผู้รับเป็น parameter.public TransitionBuilder<TState, TEvent, TRecipient, TParent> Do(Action<TRecipient> action);// / เหมือนกับ Do(Action) แต่ส่งต่อพารามิเตอร์ใด ๆ ที่ส่งผ่านระหว่างการโทรไปยังผู้รับมอบสิทธิ์ซึ่งตรงกับประเภทพารามิเตอร์ทั่วไป // หากไม่พบพารามิเตอร์ที่ส่งผ่านด้วยพารามิเตอร์ทั่วไปที่ระบุ ระบบจะเพิกเฉยต่อสาธารณะ TransitionBuilder<TState, TEvent, TRecipient, TParent> Do<TParameter>(Action<TParameter> action);/// เวอร์ชันรวมของ Do(Action<TRecipient>) และ Do(Action<TParameter>).public TransitionBuilder<TState, TEvent , TRecipient, TParent> Do<TParameter>(Action<TRecipient, TParameter> action);/// กำหนดค่านโยบายของวิธีการ ผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกใน hook รายการควรถูกดำเนินการ // หากไม่ได้ดำเนินการวิธีนี้ นโยบายเริ่มต้นคือ TransitionPolicy.ParentFirstWithCulling.public GotoBuilder <TState, TEvent, TRecipient, TParent> OnEntryPolicy (นโยบาย TransitionPolicy);/// กำหนดค่า นโยบายเกี่ยวกับวิธีการดำเนินการของผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกเมื่อ hook ทางออก // หากไม่ได้ดำเนินการวิธีนี้ นโยบายเริ่มต้นคือ TransitionPolicy.ChildFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnExitPolicy(นโยบาย TransitionPolicy);/// กำหนดว่าการเปลี่ยนแปลงนี้จะดำเนินไปในสถานะใด/// สิ่งนี้เทียบเท่ากับ: OnEntryPolicy(TransitionPolicy.ChildFirstWithCulling).OnExitPolicy(TransitionPolicy) .ParentFirstWithCulling).Goto(state).public TParent Goto(TState state);/// กำหนดให้เปลี่ยนผ่านไปยังสถานะปัจจุบัน/// หาก runParentsActions เป็นจริง: การดำเนินการ OnExit และ OnEntry ของสถานะปัจจุบัน (แต่ไม่ใช่สถานะพาเรนต์ในกรณีที่สถานะปัจจุบันเป็นสถานะย่อย) จะถูกดำเนินการ ./// นี่เทียบเท่ากับ OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclude).OnExitPolicy(TransitionPolicy.ParentFirstWithCullingInclude).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);/// กำหนดค่านโยบายของวิธีการสมัครรับมอบสิทธิ์ใน ควรจะดำเนินการ exit hook./// หากไม่ได้ดำเนินการวิธีนี้ นโยบายเริ่มต้นคือ TransitionPolicy.ChildrenFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnExitPolicy(นโยบาย TransitionPolicy);/// กำหนดสถานะที่การเปลี่ยนแปลงนี้จะดำเนินไป สาธารณะ TParent Goto (สถานะ TState);/// กำหนดว่าจะเปลี่ยนผ่านไปยังสถานะปัจจุบัน ./// นี่เป็นทางลัดของ Goto(currentState).public TParent GotoSelf();}/// กำหนดนโยบายการเปลี่ยนแปลง ระหว่างสองสถานะ /// นี่เป็นการกำหนดค่าวิธีการเรียกใช้ผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกในสถานะระหว่างการเปลี่ยนระหว่าง state.public enum TransitionPolicy{/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกไม่ควรทำงาน ละเว้น = 0,/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครรับข้อมูลในผู้ปกครองนั้น run first.ParentFirst = 1,/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกในบุตรหลานจะถูกรันก่อน ChildFirst = 2,/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกใน parent จะถูกเรียกใช้ก่อนจาก (ไม่รวม) พาเรนต์ทั่วไปตัวสุดท้ายระหว่างสองสถานะ ParentFirstWithCulling = 3,/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกในรุ่นลูกจะถูกรันก่อนจนกว่าจะถึง (ไม่รวม) พาเรนต์ทั่วไปตัวสุดท้ายระหว่างสองสถานะ ChildFirstWithCulling = 4,/// กำหนด ว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกบนพาเรนต์จะถูกรันก่อนจาก (รวมถึง) พาเรนต์ทั่วไปตัวสุดท้ายระหว่างสองสถานะ ParentFirstWithCullingInclude = 5,/// กำหนดว่าผู้รับมอบสิทธิ์ที่สมัครเป็นสมาชิกในรุ่นลูกจะถูกรัน แรกจนกระทั่งถึง (รวมถึง) พาเรนต์ทั่วไปสุดท้ายระหว่างสองสถานะ ChildFirstWithCullingInclude = 6,}/// แสดงส่วนของ data.public readonly struct ReadOnlySlice<T> : IReadOnlyList<T>{/// รับองค์ประกอบที่ระบุที่ index.public T นี้ [ดัชนี int] { รับ; }/// รับจำนวน Slice.public int Count { รับ; }/// รับ <see cref="ReadOnlyMemory{T}"/> ของหน่วยความจำ readOnlyMemory<T> ของ Slice.public นี้ { get; }/// รับ <see cref="ReadOnlySpan{T}"/> ของ Slice.public ReadOnlySpan<T> Span นี้ { get; }/// รับตัวแจงนับของ Slice.public Enumerator GetEnumerator();/// ตัวแจงนับของ <see cref="ReadOnlySlice{T}"/>.public struct Enumerator : IEnumerator<T>{/// รับองค์ประกอบปัจจุบัน ของ enumerator.public T ปัจจุบัน { รับ; }/// ย้ายไปยังองค์ประกอบถัดไปของ enumeration.public bool MoveNext();/// รีเซ็ตการแจงนับ.public void Reset();}}