Net State Machine
v0.4.0
.NET용 상태 머신 빌더 라이브러리입니다.
다음 예에서는 상태 머신의 일부 기능을 보여줍니다.
Enderlook.StateMachine 사용;public class Character{private static StateMachineFactory<States, Events, Character>? Factory;private readonly Random rnd = new();private readonly StateMachine<States, Events, Character> stateMachine;private int health = 100;private int food = 100;private enum States{Sleep,Play,GettingFood,Hunt,Gather,} 개인 열거형 Events{HasFullHealth,LowHealth,IsHungry,IsNoLongerHungry,}public static async Task Main(){Character Character = new();while (true){Console.Clear();// 상태 시스템의 업데이트 호출을 실행하고 임의의 매개변수를 지정합니다.// 매개변수는 일반이므로 값 유형에 할당하지 않습니다.// 이 매개변수는 일반 인수 유형을 허용하는 구독된 대리자에게 전달됩니다. 서명입니다.// 매개변수를 전달하지 않으려면 .With() 메서드 호출을 제거할 수 있습니다.// 이 매개변수 시스템은 화재 이벤트 메서드와 함께 사용할 수도 있습니다.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(매개변수)` 메소드는 필요한 만큼 여러 번 연결할 수 있습니다. // `stateMachine.With(p1).With(p2)...With(pn).SomeMethod(...)` 패턴은 `Fire()`, `FireImmediately()` 및 `Update 메소드에도 유효합니다. ()`.}private static StateMachineFactory<States, Events, Character> GetStateMachineFactory(){if (팩토리가 null이 아님)return Factory;StateMachineFactory<상태, 이벤트, 캐릭터>? Factory_ = StateMachine<States, Events, Character>// 상태 머신은 팩토리에서 생성되므로 여러 인스턴스를 생성할 수 있습니다.// 계산이 한 번 수행되고 생성된 인스턴스 간에 공유되므로 CPU와 메모리 모두 저렴합니다..CreateFactoryBuilder()// 상태 기계의 초기 상태를 결정합니다.// 두 번째 매개변수는 상태 기계 초기화 중에 OnEntry 대리자가 실행되어야 하는 방법을 결정합니다.// InitializationPolicy.Ignore는 실행되지 않아야 함을 의미합니다. run..SetInitialState(States.Sleep, InitializationPolicy.Ignore)// 상태를 구성합니다..In(States.Sleep)// 이 상태에 들어갈 때마다 실행됩니다..OnEntry(() => Console.WriteLine("Going 침대로."))// 이 상태에서 나갈 때마다 실행됩니다..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("장난감 선택."))// 전환할 새 상태..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).// 해당 대리자를 실행하려면://를 사용할 수 있습니다. .GotoSelf(false)// 이는 // .OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclusive).OnExitPolicy(TransitionPolicy.ParentFirstWithCullingInclusive).Goto(States.Sleep)의 바로가기입니다.// 추가로, 우리는 해당 항목에서 전환 대리자를 실행하고 싶었습니다. 부모 상태(State.Sleep은 State.Sleep이 아니기 때문에 이 예에서는 유용하지 않습니다. 하위 상태) // .GotoSelf(true)// 이는 // .OnEntryPolicy(TransitionPolicy.ChildFirst).OnExitPolicy(TransitionPolicy.ParentFirst).Goto(States.Sleep)의 바로가기입니다.// 그렇지 않으면 다음을 실행합니다. 조건이 true이면 다음 호출..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((Character @this, float 매개변수) => @this.OnUpdateGather(매개변수)).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("활을 내려놓습니다.")).OnUpdate((Character @this, float 매개변수) => @this.OnUpdateHunt(매개변수)).On(Events.IsNoLongerHungry).Goto(States.Sleep).On(이벤트 .LowHealth).Goto(States.Sleep).Finalize();// 연동은 멀티스레딩에서 메모리 사용량을 줄이는 데 유용합니다. 상황.// 이는 팩토리에 인스턴스 간의 공통 데이터가 포함되어 있기 때문입니다.// 따라서 두 개의 인스턴스가 두 개의 다른 팩토리에서 생성되면 // 동일한 팩토리에서 생성된 두 개의 인스턴스보다 더 많은 메모리를 소비하게 됩니다.Interlocked.CompareExchange(ref 팩토리, Factory_, null);반환 공장;}private bool IsVeryWounded() => health <= 50;private bool IsWounded() => health <= 75;private void OnUpdateHunt(float luck){food += (int)MathF.Round(rnd.Next(8) * luck);if (food >= 100){food = 100;stateMachine.Fire(Events.IsNoLongerHungry); // 또는 상태 머신 초기화에 매개변수를 전달하려는 경우 다음을 수행할 수 있습니다. // stateMachine.With(paramter).Fire(Events.IsNoLongerHungry);}health -= (int)MathF.Round(rnd.Next(6) * (1 - luck));if (health <= 20)stateMachine. Fire(Events.LowHealth);}private void OnUpdateGather(float luck){food += (int)MathF.Round(rnd.Next(3) * luck);if (food >= 100){food = 100;stateMachine.Fire(Events.IsNoLongerHungry);}if (rnd.Next(1) % 1 = = 0){건강++;if (건강 >= 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);}}}
public sealing class StateMachine<TState, TEvent, TRecipient>where TState : notnullwhere TEvent : notnull{/// 이 상태의 현재 (하위)상태를 가져옵니다. machine.public TState CurrentState { get; }/// 현재 (하위)상태 및 모든 상위 상태 계층 구조를 가져옵니다.public ReadOnlySlice<TState> CurrentStateHierarchy { get; }/// Get은 현재 (하위)state.public ReadOnlySlice<TEvent> CurrentAcceptedEvents { get; }/// 팩토리를 생성합니다. builder.public static StateMachineBuilder<TState, TEvent, TRecipient> CreateFactoryBuilder();/// 지정된 상태의 상위 상태를 가져옵니다./// 상태가 하위 상태가 아닌 경우 false.public bool을 반환합니다. GetParentStateOf(TState state, [NotNullWhen(true)] out TState? parentState);/// 지정된 상태의 상위 계층 구조를 가져옵니다. 상태가 하위 상태가 아닌 경우 빈 상태를 반환합니다.public ReadOnlySlice<TState> GetParentHierarchyOf(TState state);/// 지정된 상태에서 허용되는 이벤트를 가져옵니다.public ReadOnlySlice<TEvent> GetAcceptedEventsBy(TState state);/// 결정 현재 상태가 지정된 상태이거나 지정된 state.public bool IsInState(TState state)의 (중첩) 하위 상태인 경우;/// Fire 상태 머신에 이벤트를 보냅니다./// 상태 머신이 이미 상태를 실행 중인 경우 현재 이벤트가 완료된 후 실행되도록 대기열에 추가됩니다.public void Fire(TEvent @event);/// 상태 머신에 이벤트를 실행합니다. ./// 이벤트는 대기열에 추가되지 않지만 실제로 실행되며 이전에 대기열에 추가된 이벤트는 무시됩니다./// 이 이벤트의 콜백 실행 중에 후속 이벤트가 대기열에 추가되면 완료 후에도 실행됩니다. of this event.public void FireImmediately(TEvent @event);/// 현재 상태에 등록된 업데이트 콜백을 실행합니다.public void Update();/// 구독한 Delegates.public에 전달할 수 있는 매개변수를 저장합니다. ParameterBuilder With<T>(T 매개 변수);public readonly structParameterBuilder{/// callbacks에 전달할 수 있는 매개 변수를 저장합니다.publicParameterBuilder With<TParameter>(TParameter 매개변수);/// 상위 클래스의 Fire(TEvent)와 동일하지만 구독된 대리자에게 전달될 수 있는 모든 저장된 값을 포함합니다.public void Fire(TEvent);/// 상위 클래스의 FireImmediately(TEvent)와 동일하지만 다음을 포함합니다. 구독된 위임자에게 전달될 수 있는 모든 저장 값.public void FireImmediately(TEvent);/// 상위 클래스의 Update(TEvent)와 동일하지만 구독자에게 전달될 수 있는 모든 저장 값을 포함합니다. Delegates.public void Update(TEvent);}public readonly struct InitializeParametersBuilder{/// callbacks에 전달할 수 있는 매개변수를 저장합니다.public InitializeParametersBuilder With<TParameter>(TParameter 매개변수);/// 상태 머신을 생성합니다.public StateMachine< TState, TEvent, TRecipient> Create(TRecipient 수신자);}}공개 봉인 클래스 StateMachineFactory<TState, TEvent, TRecipient>where TState : notnullwhere TEvent : notnull{/// 이 공장에서 제공하는 구성을 사용하여 구성 및 초기화된 상태 기계를 생성합니다.public StateMachine<TState, TEvent, TRecipient> Create(TRecipient 수신자);/// 매개변수를 저장합니다( s) 구독된 위임자에게 전달될 수 있습니다.public StateMachine<TState, TEvent, TRecipient>.InitializeParametersBuilder With<T>(T 매개변수);}공개 봉인 클래스 StateMachineBuilder<TState, TEvent, TRecipient> : IFinalizedwhere TState : notnullwhere TEvent : notnull{/// 상태 시스템의 초기 상태를 결정합니다./// `initializationPolicy`는 구독된 OnEntry 오븐에 대한 위임 방법을 결정합니다. 상태 머신을 초기화하는 동안 지정된 상태(및 상위 상태)가 실행됩니다.public StateMachineBuilder<TState, TEvent, TRecipient> SetInitialState(TState state, ExecutionPolicy 초기화Policy = ExecutionPolicy.ChildFirst);/// 새로운 상태를 추가하거나 이전에 추가된 상태를 로드합니다.public StateBuilder<TState, TEvent, TRecipient> In(TState state);/// 팩토리를 생성합니다. builder.public StateMachineFactory<TState, TEvent, TRecipient>를 구성으로 사용하지 않음 Finalize();}공개 봉인 클래스 StateBuilder<TState, TEvent, TRecipient> : IFinalizedwhere TState : notnullwhere TEvent : notnull{/// StateMachineBuilder<TState, TEvent, TRecipient>.In(TState state).public StateBuilder<TState에 대한 호출을 전달합니다. , TEvent, TRecipient> In(TState state);/// StateMachineBuilder<TState, TEvent, TRecipient>.Finalize();public StateMachineFactory<TState, TEvent, TRecipient> Finalize();/// 이 상태를 지정된 상태의 하위 상태로 표시합니다.public StateBuilder<TState, TEvent, TRecipient> IsSubStateOf(TState state) ;/// 이 상태에 진입할 때 실행할 작업을 결정합니다.public StateBuilder<TState, TEvent, TRecipient> OnEntry(Action action);/// OnEntry(Action)과 동일하지만 수신자를 매개변수로 전달합니다.public StateBuilder<TState, TEvent, TRecipient> OnEntry(Action<TRecipient> action);/// OnEntry(Action)과 동일하지만 일반 매개변수 유형과 일치하는 호출 중에 전달된 모든 매개변수를 대리자에게 전달합니다./// 지정된 일반 매개변수와 함께 전달된 매개변수가 없으면 무시됩니다.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);}public sealing class TransitionBuilder<TState, TEvent, TRecipient, TParent> : IFinalized, ITransitionBuilder<TState>where 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>> If<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>(Action<TParameter> action);/// 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 정책);/// 종료 후크에서 구독된 대리자가 실행되어야 하는 방법에 대한 정책을 구성합니다./// 이 메서드가 실행되지 않는 경우 , 기본 정책은 TransitionPolicy.ChildFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnExitPolicy(TransitionPolicy 정책);/// 이 전환이 어떤 상태로 진행되는지 결정합니다./// 이는 다음과 동일합니다: OnEntryPolicy(TransitionPolicy.ChildFirstWithCulling).OnExitPolicy(TransitionPolicy.ParentFirstWithCulling).Goto(state).public TParent Goto(TState state);/// 현재 상태로 전환하기로 결정합니다. state./// runParentsActions가 true인 경우: 현재 상태(현재 상태가 하위 상태인 경우 상위 상태는 아님)의 OnExit 및 OnEntry 작업이 실행됩니다./// 이는 OnEntryPolicy(TransitionPolicy.ChildFirstWithCullingInclusive).OnExitPolicy와 동일합니다. (TransitionPolicy.ParentFirstWithCullingInclusive).Goto(currentState)./// runParentActions가 다음인 경우 false: 현재 상태(및 현재 상태가 하위 상태인 경우 부모)의 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();}public sealing class GotoBuilder<TState, TEvent, TRecipient, TParent> : IGoto<TState>where TState : notnullwhere TEvent : notnull{/// 항목 후크에서 구독된 위임이 실행되어야 하는 방법에 대한 정책을 구성합니다./// 이 메서드가 실행되지 않으면 기본 정책은 TransitionPolicy.ParentFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnEntryPolicy입니다. (TransitionPolicy 정책);/// 종료 후크에서 구독된 위임이 실행되어야 하는 방법에 대한 정책을 구성합니다./// 이 메서드가 그렇지 않은 경우 실행되면 기본 정책은 TransitionPolicy.ChildrenFirstWithCulling.public GotoBuilder<TState, TEvent, TRecipient, TParent> OnExitPolicy(TransitionPolicy 정책);/// 이 전환이 어떤 상태로 진행되는지 결정합니다.public TParent Goto(TState state);/// 결정 현재 상태로 전환합니다./// Goto(currentState).public TParent의 단축키입니다. GotoSelf();}/// 두 상태 간의 전환 정책을 결정합니다./// 이는 상태 간 전환 중에 상태의 구독된 대리자가 실행되는 방법을 구성합니다.public enum TransitionPolicy{/// 구독한 대리자가 실행되지 않아야 함을 결정합니다.Ignore = 0,/// 부모의 구독된 대리자가 먼저 실행되도록 결정합니다.ParentFirst = 1,/// 하위의 구독된 대리자가 먼저 실행되도록 결정합니다.ChildFirst = 2,/// 부모의 구독된 대리자가 두 상태 사이의 마지막 공통 상위에서 먼저 실행(제외)되도록 결정합니다.ParentFirstWithCulling = 3,/// 마지막에 도달(제외)할 때까지 하위의 구독된 대리자가 먼저 실행되도록 결정합니다. 두 상태 사이의 공통 부모.ChildFirstWithCulling = 4,/// 부모의 구독된 대리자가 둘 사이의 마지막 공통 부모(포함)에서 먼저 실행되도록 결정합니다. States.ParentFirstWithCullingInclusive = 5,/// 두 상태 사이의 마지막 공통 상위에 도달(포함)할 때까지 하위 항목에 대한 구독된 대리자가 먼저 실행되도록 결정합니다.ChildFirstWithCullingInclusive = 6,}/// data.public readonly 구조체 ReadOnlySlice의 조각을 나타냅니다. <T> : IReadOnlyList<T>{/// index.public에 지정된 요소를 가져옵니다. T this[int index] { get; }/// 슬라이스 개수를 가져옵니다.public int Count { get; }/// 이 슬라이스의 <see cref="ReadOnlyMemory{T}"/>를 가져옵니다.public ReadOnlyMemory<T> Memory { get; }/// 이 슬라이스의 <see cref="ReadOnlySpan{T}"/>를 가져옵니다.public ReadOnlySpan<T> Span { get; }/// Slice.public의 열거자 가져오기 Enumerator GetEnumerator();/// <see cref="ReadOnlySlice{T}"/>의 열거자.public struct Enumerator : IEnumerator<T>{/// 현재 요소 가져오기 enumerator.public T Current { get; }/// enumeration.public bool MoveNext()의 다음 요소로 이동합니다./// enumeration.public void Reset();}}