문제

그만큼 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를 지원합니다.

http://www.blackwasp.co.uk/csharpanontypes.aspx

LINQ를 지원하기 위해 VAR (및 기타 새로운 키워드)이 특별히 추가되었다고 생각합니다.

VAR은 익명 유형을 만드는 데 사용되는 키워드입니다. http://msdn.microsoft.com/en-us/library/bb397696.aspx

익명 유형은 LINQ 이외의 다른 장소에서 사용할 수 있습니다.

var는 LINQ에 유용합니다. 실제로 한 전문가 저자에 따르면 "'var'가 없으면 LINQ는 사용하기에는 너무 고통 스럽습니다."

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top