[C#] C #에서 public, private, protected 및 access modifier가없는 차이점은 무엇입니까?

내가 가진 내 모든 대학 년 사용하고 public,와의 차이를 알고 싶습니다 public, private그리고 protected?

또한 static아무것도없는 것과는 반대로 무엇을 하는가?



답변

액세스 수정 자

에서 docs.microsoft.com :

public

형식이나 멤버는 동일한 어셈블리 또는 다른 어셈블리를 참조하는 다른 코드로 액세스 할 수 있습니다.

private

유형 또는 멤버는 동일한 클래스 또는 구조체의 코드로만 액세스 할 수 있습니다.

protected

유형 또는 멤버는 동일한 클래스 또는 구조체 또는 파생 클래스의 코드로만 액세스 할 수 있습니다.

private protected (C # 7.2에 추가됨)

유형 또는 멤버는 동일한 클래스 또는 구조체의 코드 또는 동일한 어셈블리의 파생 클래스에서만 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.

internal

유형이나 멤버는 동일한 어셈블리의 코드로 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.

protected internal

유형 또는 멤버는 동일한 어셈블리의 코드 또는 다른 어셈블리의 파생 클래스를 통해 액세스 할 수 있습니다.

접근 수정이 설정되어 있지 않은, 기본 액세스 수정이 사용됩니다. 따라서 설정되지 않은 경우에도 항상 일부 형식의 액세스 수정자가 있습니다.

static 수정 자

클래스의 정적 수정자는 클래스를 인스턴스화 할 수없고 모든 멤버가 정적임을 의미합니다. 정적 멤버는 작성 유형의 인스턴스 수에 관계없이 하나의 버전을 갖습니다.

정적 클래스는 기본적으로 비 정적 클래스와 동일하지만 한 가지 차이점이 있습니다. 정적 클래스는 외부에서 인스턴스화 할 수 없습니다. 즉, new 키워드를 사용하여 클래스 유형의 변수를 작성할 수 없습니다. 인스턴스 변수가 없으므로 클래스 이름 자체를 사용하여 정적 클래스의 멤버에 액세스합니다.

그러나 정적 생성자 와 같은 것이 있습니다. 정적 클래스를 포함하여 모든 클래스는 이들 중 하나를 가질 수 있습니다. 직접 호출 할 수 없으며 클래스 자체의 유형 매개 변수 이외의 매개 변수를 가질 수 없습니다. 첫 번째 인스턴스가 작성되거나 정적 멤버가 참조되기 전에 클래스를 초기화하기 위해 정적 생성자가 자동으로 호출됩니다. 다음과 같습니다 :

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

정적 클래스는 종종 서비스로 사용되므로 다음과 같이 사용할 수 있습니다.

MyStaticClass.ServiceMethod(...);


답변

그래픽 개요 (간단히 요약)

시계

이후 정적 클래스가 밀봉되어 보호 키워드는 정적 클래스에 유효하므로, 그들은 (Object에서 제외) 상속 될 수 없습니다.

액세스 수정자를 앞에 두지 않으면 기본값을 보려면 C # 클래스 및 멤버 (필드, 메서드 등)의 기본 표시 여부를 참조하십시오.

중첩되지 않음

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

중첩 :

nested enum      public
nested interface public
nested class     private
nested struct    private

또한 봉인 키워드가있어 클래스를 상속 할 수 없습니다.
또한 VB.NET에서는 키워드가 때때로 다르므로 여기에 치트 시트가 있습니다.

VB 대 CS 등가물


답변

공개 -클래스를 볼 수 있다면 메소드를 볼 수 있습니다

비공개 – 클래스의 일부인 경우 메소드를 볼 수 있습니다. 그렇지 않으면 그렇지 않습니다.

보호됨 -개인과 동일하며 모든 자손 도 방법을 볼 수 있습니다.

정적 (클래스) – “클래스”와 “오브젝트”의 차이점을 기억하십니까? 다 잊어 버려 그것들은 “정적”과 동일합니다 … 클래스는 그 자체의 유일한 인스턴스입니다.

정적 (메소드) -이 메소드를 사용할 때마다 해당 클래스의 실제 인스턴스에 관계없이 참조 프레임이 생깁니다.


답변

이 답변 에서 멋진 다이어그램을 다시 게시하십시오 .

Venn 다이어그램의 모든 액세스 수정자는 제한에서 무차별까지입니다.

private:
여기에 이미지 설명을 입력하십시오

private protected: -C # 7.2에 추가됨
여기에 이미지 설명을 입력하십시오

internal:
여기에 이미지 설명을 입력하십시오

protected:
여기에 이미지 설명을 입력하십시오

protected internal:
여기에 이미지 설명을 입력하십시오

public:
여기에 이미지 설명을 입력하십시오


답변

여기에 이미지 설명을 입력하십시오

using System;

namespace ClassLibrary1
{
    public class SameAssemblyBaseClass
    {
        public string publicVariable = "public";
        protected string protectedVariable = "protected";
        protected internal string protected_InternalVariable = "protected internal";
        internal string internalVariable = "internal";
        private string privateVariable = "private";
        public void test()
        {
            // OK
            Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(publicVariable);

            // OK
            Console.WriteLine(protectedVariable);

            // OK
            Console.WriteLine(internalVariable);

            // OK
            Console.WriteLine(protected_InternalVariable);
        }
    }

    public class SameAssemblyDerivedClass : SameAssemblyBaseClass
    {
        public void test()
        {
            SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }

    public class SameAssemblyDifferentClass
    {
        public SameAssemblyDifferentClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // NOT OK
            // Console.WriteLine(privateVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            //Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }
}

 using System;
        using ClassLibrary1;
        namespace ConsoleApplication4

{
    class DifferentAssemblyClass
    {
        public DifferentAssemblyClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            // Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protectedVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protected_InternalVariable);
        }
    }

    class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
    {
        static void Main(string[] args)
        {
            DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            //Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);

            SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
            dd.test();
        }
    }
}


답변

Nothing 의 문제에 대하여

  • 네임 스페이스 유형은 기본적으로 내부입니다.
  • 중첩 유형을 포함한 모든 유형 멤버는 기본적으로 비공개입니다.

답변

현재 액세스 수정 자의 또 다른 시각적 접근 방식 (C # 7.2). 스키마가 더 쉽게 기억하는 데 도움이되기를 바랍니다
(대화식보기를 위해 이미지를 클릭하십시오).

대화식 액세스 수정 자 svg

외부 내부

두 단어로 된 액세스 수정자를 기억하기 어려우면 outside-inside를 기억하십시오 .

  • 개인 보호 : 개인 외부 (동일한 어셈블리) 내부 (동일한 어셈블리) 보호
  • 내부 보호 : 보호 외측 (동일한 어셈블리) 내부의 내부 (동일한 어셈블리)