C # 함수 매개 변수에 사용할 명명 규칙


14

매개 변수에 전달 된 이름이 새 유형으로 캐스트되는 상황이 있지만 전달 된 오브젝트의 이름은 유사하게 유지되어야합니다. 클래스 속성의 경우이 연산자를 사용할 수 있지만 함수의 로컬 변수는 어떻습니까? 어떤 코딩 규칙이 널리 사용됩니까?

예,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

또는 반대로

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

또는 다른 관습


1
아래에 나오는 다른 답변에 대해서는 스타일 규칙을 분석하고 적용 할 수있는 작은 도구가 있습니다. archive.msdn.microsoft.com/sourceanalysis
Patrick Hughes

답변:


11

밑줄로 매개 변수 또는 로컬 변수를 접두어로 사용하는 것은 C #에서 관용적이지 않으므로 읽기가 쉽지 않고 자주 사용되지 않습니다 (합법적이지만 원하는 경우 자유롭게 사용할 수 있음).

매개 변수와 변수의 가장 좋은 이름은 설명적인 이름입니다. 유형을 변경하는 이유, 캐스트 이유는 무엇인지 생각해야합니다. 그런 다음 두 가지 이름을 지정할 수 있습니다. 예를 들어 "개인"을 전달하여 "고객"으로 변환 한 경우 변수 이름에 개인 및 / 또는 고객을 사용할 수 있습니다.

두 개의 다른 이름을 생각할 수 없다면 이름에 "as"를 사용합니다 ( 며칠 전이 사이트에 대한 질문이있었습니다 ). 예를 들어 로컬 변수에 "myParaAsDerived"를 사용합니다.

가능한 한 이것을 사용하지 않으면 해결하려는 문제와 사용할 수있는 의미있는 이름에 대해 열심히 생각하지만 다른 모든 것이 실패하면 상당히 읽을 수 있습니다.


다시 한 번 확인하십시오 (C #에는 익숙하지 않습니다). 주요 밑줄은 실제로 C #에서 "적절하게"합법적입니까? C 및 C ++에서 밑줄이있는 식별자는 예약되어 있으므로 어떤 의미에서는 합법적이지만 고유 한 식별자를 정의해서는 안됩니다. csharp.comsci.us/etymology/identifiers.html 은 C #이 유사 할 수 있음을 제안하지만 ( "한계"의 맨 아래 참조) 실제로 "예약 됨"은 아닙니다.
Steve314

선행 밑줄은 C #에서 완전히 합법적이며 내가 아는 규칙에 따라 예약되지 않았습니다.
Steve

9

먼저 사용

void MyFunc(BaseClass _myPara)
{
} 

분명히 잘못되었습니다! 많은 C # 코딩 표준으로 모든 필드 이름 에 "_"접두사를 사용하십시오 ! 코드는 다른 프로그래머가 이해하기 쉬워야하므로 많은 C # 프로그래머를 오도하는 방식으로 코드를 작성해서는 안됩니다.

작은 방법의 모든 이점을 감안할 때 개인적으로 지역 변수를 매개 변수와 구분하기위한 명명 규칙이 필요하지 않습니다. 메소드에 매개 변수와 로컬 변수가 너무 많아 이름 지정 규칙없이 진행중인 작업을 알 수없는 경우 더 큰 문제가 있습니다. (이것은 Java 서적 Clean Code Book 에서 잘 설명되어 있지만 여전히 C # 프로그래머로서 큰 이점을 발견했습니다)


4

접두사로 무언가를 붙이고 싶다면 p_매개 변수에 사용해야 합니다. 일반적 으로이 작업을 수행하면 많은 사람들을 귀찮게 할 것입니다. 그러나 동일한 이름을 주려는 변수에 대해 서로 다른 두 개의 이름이 필요하기 때문에 한 곳에서만 수행하지 마십시오.

변수 이름을 지정하는 일반적인 규칙은 다음과 같습니다.

  • 한 가지 유형의 객체 이름 만 가지고 있다면 그 기능에 따라 다음과 같습니다.

    var builder = new PizzaBuilder();
  • 기능과 전문성에 따라 둘 이상의 이름이있는 경우 :

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

매개 변수의 p_ (또는 단지 p)는 C ++ 및 C에서 많이 사용되는 오래된 규칙입니다. 로컬의 경우 l_, 멤버 변수의 경우 (C ++의 경우) m_로 이동하는 경향이 있습니다. Pascal, Modula 2 및 Ada에서도 보았으므로 C 계열의 것이 아닙니다. 그것은 이다 하지만, 좀 사랑 - 그것 - 또는 - 증오 - 그것. 나는 거의 강박 적으로 그것을 사용했는데, 내 변명은 Steve Haighs가 "As"를 추론하고 있다는 것이다. 예를 들어 setter 메소드는 종종 m_Whatever = p_Whatever;두 개의 식별자를 의미있게 다른 이름으로 지정하는 것이 어색합니다. 그러나 나는 그러한 경우가 일관된 협약을 정당화하기에 충분한 지 의문을 가지기 시작했다.
Steve314

4

C # 명명 규칙은 다음과 같습니다.

  • 메소드, 퍼블릭 속성 및 클래스 이름에 PascalCasing 사용
  • 인터페이스 이름에 IPascalCasing 사용 (시작시 I 통지)
  • 메소드 매개 변수 및 로컬 변수에 camelCasing 사용
  • 클래스 전체 개인 필드에 _underscoredCamelCasing 사용

헝가리 표기법을 피하십시오. 의미가 없으며 C # 규칙을 따르지 않습니다.


개인 필드는 정적 인 경우 파스칼 케이스됩니다.
sara

2

클래스 이름 변수를 구체적으로 참조하기 위해 "this"키워드가 있으므로 변수 이름 지정에서 밑줄을 치는 것은 다소 불필요 할 수 있습니다. 전문가들로부터 변수 명명 규칙에 대해 더 배우고 싶다면 Tim Ottinger의 "Ottinger 's Rules for Variable and Class Naming"이라는 악명 높은 논문을 참조하십시오. .

Ottinger는 코드가 잘 작성된 산문처럼 가능한 한 사람이 읽을 수 있어야합니다.

public void Function(string p_Parameter1, string p_Parameter2)

... 더 읽기 쉬울 것입니다 ...

public void Function(string parameter1, string parameter2)

... 여기서 parameter1 및 2는 해당 변수의 설명 이름입니다.

여기에 가치가있는 링크가 있습니다 : 링크


-3

나는 매개 변수 접미사를 믿는다 : 문자열 s_, int i_ 등

또한 parm 이름은 가능한 짧고 일반적이어야한다고 생각합니다.

이제 이유가 있습니다 :

  • 함수에서 어떤 식 으로든 매개 변수를 수정하지 않으려는 경우 수정 된 버전이 필요한 경우 새 변수를 작성하여 붙여 넣으십시오. 접미사가있는 parms의 이름을 지정하면 지불 할 때 매개 변수를 지정하지 않아도됩니다 주의.
  • 이 규칙에 대한 예외는 parm이 ref 또는 out 일 때 발생합니다. 나는 여전히 그것들에 접미사를 사용하지만.
  • 왜 짧은 일반 이름입니까? s_가 설명적인 의미에서 실제로 무엇인지 알 수 있도록 함수를 문서화해야합니다. 따라서이를 피하기 위해 짧은 제네릭을 사용하면 비슷한 함수 그룹을 만들거나 함수 본문을 클리핑하여 수정을위한 시작점으로 다른 함수로 전송할 때 편리합니다.
  • 일반 이름의 실제 이점은 대부분의 경우 해당 매개 변수를 호출 한 것을 기억할 필요가 없다는 것입니다. 문자열을 얻는 것을 알고 있으므로 s_ 등이 'filename'인지 또는 'filepath'인지 또는 'fullpath'인지, 유일한 문자열이므로 's_'인지 궁금 할 필요가 없습니다.

모든 것에는 장단점이 있으며, 무언가를 사용하는지 여부는 현재 스타일에 맞는지에 따라 크게 달라집니다.


6
-1 : a) 접미사가 아닌 접두사입니다. B)는 헝가리어 표기법의와가의 길을 가야한다 -하는가를 .
Peter K.

1
C # 형식은 안전하지 않습니까?
pyvi

1
K. @ 피터 - 그것은처럼 나에게 보이는 si이 그냥 예입니다 때문에 짧은 이름입니다. IOW 나는 이것이 헝가리어라고 생각하지 않는다-나는 당신이 고전적 string s이거나 int i더 나은 이름이라고 생각할 수없는 짧은 이름을 잘못 해석하고 있다고 생각하지만 밑줄 접미사가 붙어있다. .
Steve314

@ Steve314 : 아, 당신 말이 맞을 수도 있습니다! Mark가 응답하는지 봅시다.
피터 K.

s_는 익명의 HG라고 생각하며 예제가 아닙니다.
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.