문제
그만큼 var 키워드는 명시적인 유형 선언이 필요합니다. 그래서 토론 그것이 적절할 때.
나는 또한 (그러나 사용되지는 않았지만) 읽었습니다. 우우 그것을 만들어 한 걸음 더 나아가는 것 같습니다. 로컬 변수를 선언하는 선택 사항. Boo를 사용하면 유형과 선언이 모두 암시 될 수 있습니다.
C# 언어 디자이너가 왜 VAR 키워드를 포함시키는 것을 귀찮게 했습니까?
업데이트: 예, VAR은 익명 유형을 지원하지만 익명 유형 자체는 VAR 키워드를 필요로하지 않습니다 ...
var anon = new { Name = "Terry", Age = 34 };
~ 대
anon = new { Name = "Terry", Age = 34 };
해결책
업데이트: 여기에는 두 가지 관련 질문이 있습니다. 1. 왜 변수를 전혀 선언해야합니까? 2. 변수를 선언하게하는 언어에서 "var"는 어떤 용도로 사용됩니까?
(1)에 대한 답은 많으며이 질문에 대해 다른 곳에서 찾을 수 있습니다. (2)에 대한 나의 대답은 다음과 같습니다.
다른 의견 제시자가 말했듯이 LINQ는 익명 유형에이를 사용합니다. 그러나 LINQ는 실제로 표현의 오른쪽 유형이 프로그래머에게 알려지지 않았거나 극도로 장점 인보다 일반적인 문제의 사례입니다. 고려하다:
SomeGeneric<VeryLongTypename<NestedTypename>> thing = new
SomeGeneric<VeryLongTypename<NestedTypename>>();
장황과 오류가 발생하기 쉬운 것입니까? 이제 그들은 당신이 이것을 할 수 있도록했습니다.
var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();
정보의 복제를 줄임으로써 오류가 제거됩니다. 입력 오류 만 있지 않습니다. 여기에는 컴파일러가 왼쪽에서 오른쪽으로 조용히 캐스팅 할 수있는 방식으로 왼쪽 표현식 유형을 안개화 할 수 있지만 실제로는 캐스트가 실제로 일부 속성을 잃습니다. rvalue. 이것은 rvalue에 의해 반환 된 유형이 알려지지 않았거나 익명 일 수있을 때 더욱 중요합니다.
다른 팁
VAR 키워드가 없으면 실제로 기존 변수를 실제로 사용하려는 경우 실수로 새 변수를 만들 수 있습니다. 예를 들어
name = "fred";
...
Name = "barney"; // whoops! we meant to reuse name
나는 VAR의 필요성을 이해하고 그것은 목적이 훌륭합니다. 키워드가없고 유형이 없으면 즉시 변수를 정의하는 것은 무섭습니다. 1 년이 넘지 않은 코드를 재 작업 해야하는 경우 코드 나 자신을 유지 해야하는 다음 사람을 아프게합니다. C#에서 열려야하는 문이 확실하지 않으며 VAR이 필요하지 않을 때 과도하게 사용될 때 이미 가독성 문제를 일으키는 것처럼 보이지 않기를 바랍니다.
거의 모든 .NET 3.5 예제 내가 최근에보고있는 예는 Var로 정의 된 모든 변수를 가지고 있습니다.
내가 주장하는 것은 키스트로크가 과도하게 사용될 때 키스트로크를 저장하기 위해 가독성을 희생한다는 것입니다. 예를 들어:
// What myVar is, is obvious
SomeObject myVar = new SomeObject();
// What myVar is, is obvious here as well
var myVar = new SomeObject();
내가 보는 문제는 사람들이 어디에서나 그것을 사용하고 있다는 것입니다 ... 예를 들어 :
// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();
// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();
다음 논쟁은 기능을 더 잘 지명 할 것입니다 ...
var weight = GetExactWeightOfTheBrownYakInKilograms();
여전히 돌아올 것이 무엇인지 모릅니다. int, 소수점, 부유물, 무게 대상입니까? 나는 여전히 그것을 찾는 데 시간을 낭비해야한다 ... 게으른 프로그래밍에서 하루를 절약하려면 Intellisense 목발이 필요합니다. 함수 이름에 리턴 유형을 포함시킬 수 있습니다. 좋은 생각, Var를 사용하는 좋은 생각은 내 모든 기능이 실제 긴 이름을 갖는 것 외에는 아무것도 절약하지 못했습니다.
나는 사람들이 VAR을 사용하고 있다고 생각하며 게으른 프로그래밍으로 이어지고 코드를 읽기가 더 어려워집니다. 키워드 VAR을 입력 할 때마다 명시 적 대신 키워드를 사용하는 이유가 있어야합니다.
이것은 약간 주관적이지만 키워드가없는 대신 암시 적으로 입력 한 변수에 대한 "var"키워드를 갖도록 C# 3.0을 설계하면 코드를 더 읽기 쉽게 만듭니다. 예를 들어 아래 첫 번째 코드 블록은 두 번째 코드보다 읽기 쉽습니다.
변수가 선언되는 곳이 분명합니다.
var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
변수가 어디에서 선언되는지는 분명하지 않습니다.
myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;
이것들은 지나치게 단순한 예입니다. 나는 당신이 이것이 어디로 가는지 볼 수 있다고 생각합니다. 복잡한 상황에서는 변수가 실제로 정의 된 장소를 찾을 수있어서 좋을 수 있습니다.
당신의 질문에, var
컴파일러에게 단어를 말함으로써 코드에 값을 추가합니다. anon
이제 과제에 암시 된 유형의 항목을 볼 수있는 곳마다 사용하는 것이 합법적입니다. 이와 같이 컴파일러에 이름을 도입해야하면 컴파일러가 명시 적으로 말하지 않은 것을 거부 할 수있게하므로 컴파일 시간에 특정 종류의 오류가 발생하여 런타임에 날려 버리지 않습니다.
예를 들어, 질문의 업데이트 섹션 에서이 스 니펫에 대해 물었습니다.
anon = new { Name = "Terry", Age = 34 };
이런 식으로 허용하는 문제는 실제로 오타이더라도 이름이 이전에 변수 선언으로 존재하지 않은 과제의 왼쪽에있는 모든 것을 돌린다는 것입니다. 나중에 프로그램의 나중에 다른 것을 ANON에 할당 한 다음 새 값을 참조 할 수 있지만 중간 문에는 오타가 있으면 런타임까지 나타나지 않는 문제가 있습니다.
귀하의 응답은 Boo가 수행한다는 것이므로 괜찮거나 최소한 가능해야합니다. 그러나 그것은 빨간 청어입니다. 우리는 BOO가 아닌 C#에 대해 이야기하고 있습니다. C#의 목적 중 하나는 컴파일러가 가능한 많은 오류를 포착 할 수있는 언어를 갖는 것입니다. Boo도 그렇게하고 싶어하지만 파이썬과 더 좋아지기를 원합니다. 그래서 희생 약간 Python-like 구문과 대가로 C#의 컴파일 타임 안전 (전부는 아님).
면책 조항 : 내 예는 내가 아는 것이기 때문에 Java입니다. 그러나 개념은 동일해야합니다.
나는 내가 중요하다고 생각하는 대답을 투표했다 (실수로 새로운 변수를 만들기에는 너무 쉽다).
bill=5;
bi11=bill+5
Bill의 가치는 무엇입니까?
즉, 나는 때때로 유형이 다소 짜증이납니다.
DataOutputStream ds=new DataOutputStream();
중복 된 것 같지만 솔직히 말해서는 아무런 문제가 없습니다. 두 번 입력하는 데 더 이상 걸리지 않으며 매우 도움이됩니다. 시간이 걸리는 것은 질문이있을 때입니다. API를 사용하는 방법 만 확실하지 않은 경우입니다. 만약 당신이 그 유형 선언을 두 번 입력하는 것이 정말 귀찮다면, 왜 여기에 시간을 낭비하고 있습니까? 이 글을 읽기 시작했기 때문에 30 ~ 40 개의 선언을 입력 할 수 있었으며, 다음 2 주 동안 필요한 모든 선언에 충분히 충분합니다.
나는 자신을 반복 할 수있는 감정적 스트레스를 이해하지만 일관성, 명확성 및보다 지능적인 도구를 만들 수있는 능력이 가치가 있다고 생각합니다.
한 가지 더, 대부분의 경우 코드는 위의 예와 같지 않아야합니다. 당신이해야 할 일은 다음과 같습니다.
DataOutput ds=new DataOutputStream();
이것은 즉시 콘크리트 클래스를 템플릿에 사용하고 있다는 사실을 숨 깁니다. 해당 템플릿은 수업에 필요한 모든 작업을 수행 할 수 있어야합니다. 나중에 DS를 다른 종류의 출력 스트림으로 바꾸고 싶다면 단순히 한 줄을 변경하면 고정됩니다. DataOutputStream으로 캐스팅하여 DataOutput에 사용할 수없는 기능을 사용하는 경우 편집기가 쉽게 파악하고 알려줍니다.
익명 유형의 경우, 무엇보다도 LINQ를 지원합니다.
LINQ를 지원하기 위해 VAR (및 기타 새로운 키워드)이 특별히 추가되었다고 생각합니다.
VAR은 익명 유형을 만드는 데 사용되는 키워드입니다. http://msdn.microsoft.com/en-us/library/bb397696.aspx
익명 유형은 LINQ 이외의 다른 장소에서 사용할 수 있습니다.
var는 LINQ에 유용합니다. 실제로 한 전문가 저자에 따르면 "'var'가 없으면 LINQ는 사용하기에는 너무 고통 스럽습니다."