c# - access modifier java




공개, 개인, 보호 및 액세스 수정자가없는 점은 무엇입니까? (10)

접근 수정 자

공공의

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

은밀한

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

보호 된

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

개인 보호 (C # 7.2에 추가됨)

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

내부의

형식 또는 멤버는 동일한 어셈블리의 모든 코드에서 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.

보호 된 내부

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

액세스 한정자 가 설정되어 있지 않으면 기본 액세스 한정자가 사용됩니다. 따라서 설정되지 않은 경우에도 항상 액세스 수정 자의 형태가 있습니다.

공전

클래스의 정적 수정자는 클래스를 인스턴스화 할 수없고 해당 멤버가 모두 정적이라는 것을 의미합니다. 정적 구성원은 포함하는 유형의 인스턴스 수에 관계없이 하나의 버전을 갖습니다.

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

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

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

    public static string Bar { get; set; }
}

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

MyStaticClass.ServiceMethod(...);

저는 대학 생활을하면서 public 으로 사용하고 있으며 public , privateprotected 의 차이점을 알고 싶습니까?

또한 static 은 무엇을하지 않고 반대합니까?


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();
        }
    }
}

Private의 상태는 동일한 클래스의 객체 만 변수에 액세스 할 수 있음을 나타냅니다. 보호 된 상태는 해당 액세스를 확장하여 클래스의 하위 항목도 포함합니다.

"위 표에서 우리는 사적 보호와 보호의 견해를 볼 수있다. 둘 다 같다고 생각한다. 그래서 두 가지 분리 된 명령에 대한 필요성이 무엇인지"

자세한 내용은 MSDN 링크를 확인하십시오.


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

액세스 수정자를 앞에 두지 않은 경우 기본값은 다음을 참조하십시오.
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

음 ...

Static은 클래스 인스턴스가 없어도 해당 함수에 액세스 할 수 있음을 의미합니다.

클래스 정의에서 직접 액세스 할 수 있습니다.


이러한 액세스 수정자는 멤버가 표시되는 위치를 지정합니다. 아마 이것을 읽어야 할 것입니다. IainMH가 제공하는 링크를 출발점으로 삼으십시오.

정적 멤버는 인스턴스 당 하나가 아닌 클래스 당 하나씩 있습니다.


흠.

액세스 수정자를 참조하십시오.

요컨대 :

public은 메소드 또는 유형에 다른 유형 / 클래스의 완전한 가시성을 제공합니다.

Private은 private 메소드 / 변수에 대한 변수 액세스를 포함하는 유형 만 허용합니다 (중첩 클래스는 포함하는 클래스의 private 메소드 / 변수에 대한 액세스 권한을가집니다).

Protected는 파생 클래스가 보호 된 메서드에 액세스 할 수있는 경우를 제외하고는 비공개와 유사합니다.

"아무것도"VB.NET은 null과 같습니다. 엄밀히 말하면 (비록 C #에서) 액세스 수정자를 명시 적으로 지정하지 않으면 메서드 / 변수가 "액세스 수정 자"를 의미하는 "아무것도"를 의미하지는 않지만, 선언은 일반적으로 가능한 한 제한적 입니다. 즉

public class MyClass
{
    string s = "";
}

다음과 같은 효과가 있습니다.

public class MyClass
{
    private string s = "";
}

연결된 MSDN 문서는 명시 적으로 지정된 액세스 한정자가 없을 때 자세한 설명을 제공합니다.


Nothing 의 질문에 관해서

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

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

비공개 - 수업의 일원 인 경우 방법을 볼 수 있습니다. 그렇지 않은 경우 방법을 볼 수 있습니다.

Protected - Private과 동일하지만 모든 자손 이 메서드를 볼 수 있습니다.

정적 (클래스) - "클래스"와 "객체"의 구분을 기억하십니까? 그 모든 것을 잊어 버려라. 그들은 "정적"과 동일합니다 ... 클래스는 그 자체의 유일한 인스턴스입니다.

Static (method) -이 메서드를 사용할 때마다,이 클래스는 그것이 속한 클래스의 실제 인스턴스와 독립적 인 참조 프레임을 갖습니다.


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

다음은 Venn 다이어그램의 모든 액세스 수정 자입니다.

private :

private protected : - C # 7.2에 추가됨

internal :

protected :

protected internal :

public :







access-modifiers