C #에서 "private"키워드를 작성하는 이유는 무엇입니까?


109

지금까지 내가 아는 한, private기본값은 모든 곳에서 C #에서 (나는 쓰기하지 않으면 의미 public, protected, internal, 등이 될 것입니다 private기본적으로). (내가 틀렸다면 정정하십시오.)

그렇다면 그 키워드를 쓰는 이유는 무엇이며, 회원들에게도 존재하는 이유는 무엇입니까?

예를 들어 이벤트 핸들러가 자동 생성되면 다음과 같습니다.

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

그러나 그것이 묵시적이고 기본값이라면 왜 비공개로 작성합니까? 초보 개발자 (C # 기본값인지 모르는)가 비공개라는 것을 알 수 있도록? 아니면 컴파일러에 차이가 있습니까?

또한 "비공개"(단독)를 작성 하면 회원의 접근성 변경되는 경우가 있습니까?


18
internal그러나 기본적으로 "최상위"유형 인 IIRC가 사용 됩니다.
Jeff Mercado 2011

4
모든 것에 대한 기본값은 표시된대로 비공개가 아니며 일반적으로 명시 적으로하는 것이 좋습니다.
James Michael Hare 2011


모든 것에 대한 기본값은 "가능한 한 비공개"입니다. 분명히 중첩되지 않은 클래스는 개인이 될 수 없으며 인스턴스화하거나 사용할 수 없습니다. 그러나 멤버는 기본적으로 비공개이며 중첩 된 클래스는 기본적으로 비공개입니다. C #의 모든 것은 기본적으로 가장 제한된 가시성 수준을 갖습니다.
Ryan Lundy

답변:


171

AFAIK, private은 C #의 모든 곳에서 기본값입니다. 즉, public, protected, internal 등을 작성하지 않으면 기본적으로 비공개가됩니다. (잘못된 경우 수정하십시오).

이것은 사실이 아닙니다. 네임 스페이스 (클래스, 구조체, 인터페이스 등) 내에 정의 된 유형 은 기본적 으로 내부 입니다. 또한 다른 유형의 멤버는 기본 액세스 권한이 다릅니다 (예 : 인터페이스 멤버의 경우 공용). 자세한 내용 은 MSDN의 접근성 수준 을 참조하십시오 .

또한,

그렇다면 그 키워드를 작성하는 이유는 무엇이며, 심지어 존재하는 이유는 무엇입니까?

이것을 명시 적으로 지정하면 유형을 매우 명시 적으로 비공개로 만들려는 의도를 나타내는 데 도움이됩니다. 이는 시간이 지남에 따라 코드를 유지 관리하는 데 도움이됩니다. 이를 통해 다른 개발자 (또는 본인)가 구성원이 기본적으로 비공개인지 또는 의도적으로 있는지 등을 알 수 있습니다.


1
@Wayne : 그는 Jon Skeet보다 점수가 높은 답변을 가지고 있지만 그럴 자격이 없습니다 ... Jon 답변은 훨씬 더 정확합니다.
aleroot

2
이것은 무의미한 구별입니다. 네임 스페이스 내의 유형은 기본적 으로 비공개가 될 없기 때문에 기본적으로 내부입니다 . 그렇지 않으면 아무것도 사용할 수 없습니다. 기본적으로 가능한 한 제한되어 있습니다.
Ryan Lundy

1
inisde 클래스 및 구조체에 대한 기본 멤버 액세스 가능성은 비공개입니다. 여기에서 확인하십시오 : msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

그러나 네임 스페이스 내의 요소는 private.
Shimmy Weitzhandler

또한, getset재산 자체의 접근성 기본
AustinWBryan

119

AFAIK, private은 C #의 모든 곳에서 기본값입니다.

정답이 아닙니다. 기본값은 "이 선언에 사용할 수있는 가장 제한된 액세스"입니다. 예를 들어 최상위 유형의 경우 기본값은 internal; 중첩 유형의 경우 기본값은 private입니다.

그렇다면 그 키워드를 작성하는 이유는 무엇이며, 심지어 존재하는 이유는 무엇입니까?

그것은 두 가지 이유 때문에 그것을 명시 적으로 만듭니다.

  • 귀하의 질문에 따라 기본값을 모르는 사람들에게 더 명확 해집니다 (개인적으로이 주장을 좋아 한 적이 없지만 언급 할 가치가 있다고 생각했습니다).
  • 기본값을 그대로 사용하는 것이 아니라 일부러 비공개로 설정 한 것 같은 인상을줍니다 .

마지막 부분은 다음과 같습니다.

또한 "비공개"(단독)를 작성하면 회원의 접근성이 변경되는 경우가 있습니까?

예, 재산의 절반을 다른 것보다 더 제한적으로 만드는 경우 :

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

나는 가능한 모든 곳에서 기본값을 사용 했지만 (부분적으로 Eric Lippert에 의해) 당신이 그것에 대해 생각 하고 무언가를 비공개로 만들기 로 결정 했음을 분명히 하는 것이 좋은 생각 이라고 확신 했습니다 .

개인적으로 유형 선언에 대해 봉인 / 봉인되지 않은 경우에도 그렇게하는 방법이 있었으면 합니다. 기본값 도 없을 수도 있습니다 . 많은 개발자 (내가 조심하지 않으면 포함)가 봉인하는 것보다 노력이 적기 때문에 봉인되지 않은 클래스를 남겨 두는 것 같습니다.


+1. 내 Java 배경이 final더 일반적인 예를 사용하지만 의미 론적 의도를 알리기 위해 관련이없는 키워드를 사용하는 것이 유용합니다 .
jprete 2011

1
@minitech : 다른 방법도 라운드 작동하지만 덜 유용합니다. 이것은 모두 C # 2에서 도입되었습니다.
Jon Skeet 2011

20
나는 확실히 기본값이 전혀 없었 으면 좋겠고 컴파일러는 액세스 수정자가 누락 된 경우 오류를 던졌습니다. 대부분의 사람들은 모든 상황에 대한 기본값이 무엇인지 알지 못해 의도하지 않은 오류가 발생한다고 생각합니다.

+1 "중첩 된 유형의 경우 기본값은 비공개입니다."-귀하의 답변을 읽을 때 이에 대해 알고 있습니다. 감사!
Nordin 2011

5
@Phong, C #의 경우 한 가지 쉬운 규칙이 있습니다. 기본적으로 모든 것이 가능한 한 비공개입니다. 중첩되지 않은 클래스와 같은 네임 스페이스의 항목은 사용할 수 없으므로 비공개가 될 수 없습니다. 내부 또는 공개 만 가능합니다. 따라서 기본적으로 내부입니다. 다른 것 (클래스 내의 열거 형, 중첩 된 클래스, 속성, 필드, 메서드 ...) 내부의 항목은 기본적으로 비공개입니다.
Ryan Lundy

11

private시각적 혼란을 추가합니다. 그것이 일을 명시 적으로 만든다고 주장하는 사람들에게 나는 물을 것입니다 : 당신도 수학으로 이것을합니까? 예를 들면 :

var answer = a + b / c;

주위에 중복 괄호가 없으면 불분명 b / c합니까?

C #의 규칙은 매우 간단합니다. 기본적으로 모든 것이 가능한 한 비공개에 가깝습니다. 따라서 기본값보다 잘 보이게하려면 수정자를 추가하십시오. 그렇지 않으면 코드에 불필요한 키워드를 추가하지 마십시오.


1
나는 질문하기 전에이 권리에 동의했습니다. 그러나 어떤 사람들은 VB, 어떤 C ++, 심지어 F # (아마도 Haskell과 같은 다른 기능적 언어에서 왔을까요?)을 C #보다 더 잘 작성합니다. 그래서 그들에게는 (그리고 우리가 2 년 동안 c # ing을하지 않고 잊어 버린다면) 접근자가 명시적인 것이 더 낫습니다. 쉬운 학습이 프로젝트에 미치는 영향을 과소 평가하지 마십시오. 많은 개발자가 선택한 도구를 반영하지 않을 수있는 배경 출신이며 프로덕션 코드에서도 학습 보조가 필요합니다. 이것은 전혀 나쁘지 않습니다. 코드는 매우 나쁜 C #이므로 몇 가지 도움이 우리에게도 도움이됩니다).
Camilo Martin

3
글쎄, VB에서 기본값은 끔찍합니다. Friend예를 들어 기본 가시성은 회원을위한 것이라고 생각합니다 . C #은 가시성 기본값을 올바른 방식으로 수행합니다. 변경되지 않는 한 가능한 최소 가시성으로 설정됩니다. 내가 찾을 수있는 바에 따르면 C ++ (구조체 제외)에서도 마찬가지입니다. (이 F 번호에 대한 사실이 표시되지 않습니다.)
라이언 런디에게

6
너무 많은 사람들이을 선호하는 것이 이상합니다 var. 시각적 인 혼란을 줄이면서도 많은 사람들이 무의미한 타자를 선호하기 때문입니다 private.
Ryan Lundy

2
나는 시각적 혼란이 가독성을 저해 한다고 주장하기까지 할 것입니다!
binki

1
내가 비록 upvoted 않는 수학 예제의 경우 괄호를 사용하는 것을 선호합니다.
Marc.2377

7

내가 아는 한, private은 C #의 모든 곳에서 기본값입니다.

명시 적으로 선언하는 개인 , 당신은 의미 알고 는 비공개입니다. 당신이 아는 한 그것이 기본값이기 때문입니다. 또한 코드를 보는 다른 사람이 코드가 무엇인지 알고 있음을 의미합니다.

"그렇다고 생각한다", "그렇다고 확신한다"등 은 없습니다 . 그리고 모두가 같은 페이지에 있습니다.

저는 C # 개발자가 아닙니다 . 명시 적으로 private로 선언되지 않은 일부 코드로 작업해야 한다면 아마도 내부 코드 라고 가정 할 것입니다 .

나는 사물이 암묵적으로 설정되는 것을 싫어합니다. 명시 적으로 설정되었을 때만 큼 명확하지 않습니다.


합리적으로 들리지만 한때 더 잘 알았던 언어의 기본도 잊어 버렸습니다.
Camilo Martin

6

가독성-모든 사람이 비공개가 기본 동작이라는 것을 아는 것은 아닙니다.

의도-어떤 이유로 든 속성을 비공개로 구체적으로 선언했음을 명확하게 표시합니다.


5

가독성, 의도의 시연은 제가 생각할 수있는 두 가지 큰 이유입니다.


동의합니다. 예를 들어 다른 개발자와 약간의 코드를 작업하는 경우 무언가를 비공개로 설정하면 의도를 나타내는 데 도움이됩니다. 또한 몇 년 후 코드로 다시 돌아와서 IDE가 해당 클래스에 대해 공개적으로 액세스 할 수 있어야하는 메서드를 알려줄 때 유용합니다.
Aaron Newton

3

가시성을 명시 적으로 지정하는 한 가지 좋은 이유는 현재있는 컨텍스트의 기본값에 대해 생각할 필요가 없기 때문입니다.

또 다른 좋은 이유는 FxCop 이 그렇게하라고 하기 때문 입니다.


+1, FxCop이 변경 사항으로 빌드 할 때 개인 수정자를 제거하는 것에 대해 불평하는 것에 대해 방금 알았습니다.
Camilo Martin

2

많은 사람들 (나 같은 사람들!)은 정기적으로 몇 가지 다른 언어로 프로그램합니다. 이와 같은 것들을 명시 적으로 사용하면 내가 프로그래밍하는 모든 언어의 모든 신비한 세부 사항을 기억할 필요가 없습니다.


1
"default access modifier is private"가 난해한 세부 사항 이라고 말하지는 않겠습니다 .하지만 요점을 이해합니다. 지난주에 사용한 프레임 워크 ( MEF )가 어떻게 작동하는지 기억하는 데 어려움이있었습니다 .
Camilo Martin

0

나머지 수업 범위의 가독성과 일관성을 유지하기 위해 말하고 싶습니다.


4
당신은 C ++를 생각하고 있습니다. C #에서는 구조체에서도 멤버가 기본적으로 private으로 설정됩니다.

3
Structs에는 기본적으로 공용 액세스 가능성이 없습니다. 참조 : msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.