C #의 정적 클래스 및 정적 클래스 멤버 설명

C # 프로그래밍 언어의 static 키워드를 사용하면 정적 클래스와 정적 멤버를 정의 할 수 있습니다.

정적 클래스는 추상적이고 봉인 된 클래스와 유사합니다. 정적 클래스와 비 정적 클래스의 차이점은 정적 클래스는 인스턴스화하거나 상속 할 수 없으며 클래스의 모든 멤버는 본질적으로 정적이라는 것입니다. 클래스를 static으로 선언하려면 클래스 선언에서 static 키워드로 표시해야합니다. 

정적 클래스 나 멤버에는 비헤이비어가 없으므로 정적 클래스가 상속되도록 허용하는 것도 의미가 없습니다. 정적 클래스는 정적 멤버 만 가질 수 있습니다. 정적 클래스에서 인스턴스 멤버 (메서드, 변수, 속성 등)를 선언 할 수 없습니다. 정적 클래스에는 정적 생성자가있을 수 있지만 정적 클래스에는 인스턴스 생성자가있을 수 없습니다.

C #에서 정적 클래스를 사용하는 경우

언제 정적 수업에 가야합니까? 일반적으로 도우미 또는 유틸리티 클래스를 인스턴스화하거나 상속 할 필요가없고 일반적으로 재사용 가능한 메서드 및 속성 모음을 포함하기 때문에 정적 클래스로 구현할 수 있습니다. 다음 코드 목록은 C #의 정적 클래스가 어떻게 생겼는지 보여줍니다.

공용 정적 클래스 FileLogger

    {

        public static void Log (문자열 메시지)

        {

            // 텍스트 파일에 데이터를 기록하는 방법

        }

    }

C #에서 정적 메서드를 사용하는 경우

정적 메서드는 호출 할 클래스의 인스턴스가 필요하지 않은 메서드입니다. 클래스 자체에서 호출 할 수 있습니다. 정적 메서드는 정적 클래스 멤버에만 액세스 할 수 있습니다. 정적 클래스 또는 비 정적 클래스 내에 정적 메서드가있을 수 있습니다. 또한 정적 클래스 또는 비 정적 클래스에 정적 생성자를 가질 수 있습니다. 정적 생성자는 클래스의 정적 멤버를 초기화하는 데 사용됩니다. 클래스의 정적 생성자는 클래스의 정적 멤버에 처음 액세스 할 때 호출됩니다.

정적 메서드를 사용해야하는 이유는 무엇입니까? 비 정적 메서드, 즉 인스턴스 메서드보다 실행 속도가 조금 더 빠릅니다. 그 이유는 런타임이 this포인터를 비 정적 또는 인스턴스 메서드에 대한 암시 적 매개 변수로 전달하기 때문입니다 . 비 정적 메서드의 경우 컴파일러 callvirt는 메서드가 가상이 아닌 경우에도 명령어를 내 보냅니다. 메서드를 정적으로 만들면 컴파일러 call는 인스턴스가 null인지 여부에 대한 추가 검사를 제거하여 비가 상 사이트를 내 보냅니다. 이것은 성능상의 이점을 제공 할 수 있습니다.

따라서 빌드중인 응용 프로그램이 성능에 중요한 응용 프로그램 인 경우 코드에서 정적 유형과 메서드를 사용하는 것이 좋습니다. 코드에서 이러한 유형과 멤버를 많이 호출하면 성능이 크게 향상 될 수 있습니다.

다음 코드 조각은 정적 메서드의 모양을 보여줍니다.

public static void Log (문자열 메시지)

        {

             string filePath = @ "F : \ Log.txt";

            (StreamWriter streamWriter = new StreamWriter (filePath, true)) 사용

            {

                streamWriter.WriteLine (메시지);

                streamWriter.Close ();

            }

        }

C #에서 클래스의 정적 멤버를 사용하는 방법

CLR은 시스템 메모리를 스택, 힙 및 고주파 힙의 세 가지 영역으로 나눕니다. 정적 개체는 클래스의 인스턴스를 만들지 않고 직접 액세스 할 수 있으므로 응용 프로그램의 수명 내내 메모리에 있어야합니다. 가비지 수집 할 필요가 없습니다. 따라서 정적 개체는 고주파수 힙에 저장됩니다. 일반적으로 각 애플리케이션 도메인에 대해 하나의 고주파 힙이 있습니다.

이제 클래스의 정적 멤버를 살펴 보겠습니다. 다시 말하지만, 정적 개체는 응용 프로그램이 실행되는 전체 시간 동안 메모리에 유지되는 개체입니다. 위의 로깅 예제를 확장하여 다음 코드 목록은 정적 멤버가있는 FileLogger 클래스의 모양을 보여줍니다.

공용 정적 클래스 FileLogger

    {

        개인 정적 읽기 전용 객체 lockObject = new object ();

        공용 정적 문자열 FilePath

        {

            가져 오기; 세트;

        }

        public static void Log (문자열 메시지)

        {

            잠금 (lockObject)

            {

                if (! string.IsNullOrEmpty (FilePath))

                (StreamWriter streamWriter = new StreamWriter (FilePath, true)) 사용

                {

                    streamWriter.WriteLine (메시지);

                    streamWriter.Close ();

                }

            }

        }

    }

라는 정적 속성의 사용법에 유의하십시오 FilePath. 스레드 안전성을 보장하기 위해 lock키워드가 사용되었습니다. 속성 Log()값이 FilePathnull이 아니고 비어 있지 않은지 확인하기 위해 메서드 내에서 검사가 수행되었습니다 .

응용 프로그램 속도가 핵심적인 경우 정적 메서드를 사용하는 것이 비용을 지불 할 수 있습니다. 정적 클래스와 비 정적 클래스 모두에서 사용할 수 있습니다.