내가 가진 내 모든 대학 년 사용하고 public
,와의 차이를 알고 싶습니다 public
, private
그리고 protected
?
또한 static
아무것도없는 것과는 반대로 무엇을 하는가?
답변
액세스 수정 자
에서 docs.microsoft.com :
형식이나 멤버는 동일한 어셈블리 또는 다른 어셈블리를 참조하는 다른 코드로 액세스 할 수 있습니다.
유형 또는 멤버는 동일한 클래스 또는 구조체의 코드로만 액세스 할 수 있습니다.
유형 또는 멤버는 동일한 클래스 또는 구조체 또는 파생 클래스의 코드로만 액세스 할 수 있습니다.
private protected
(C # 7.2에 추가됨)유형 또는 멤버는 동일한 클래스 또는 구조체의 코드 또는 동일한 어셈블리의 파생 클래스에서만 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.
유형이나 멤버는 동일한 어셈블리의 코드로 액세스 할 수 있지만 다른 어셈블리에서는 액세스 할 수 없습니다.
유형 또는 멤버는 동일한 어셈블리의 코드 또는 다른 어셈블리의 파생 클래스를 통해 액세스 할 수 있습니다.
때 접근 수정이 설정되어 있지 않은, 기본 액세스 수정이 사용됩니다. 따라서 설정되지 않은 경우에도 항상 일부 형식의 액세스 수정자가 있습니다.
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에서는 키워드가 때때로 다르므로 여기에 치트 시트가 있습니다.
답변
공개 -클래스를 볼 수 있다면 메소드를 볼 수 있습니다
비공개 – 클래스의 일부인 경우 메소드를 볼 수 있습니다. 그렇지 않으면 그렇지 않습니다.
보호됨 -개인과 동일하며 모든 자손 도 방법을 볼 수 있습니다.
정적 (클래스) – “클래스”와 “오브젝트”의 차이점을 기억하십니까? 다 잊어 버려 그것들은 “정적”과 동일합니다 … 클래스는 그 자체의 유일한 인스턴스입니다.
정적 (메소드) -이 메소드를 사용할 때마다 해당 클래스의 실제 인스턴스에 관계없이 참조 프레임이 생깁니다.
답변
이 답변 에서 멋진 다이어그램을 다시 게시하십시오 .
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). 스키마가 더 쉽게 기억하는 데 도움이되기를 바랍니다
(대화식보기를 위해 이미지를 클릭하십시오).
외부 내부
두 단어로 된 액세스 수정자를 기억하기 어려우면 outside-inside를 기억하십시오 .
- 개인 보호 : 개인 외부 (동일한 어셈블리) 내부 (동일한 어셈블리) 보호
- 내부 보호 : 보호 외측 (동일한 어셈블리) 내부의 내부 (동일한 어셈블리)