[C#] 밑줄을 긋거나 밑줄을 긋지 않기 위해서는 이것이 문제입니다

이진 버전을 다른 프레임 워크 언어로 사용할 경우 C #에서 개인 필드 앞에 밑줄을 붙이지 않는 데 문제가 있습니까? 예를 들어 C #은 대 / 소문자를 구분하므로 “foo”필드와 “Foo”공용 속성을 호출하면 제대로 작동합니다.

이 것 어떤 이름이 케이스에 의해서만 구별이 있다면 어떤 CLS 준수 (또는 다른) 문제로, 같은 VB.NET 등의 대소 문자를 구분하지 언어에 효과가 있습니까?



답변

효과 가 없습니다 .

CLS 규격 라이브러리를 작성하기위한 권장 사항의 일부는이 대중 / 케이스 만 다른 보호 기관은 당신이해야 예 않았을 것입니다 NOT 해야

public void foo() {...}

public void Foo() {...}

비공개 항목을 라이브러리 사용자가 사용할 수 없으므로 설명하는 것은 문제가되지 않습니다.


답변

중요 업데이트 (2016 년 4 월 12 일) :

.NET CoreFX 팀의 내부 표준에 주목했습니다. 이유에 대한 통찰력을 제공하지 않고 밑줄 표기법 을 . 우리가 규칙 # 3 자세히 보면 그러나 경우는의 시스템이 있다는 것을 분명하게 _, t_, s_왜 제안 접두사 _처음에 선택되었다.

  1. 우리는 사용 _camelCase 내부 및 개인 필드 어디 읽기 전용 가능한 사용합니다. 접두사 인스턴스와 필드 _, 정적 필드 s_와와 스레드 정적 필드 t_. 정적 필드를 사용하는 경우, readonly이후에 와야한다 static(즉, static readonly하지 readonly static).
  2. this.반드시 필요한 경우가 아니면 피 합니다.

따라서 .NET CoreFX 팀이 성능에 중점을 둔 다중 스레드 시스템 수준 코드를 작업하는 것과 마찬가지로 다음과 같이 강력하게 제안됩니다.

  • 코딩 표준을 준수하고
  • 밑줄 표기법을 사용하고
  • 이 답변을 더 이상 읽지 마십시오

그렇지 않으면 계속 읽으십시오 …

최초의 답변 :

먼저 우리가 말하는 것에 동의합시다. 가시성 수정자가 허용하는 경우 비 정적 메서드 및 클래스 / 하위 클래스의 생성자 내에서 인스턴스 멤버에 액세스하는 방법이 문제입니다.

밑줄 표기

  • 개인 필드 이름에 “_”접두사를 사용하는 것이 좋습니다.
  • 또한 꼭 필요한 경우가 아니면 “this”를 사용해서는 안된다고합니다.

이 표기법

  • 항상 “this”를 사용하도록 제안합니다. 모든 인스턴스 멤버에 액세스

이 표기법이 존재하는 이유는 무엇입니까?

이것은 당신이 방법이기 때문에

  • 동일한 이름을 공유 할 때 필드에서 매개 변수를 구분
  • 현재 인스턴스의 컨텍스트에서 작업하고 있는지 확인하십시오.

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

밑줄 표기법이 존재하는 이유는 무엇입니까?

어떤 사람들은 “this”를 입력하는 것을 좋아하지 않지만 여전히 필드와 매개 변수를 구별하는 방법이 필요하기 때문에 필드 앞에 “_”를 사용하기로 동의했습니다.

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

개인 취향의 문제라고 생각할 수 있으며 두 가지 방법 모두 똑같이 좋고 나쁩니다. 그러나이 표기법이 밑줄 표기법을 능가하는 특정 측면이 있습니다.

명쾌함

  • 밑줄 표기 혼란 이름
  • 이 표기법은 이름을 그대로 유지합니다

인지 하중

  • 밑줄 표기법이 일치하지 않아 필드를 특수한 방식으로 처리 할 수 ​​있지만 속성이나 필드가 필요한지 스스로에게 물어볼 때마다 다른 멤버와 함께 사용할 수 없습니다

  • 이 표기법은 일관성이 있습니다. 생각할 필요는 없습니다. 항상 “this”를 사용하여 회원을 가리 킵니다.

업데이트 : 다음과 같이 지적했듯이 이점은 아닙니다.

유지

  • 밑줄 표기법을 사용하면 _리팩토링 중에 필드를 속성으로 바꾸 _거나 (제거 ) 또는 그 반대 (add _) 와 같이 주의를 기울여야합니다.

  • 이 표기법에는 그런 문제가 없습니다

자동 완성

인스턴스 멤버 목록을 확인해야하는 경우 :

  • 밑줄 표기법은 큰 도움이되지 않습니다. “_”를 입력하면 자동 완성 팝업에 비공개 필드와 연결된 어셈블리에서 사용 가능한 모든 유형이 나머지 인스턴스 멤버와 혼합되어 표시되므로
  • 이 표기법은 “this”를 입력하여 명확한 답변을 제공합니다. 회원 목록 만 있으면됩니다.

모호

때로는 Intellisense의 도움없이 코드를 처리해야합니다. 예를 들어 코드 검토를 수행하거나 온라인에서 소스 코드를 찾아 볼 때.

  • 밑줄 표기법은 모호합니다. Something.SomethingElse를 볼 때 Something이 클래스인지 SomethingElse가 정적 속성인지 여부를 알 수 없거나 SomethingElse의 고유 속성이있는 현재 인스턴스 속성 일 수 있습니다.

  • this-notation is clear : Something.SomethingElse를 볼 때 정적 속성을 가진 클래스를 의미 할 수 있고 이것을 볼 때만 뭔가를 볼 수 있습니다. Something.SomethingElse Something은 멤버이고 SomethingElse는 그 속성

확장 방법

“this”를 사용하지 않으면 인스턴스 자체에서 확장 메소드를 사용할 수 없습니다.

  • 밑줄 표기법을 사용하려면 “this”를 사용하지 않아도되지만 확장 방법에는
  • 이 표기법은 주저를 피하고 항상 “this”기간을 사용합니다.

Visual Studio 지원

  • 밑줄 표기법은 Visual Studio에서 기본적으로 지원되지 않습니다.
  • 이 표기법은 Visual Studio에서 자연스럽게 지원됩니다.

    1. “이.” 자격 : C #에서 앞에 오는 비 정적 방법에 사용되는 모든 비 정적 필드를 선호this.

공식 추천

특히 C #에서 “밑줄을 사용하지 마십시오”라는 공식 지침이 많이 있습니다.


답변

Microsoft StyleCop 도움말 파일에서 가져옵니다.

유형 이름 :
FieldNamesMustNotBeginWithUnderscore

CheckId :
SA1309

원인 :
C #의 필드 이름은 밑줄로 시작합니다.

규칙 설명 :

이 규칙을 위반하면 필드 이름이 밑줄로 시작할 때 발생합니다.

기본적으로 StyleCop은 밑줄, m_ 등을 사용하여 ‘this’에 찬성하여 로컬 클래스 필드를 표시 할 수 없습니다. 접두사. ‘this’를 사용하는 이점. 필드뿐만 아니라 메서드, 속성 등을 포함한 모든 요소 유형에 동일하게 적용되므로 코드를 보는 데 사용되는 편집기에 관계없이 클래스 멤버에 대한 모든 호출을 즉시 인식 할 수 있습니다. 또 다른 이점은 접두사가 붙지 않는 인스턴스 멤버와 정적 멤버간에 빠르고 인식 가능한 차별화를 생성한다는 것입니다.

필드 또는 변수 이름이 Win32 또는 COM과 관련된 항목의 이름과 일치하도록되어 있으므로 밑줄로 시작해야하는 경우 필드 나 변수를 특수 NativeMethods 클래스 내에 배치하십시오. NativeMethods 클래스는 이름이 NativeMethods로 끝나는 클래스이며 Win32 또는 COM 래퍼의 자리 표시 자로 사용됩니다. 항목이 NativeMethods 클래스 내에 있으면 StyleCop은이 위반을 무시합니다.

다른 규칙 설명은 위의 방법 외에 선호하는 방법은 소문자로 개인 필드를 시작하고 대문자는 대문자로 개인 필드를 시작하는 것임을 나타냅니다.

편집 : 후속 조치로 StyleCop의 프로젝트 페이지는 https://github.com/DotNetAnalyzers/StyleCopAnalyzers에 있습니다. 도움말 파일을 읽으면 다양한 스타일 규칙을 제안하는 이유에 대한 많은 통찰력을 얻을 수 있습니다.


답변

우리는 개인 분야에 대해 이야기하고 있기 때문에 수업의 사용자에게는 영향을 미치지 않습니다.

그러나 개인 필드에는 밑줄을 사용하는 것이 좋습니다. 예를 들어 코드를 이해하기 쉽게 만들 수 있습니다.

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

우리 팀에서는 항상 개인 필드에 밑줄 접두사를 사용합니다. 따라서 일부 코드를 읽을 때 개인 필드를 매우 쉽게 식별하고 지역 및 인수와 구별 할 수 있습니다. 어떤 방식으로, 밑줄은 “this”의 속기 버전으로 볼 수 있습니다.


답변

그 이후로 매우 구체적이고 무의미한 스타일 규칙이있는 환경에서 작업 한 후 나만의 스타일을 만들었습니다. 이것은 내가 많이 앞뒤로 뒤집은 유형입니다. 마지막으로 개인 필드는 항상 _field가되고 로컬 변수는 절대 _가 아니며 소문자가되며 컨트롤의 변수 이름은 헝가리 표기법을 따르지 않으며 매개 변수는 일반적으로 camelCase가됩니다.

this.내 의견으로는 너무 많은 코드 노이즈가 추가 되는 키워드를 싫어합니다 . 나는 Resharper가 중복을 제거하는 것을 좋아합니다. 예어.

6 년 업데이트 :Dictionary<TKey,T> 특정 동시 액세스 사용을 위해 내부를 분석하고 개인 필드를 로컬 변수로 잘못 읽었습니다. 개인 필드는 지역 변수와 동일한 명명 규칙이 아니어야합니다. 밑줄이 있었다면 엄청나게 명백했을 것입니다.


답변

밑줄이 마음에 듭니다. 소문자 이름을 다음과 같은 메소드 매개 변수로 사용할 수 있기 때문입니다.

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}


답변

Martin이 언급 한 이유 때문에 개인 필드 앞에 밑줄을 사용하는 것이 좋으며 개인 필드가 IntelliSense에서 함께 정렬되기 때문입니다. 이것은 일반적으로 헝가리어 접두어 표기법의 악 함에도 불구하고 있습니다.

그러나 최근에는 개인 이유에 대해 밑줄 접두어를 사용하는 것이 왜 그런지 잘 모르지만 눈에 띄는 것으로 나타났습니다. 아마도 다른 사람이 알고 있습니까? 접두사 원칙일까요? 또는 컴파일 된 어셈블리 또는 다른 형식으로 밑줄을 치는 일반 유형의 이름 맹 글링과 관련이 있습니까?