다음을 통해 공유


안정성 규칙

안정성 규칙은 올바른 메모리 및 스레드 사용과 같은 라이브러리 및 애플리케이션 안정성을 지원합니다. 안정성 규칙은 다음과 같습니다.

규칙 묘사
CA2000: 범위를 손실하기 전에 개체 삭제 개체의 종료자가 실행되지 않도록 하는 예외적인 이벤트가 발생할 수 있으므로 개체에 대한 모든 참조가 범위를 벗어나기 전에 개체를 명시적으로 삭제해야 합니다.
CA2002: ID 약한 개체를 잠그지 마세요. 개체는 애플리케이션 도메인 경계를 넘어 직접 액세스할 수 있는 경우 약한 ID를 가지고 있다고 합니다. ID가 약한 개체에 대한 잠금을 획득하려는 스레드는 동일한 개체에 대한 잠금이 있는 다른 애플리케이션 도메인의 두 번째 스레드에 의해 차단될 수 있습니다.
CA2007: 작업 직접 기다리지 마세요. 직접 비동기 메서드 대기합니다.
CA2008: TaskScheduler 전달하지 않고 작업을 만들지 마세요. 작업 만들기 또는 연속 작업은 TaskScheduler 매개 변수를 지정하지 않는 메서드 오버로드를 사용합니다.
CA2009: 변경할 수 없는Collection 값 ToImmutableCollection을 호출하지 마세요. ToImmutable 메서드는 System.Collections.Immutable 네임스페이스에서 변경할 수 없는 컬렉션에서 불필요하게 호출되었습니다.
CA2011: setter 내에 속성을 할당하지 마세요. 속성에 고유한 집합 접근자값이 실수로 할당되었습니다.
CA2012: ValueTasks를 올바르게 멤버 호출에서 반환된 ValueTasks는 직접 대기됩니다. ValueTask를 여러 번 사용하거나 완료된 것으로 알려지기 전에 해당 결과에 직접 액세스하려고 하면 예외 또는 손상이 발생할 수 있습니다. 이러한 ValueTask를 무시하면 기능 버그가 표시되고 성능이 저하 될 수 있습니다.
CA2013: 값 형식과 함께 ReferenceEquals를 사용하지 마세요 System.Object.ReferenceEquals사용하여 값을 비교할 때 objA 및 objB가 값 형식인 경우 ReferenceEquals 메서드에 전달되기 전에 boxed됩니다. 즉, objA와 objB가 모두 값 형식의 동일한 인스턴스를 나타내는 경우에도 ReferenceEquals 메서드는 false를 반환합니다.
CA2014: 루프에서 stackalloc를 사용하지 마세요. stackalloc에 의해 할당된 스택 공간은 현재 메서드의 호출이 끝날 때만 해제됩니다. 루프에서 사용하면 무제한 스택 증가 및 최종 스택 오버플로 조건이 발생할 수 있습니다.
CA2015: MemoryManager<T> 파생된 형식에 대한 종료자를 정의하지 마세요. MemoryManager<T> 파생된 형식에 종료자를 추가하면 Span<T>사용 중인 동안 메모리를 해제할 수 있습니다.
CA2016: CancellationToken 매개 변수를 하나의 사용하는 메서드로 전달 작업 취소 알림이 제대로 전파되도록 하는 메서드에 CancellationToken 매개 변수를 전달하거나, 토큰을 의도적으로 전파하지 않음을 나타내기 위해 명시적으로 CancellationToken.None 전달합니다.
CA2017: 매개 변수 개수 불일치 로깅 메시지 템플릿에 제공된 매개 변수 수가 명명된 자리 표시자 수와 일치하지 않습니다.
CA2018: countBuffer.BlockCopy 인수는 복사할 바이트 수를 지정해야 Buffer.BlockCopy사용하는 경우 count 인수는 복사할 바이트 수를 지정합니다. 요소가 정확히 1 바이트 크기의 배열에서 Array.Length 인수에 대해서만 count 사용해야 합니다. byte, sbytebool 배열에는 1 바이트 크기의 요소가 있습니다.
CA2019: ThreadStatic 필드는 인라인 초기화 사용하면 안 됩니다. ThreadStaticAttribute 주석이 추가된 필드는 인라인으로 초기화되거나 visual Basic의staticShared 명시적으로 초기화됩니다.
CA2020: IntPtr/UIntPtr 기본 제공 연산자로 인한 동작 변경 방지 .NET 7에 추가된 일부 기본 제공 연산자는 .NET 6 및 이전 버전의 사용자 정의 연산자와 다르게 작동합니다. 오버플로하는 동안 선택되지 않은 컨텍스트에서 throw하는 데 사용한 일부 연산자는 확인된 컨텍스트 내에서 래핑되지 않는 한 더 이상 throw되지 않습니다. 이전에 확인된 컨텍스트에서 throw하지 않은 일부 연산자는 이제 선택되지 않은 컨텍스트 내에서 래핑되지 않는 한 throw됩니다.
CA2021: 호환되지 않는 형식으로 Enumerable.Cast<T> 또는 Enumerable.OfType<T> 호출하지 마세요 Enumerable.Cast<TResult>(IEnumerable) 또는 Enumerable.OfType<TResult>(IEnumerable) 호출은 입력 컬렉션의 형식과 호환되지 않는 형식 매개 변수를 지정합니다.
CA2022: Stream.Read 사용하여 읽지 않도록 방지 Stream.Read 호출하면 요청된 바이트보다 적은 바이트를 반환할 수 있으므로 반환 값이 확인되지 않으면 신뢰할 수 없는 코드가 생성됩니다.
CA2024: 비동기 메서드에서 StreamReader.EndOfStream을 사용하지 마세요 속성 StreamReader.EndOfStream 데이터가 버퍼링되지 않은 경우 의도하지 않은 동기 차단이 발생할 수 있습니다. 대신 스트림의 끝에 도달할 때 StreamReader.ReadLineAsync() 반환하는 null 직접 사용합니다.