키워드 'var'을 사용하여 변수 데이터 유형을 명시 적으로 정의 하시겠습니까? [닫은]


35

C #에서 모든 변수 선언에 다목적 var 키워드를 사용하도록 권장합니까? 그렇다면 다음 명령문에서 10의 경우 M과 같이 변수 선언 내의 리터럴 값에 대한 특수 문자를 언급해야합니다.

var myDecimal = 14.5M;

차이가 나는 경우 C #을 사용하여 웹 개발을 시도하고 있습니다.


7
SO (IMHO에 속함)에서 12 개의 속임수가 있습니다.

1
C ++ 0x repurposing과 동일한 질문이 C ++에 제공됩니다 auto.
David Thornley

5
다음 C # 컴파일러 팀의 에릭 Lippert의 최근 이것에 대해 블로그에 blogs.msdn.com/b/ericlippert/archive/2011/04/20/...
팀 굿맨

이 질문에 60 억의 속임수가 있습니다.
DeadMG

@DeadMG는 60 억을 달성했습니다.
wassimans

답변:


53

var를 사용하는 것에 대해 많은 논쟁이있었습니다. 나의 일반적인 규칙은 다음과 같습니다.

  • 과제의 오른손이 생성자 인 경우와 같이 유형이 분명한 경우 var를 사용합니다.
  • LINQ 쿼리와 같이 형식이 복잡한 경우 (처음에 var의 이유) var를 사용하십시오.
  • 변수가 올바르게 입력되었는지 확인하려는 앰비언트 유형 (10 진법이 예제 임)의 경우 철자를 입력하십시오.
  • 익명 형식은 var를 사용해야합니다.
  • 다른 모든 경우에는 유형을 설명하십시오.

기본적으로 목표는 코드를보다 쉽게 ​​읽을 수 있도록하는 것입니다. 할당이 분명하기 때문에 var가 충분하다고 생각되면 var를 사용하십시오. 필요할 때 독자에게 힌트로 전체 유형 이름을 사용하십시오.


9
또한 foreach각 항목의 유형이 아니라 컬렉션 열거에만 관심이 있는 문장에서 'var'을 사용 합니다.
Adam Lear

1
Jesse가 익명 유형을 지적한 것처럼;)
Michael Brown

4
@AnnaLear 때때로 당신은 걱정해야합니다. 이 경우 foreach (datatable.Rows의 var row) var는 DataRow가 아닌 ​​개체입니다.
Thanos Papathanasiou

@ThanosPapathanasiou 물론입니다. Windows Forms의 Controls 컬렉션과 다른 상황에서도 마찬가지입니다.
Adam Lear

나는 보통 변수의 타입을 확신하고 싶을 때를 제외하고 var를 사용한다 (예를 들어 값이 두 배가되게하려는 경우와 같이)
eka808

14

사용시기 var는 프로그래밍 "거룩한 전쟁"입니다. 작업의 결과가 다음과 같은 익명 유형을 만들 때 필요한 위치는 정확히 한 곳입니다.

var result = new { Name = "John", Age = 35 };

다른 곳에서는 선택 사항이며 실제로 다른 상황에서 사용하거나 사용하지 않는 코딩 표준에 달려 있습니다.

그리고 네, 컴파일러에게 오른쪽에 무엇이 있는지 알려주려면 리터럴을위한 특수 문자가 필요합니다. 귀하의 예 에서을 제외한 M기본값은 입니다.doubledecimal


1
익명 유형에 대한 모든 것을 잊어 버렸습니다!
Michael Brown

마지막 직장에서 "var"키워드를 계속 사용하면 해고 될 것이라고 들었습니다.
hanzolo

그것은 극단적이지만 회사의 이니셔티브입니다. 그래도 당신의 "마지막"직업입니다! :)
Jesse C. Slicer

7

MSDN에서 :

그러나 var를 사용하면 코드를 다른 개발자가 이해하기 어렵게 만들 수 있습니다. 따라서 C # 설명서는 일반적으로 필요한 경우에만 var를 사용합니다.

나는 정말로 암시 적 타이핑을 좋아하지 않습니다. 표면적으로는 코드를 더 읽기 쉽게 만드는 경향이 있지만 많은 문제가 발생할 수 있습니다. 개발자가 다음과 같이 변수 이니셜 라이저를 변경하면

var myFloat=100f;

var myFloat=100;

또는

var myFloat=100.0;

유형이 변경되어 전체 컴파일러 오류가 발생하거나 웹보기에 있고 빌드 후 단계를 사용하여 뷰를 사전 컴파일하지 않으면 효과적이지 않으면 잡히지 않는 전체 런타임 오류가 발생합니다 배포 전 테스트.

암시 적 타이핑은 모든 곳에서 작동하지 않습니다 (같은 MSDN 링크에서)

var는 로컬 변수가 동일한 명령문에서 선언되고 초기화 될 때만 사용할 수 있습니다. 변수는 널 또는 메소드 그룹 또는 익명 함수로 초기화 될 수 없습니다.

클래스 범위의 필드에는 var를 사용할 수 없습니다.

var를 사용하여 선언 된 변수는 초기화 표현식에서 사용할 수 없습니다. 다시 말해,이 표현은 합법적입니다 : int i = (i = 20); 그러나이 표현식은 컴파일 타임 오류를 생성합니다. var i = (i = 20);

여러 개의 내재적 유형 변수는 동일한 명령문에서 초기화 될 수 없습니다.

var라는 유형이 범위 내에 있으면 var 키워드는 해당 유형 이름으로 확인되며 암시 적으로 유형이 지정된 로컬 변수 선언의 일부로 처리되지 않습니다.

코드 일관성을 유지하는 경우 (이 경우 명시적인 타이핑을 사용하는 것) 매우 좋습니다. 제 생각 var에는 게으르고 실질적인 이점이 없으며 이미 복잡한 프로세스에서 또 다른 잠재적 실패 지점을 소개합니다.

2017 년 업데이트

나는 마음을 완전히 바꿨습니다. C #에서 작업 할 때 var대부분의 시간을 사용합니다 (인터페이스 유형 변수 등은 제외). 가독성을 향상시키는 코드를 간결하게 유지합니다. 그래도 해결 된 유형이 실제로 무엇인지주의하십시오.


@ 3Dave, 당신의 마음이 어떻게 바뀌 었는지 궁금합니다. 나는 여전히 100 %가 당신의 원래 주장에 동의합니다.

@ Dan 정말 가독성이 떨어졌습니다. 유능한 개발자는 선언의 초기화 부분에 문제가없는 것을 신속하게 확인할 수 있습니다. this.어디에서나 사용하지 않거나 , System.Blah.SomeType대신 말을 하는 것처럼, using나는 여전히 짜증나게하지만, 더 간결한 코드는 일반적으로 시각적으로 파싱하기가 더 쉽습니다. 명시 적 타이핑이 올바른 선택 인 시나리오는 여전히 많습니다. 그러나 요즘 나는 누군가가 깨끗한 코드를 문 밖으로 가져 오는 것보다 언어 변호사가 아닙니다.
3Dave

@Dan (물론, 저는 또한 using namespace std;.cpp 파일 을 사용하는 사람입니다 . (타르 링과 페더 링을 피하고
싶기

3

C # 참조는이 구문의 좋은 사용과 나쁜 사용을 설명하기 위해 다음을 보여줍니다.

다음 예제는 두 개의 쿼리 표현식을 보여줍니다. 첫 번째 표현식에서는 var의 사용이 허용되지만 쿼리 결과의 유형을 명시 적으로 IEnumerable로 명시 할 수 있으므로 필수는 아닙니다. 그러나 두 번째 표현식에서는 결과가 익명 유형의 콜렉션이므로 해당 유형의 이름은 컴파일러 자체를 제외하고 액세스 할 수 없으므로 var를 사용해야합니다. 예제 # 2에서 foreach 반복 변수 항목도 암시 적으로 입력해야합니다.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

var 키워드는 컴파일러에게 var 유형 변수의 유형을 자동으로 추론하도록 요청합니다. 따라서 10 진수 유형 변수를 var 변수에 저장하려면 m을 사용해야합니다. 마찬가지로 문자열을 저장하는 경우 따옴표로 묶어야합니다.


0

나를 위해 다음과 같은 경우 var를 사용하지 않습니다.

  • 내 변수의 유형을 확인하고 싶을 때 (예를 들어 사용 된 유형이 십진수가 아닌 두 배인지 확인하는 것이 중요합니다.)
  • 와 같은 다형성 코드 Fruit foo = new Apple();. 이 경우 var는 코드 논리를 이해하고 가능한 버그의 제한을 더 잘 이해함으로써 부모 클래스 (여기서는 Fruit)를 사용하는 것이 좋습니다. var는 다형성 개념을 확인하지 않습니다!

나머지는 개발자의 경우와 배경에 달려 있다고 생각합니다. PHP 세계의 일부 사람들은 변수 유형을 돌보지 않고 Java 세계의 일부 사람들은 var가 이단이라고 생각하고 더 장황할수록 더 좋습니다.

당신은 당신의 개인적인 의견을 만들어야합니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.