수색…


비고

액세스 한정자가 생략되면,

  • 클래스는 기본적으로 internal 클래스입니다.
  • 메소드는 deault에 의해 private
  • getter 및 setter는 속성의 수정자를 상속받습니다. 기본적으로이 속성은 private

setter 또는 속성 getter의 액세스 한정자는 액세스를 제한하고 넓히지 않을 수 있습니다. public string someProperty {get; private set;}

공공의

public 키워드는 모든 소비자가 사용할 수있는 클래스 (중첩 클래스 포함), 속성, 메서드 또는 필드를 만듭니다.

public class Foo()
{
    public string SomeProperty { get; set; }

    public class Baz
    {
        public int Value { get; set; }
    }
}

public class Bar()
{
    public Bar()
    {
        var myInstance = new Foo();
        var someValue = foo.SomeProperty;
        var myNestedInstance = new Foo.Baz();
        var otherValue = myNestedInstance.Value;
    }        
}

은밀한

private 키워드는 클래스 내에서만 사용할 속성, 메서드, 필드 및 중첩 클래스를 표시합니다.

public class Foo()
{
    private string someProperty { get; set; }

    private class Baz
    {
        public string Value { get; set; }
    }

    public void Do()
    {
        var baz = new Baz { Value = 42 };
    }
}

public class Bar()
{
    public Bar()
    {
        var myInstance = new Foo();

        // Compile Error - not accessible due to private modifier
        var someValue = foo.someProperty;
        // Compile Error - not accessible due to private modifier
        var baz = new Foo.Baz();
    }
}

내부의

internal 키워드는 동일한 어셈블리의 모든 소비자가 사용할 수있는 클래스 (중첩 클래스 포함), 속성, 메서드 또는 필드를 만듭니다.

internal class Foo
{
    internal string SomeProperty {get; set;}
}

internal class Bar
{
    var myInstance = new Foo();
    internal string SomeField = foo.SomeProperty;

    internal class Baz
    {
        private string blah;
        public int N { get; set; }
    }
}

테스트 어셈블리가 AssemblyInfo.cs 파일에 코드를 추가하여 코드에 액세스 할 수 있도록하려면 다음과 같이하십시오.

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

보호 된

protected 키워드는 fields, methods 속성 및 중첩 클래스를 동일한 클래스 및 파생 클래스 내에서만 사용하도록 표시합니다.

public class Foo()
{
    protected void SomeFooMethod()
    {
        //do something
    }

    protected class Thing
    {
        private string blah;
        public int N { get; set; }
    }
}

public class Bar() : Foo
{
    private void someBarMethod()
    {
        SomeFooMethod(); // inside derived class
        var thing = new Thing(); // can use nested class
    }
}

public class Baz()
{
    private void someBazMethod()
    {
        var foo = new Foo();
        foo.SomeFooMethod(); //not accessible due to protected modifier
    }
}

보호 된 내부

protected internal 키워드는 다른 어셈블리의 동일한 어셈블리 또는 파생 클래스 내에서 사용할 필드, 메서드, 속성 및 중첩 클래스를 표시합니다.

어셈블리 1

public class Foo
{
    public string MyPublicProperty { get; set; }
    protected internal string MyProtectedInternalProperty  { get; set; }

    protected internal class MyProtectedInternalNestedClass
    {
        private string blah;
        public int N { get; set; }
    }
}

public class Bar
{
    void MyMethod1()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }
}

어셈블리 2

public class Baz : Foo
{
    void MyMethod1()
    {
        var myPublicProperty = MyPublicProperty;
        var myProtectedInternalProperty = MyProtectedInternalProperty;
        var thing = new MyProtectedInternalNestedClass();
    }

    void MyMethod2()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;

        // Compile Error
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }

}

public class Qux
{
    void MyMethod1()
    {
        Baz baz = new Baz();
        var myPublicProperty = baz.MyPublicProperty;

        // Compile Error
        var myProtectedInternalProperty = baz.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Baz.MyProtectedInternalNestedClass();
    }

    void MyMethod2()
    {
        Foo foo = new Foo();
        var myPublicProperty = foo.MyPublicProperty;

        //Compile Error
        var myProtectedInternalProperty = foo.MyProtectedInternalProperty;
        // Compile Error
        var myProtectedInternalNestedInstance =
            new Foo.MyProtectedInternalNestedClass();
    }
}

액세스 수정 자 다이어그램

다음은 제한된 범위에서 접근하기 쉬운 범위에 이르기까지 모든 다이어그램의 액세스 수정 자입니다.

접근 수정 자 도표
은밀한 은밀한
내부의 내부의
보호 된 보호 된
보호 된 내부 보호 된 내부
공공의 공공의

아래에서 더 많은 정보를 찾을 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow