방금 Visual Studio에서 ReSharper를 사용하기 시작했습니다 (SO에 대한 많은 권장 사항 후). 그것을 시도하기 위해 최근 ASP.NET MVC 프로젝트를 열었습니다. 내가 제안한 첫 번째이자 가장 빈번한 것 중 하나는 대부분 / 모든 명시 적 선언을 var
대신 변경하는 것입니다. 예를 들면 다음과 같습니다.
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
등등도 단순한 유형과 같은 int
, bool
등등
이것이 권장되는 이유는 무엇입니까? 나는 최근 컴퓨터 과학이나 .NET 배경에서 오지 않아서 .NET 개발에 “들어갔습니다”. 그래서 무슨 일이 일어나고 있는지, 그리고 그것이 유익한 지 아닌지를 정말로 알고 싶습니다.
답변
한 가지 이유는 가독성이 향상 되었기 때문입니다. 어떤게 더 좋아?
Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();
또는
var dictionary = new Dictionary<int, MyLongNamedObject>();
답변
ReSharper가 제안하는 것은 var 키워드를 과도하게 사용하는 것입니다. 유형이 분명한 곳에서 사용할 수 있습니다.
var obj = new SomeObject();
유형이 명확하지 않은 경우 대신 작성해야합니다.
SomeObject obj = DB.SomeClass.GetObject(42);
답변
나는 개인적으로이 제안을 끄는 것을 선호합니다. 사용 var
하면 가독성이 향상 될 수 있습니다. 그러나 언급했듯이 때로는 단순 유형으로 또는 결과 유형이 모호한 경우 감소합니다 .
사용 var
하고 싶지 않을 때 선택하는 것을 선호합니다 . 그러나 다시, 그것은 바로 나입니다.
답변
var
코드의 가독성을 높이면서 코드의 즉각적인 이해를 줄입니다. 마찬가지로 다른 상황에서도 코드의 가독성이 떨어질 수 있습니다. 때로는 그것을 사용하는 것이 중립적입니다. 이해력에 대한 가독성 척도는 비례하지 않지만 상황에 따라 다릅니다. 때로는 둘 다 함께 증가 또는 감소합니다.
요인은 var
적용 대상과 대상이 독자에게 데이터 유형의 즉각적인 난독 화를 지원하는 정도 또는 현재 프로그램 부분을 이해하기 위해 유형 정보가 필요한지 여부입니다.
예를 들어, 이름이 잘못 var
되면 코드 이해력이 떨어질 수 있습니다 . 그러나 이것은 var
잘못이 아닙니다.
var value1 = GetNotObviousValue(); //What's the data type?
//vs.
var value2 = Math.Abs(-3); // Obviously a numeric data type.
때로는 var
코드가없는 상태에서 코드를 더 읽기 쉽도록 간단한 데이터 유형 에 사용 하는 것이 적합하지 않은 경우가 있습니다.
var num = GetNumber(); // But what type of number?
// vs.
double num = GetNumber(); // I see, it's a double type.
때로는 var
다음과 같은 복잡성을보기 위해 신경 쓰지 않아도되는 데이터 유형 정보를 숨기는 것이 유용 할 수 있습니다.
IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG!
//vs.
var q = from t in d where t.Key == null select t;
// I simply want the first string, so the last version seems fine.
q.First().Key;
당신은 있어야 사용 var
하여 호출 할 유형 이름이 없기 때문에 익명 타입의 존재있을 때 :
var o = new { Num=3, Name="" };
에 불구하고 유형 정보를 제공하는 Visual Studio Intellisense var
를 사용하는 경우, 도움없이 엄격한 코드 읽기를 통해 이해에 의존 할 필요가 없습니다. 모든 사람이 Intellisense를 가지고 있거나 사용하지 않는 것으로 가정하는 것이 현명 할 것입니다.
위의 예를 바탕으로 요약하면,var
대부분의 작업은 적당히 수행되고 여기에 표시된 상황에 따라 이루어지기 때문에 카르테 헤의 적용은 좋은 생각이 아닙니다.
Resharper가 기본적으로 왜 전체를 사용합니까? 나는 그것을 사용하지 않는 것이 가장 좋은시기를 결정하기 위해 상황의 뉘앙스를 파싱 할 수 없기 때문에 쉽게 제안 할 것입니다.
답변
ReSharper에서 (8.02,하지만 가능성이 다른 버전), “사용 암시 적으로 형식화 된 로컬 변수 선언”제안에 대한 옵션에서 조정할 수 있습니다 우선 제 1 개구 ReSharper에서의 옵션 메뉴에 의해 그 무엇이든간에, :
그런 다음 선택한 언어의 “검사 심각도”를 조정하여 “코드 검사”에서 내 경우에는 c # :
보시다시피 ReSharper가 제안하는 모든 제안을 조정할 수있는 옵션이 있습니다. 이것이 이미 ‘var’사용 전략을 가지고 있고 ReSharper가 그것을 존중하기를 원하는 나와 같은 누군가를 돕기를 바랍니다. 🙂
답변
인스턴스화 된 객체의 유형을 변경하는 것이 더 쉽다고 언급 한 사람이 아무도 없습니다.
AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );
반복의 한 형태입니다 . 내가 변경하려면 AVeryLongTypeName
파생 클래스 중 하나에, 난 단지 사용하는 경우 한 번이를 변경할 필요가 var
하위 클래스의 메소드에 액세스 할 수 있습니다 계속합니다.
그 외에도 개선 된 가독성은 중요한 점이지만 다른 사람들이 말했듯이 var을 과도하게 사용해서는 안되므로 Resharper에서 힌트를 끄는 것이 좋습니다.
답변
‘var’은 명확하다는 것입니다
var
키워드 사용 여부에 대한 주요 논쟁은 코드가 사용자와 다른 개발자에게 얼마나 읽기 쉬운 지에 관한 것입니다.
마치 이야기를 쓰는 것처럼 결정적인 정답이 없습니다. 그러나 이것의 몇 가지 예를 평범한 영어로 봅시다.
제이크는 빌에게 인사했다. 그는 그를 좋아하지 않아서 다른 방향으로 갔다.
누가 다른 길을 갔습니까? 제이크 또는 빌? 이 경우 “Jake”및 “Bill”이라는 이름을 사용하는 것은 유형 이름을 사용하는 것과 같습니다. “He”와 “him”은 var
키워드를 사용하는 것과 같습니다 . 이 경우 좀 더 구체적으로하는 것이 도움이 될 수 있습니다. 예를 들어 다음은 훨씬 명확합니다.
제이크는 빌에게 인사했다. Jake는 Bill이 마음에 들지 않아서 다른 방향으로갔습니다.
이 경우 더 구체적으로 문장을 명확하게 만들었습니다. 그러나 항상 그런 것은 아닙니다. 특정한 경우에는 읽기가 더 어려워집니다.
Bill은 책을 좋아하기 때문에 Bill은 도서관에 갔으며 Bill은 항상 좋아하는 책을 꺼 냈습니다.
이 경우 “he”를 사용하고 경우에 따라 그의 이름을 모두 생략하면 문장을 읽는 것이 더 쉬울 것 var
입니다. 이는 키워드 를 사용하는 것과 같습니다 .
빌은 책을 좋아하기 때문에 도서관에 가서 항상 좋아했던 책을 꺼 냈습니다.
이러한 예는 요점을 다루지 만 전체 내용을 설명하지는 않습니다. 이 예에서는 그 사람을 언급하는 유일한 방법이있었습니다. 이름을 사용하거나 “he”및 “him”과 같은보다 일반적인 용어를 사용합니다.
코드의 경우 명확성을 추가하는 데 도움이되는 3 가지 방법이 있습니다. 유형, 변수 이름 및 할당. 예를 들어 다음 코드를 보자.
Person p = GetPerson();
문제는 이제 코드 라인에 무슨 일이 일어나고 있는지 파악하는 데 도움이되는 충분한 정보가 있습니까?
다음 코드 줄은 어떻습니까? p
이 경우 여전히 무엇을 의미 하는지 알고 싶습니까?
var p = GetPerson();
지금은 어때:
var p = Get();
또는 지금 :
var person = Get();
또는 이것 :
var t = GetPerson();
아니면 이거:
var u = Person.Get();
var
주어진 시나리오에서 키워드가 작동 하는지 여부는 변수, 클래스 및 메소드의 이름 지정 방법과 같은 코드 컨텍스트에 따라 다릅니다. 또한 코드의 복잡성과 코드를 둘러싼 나머지 코드에 따라 다릅니다.
개인적으로 내가 사용하려면 var
좀 더 포괄적 인의 키워드를 나에게 대부분의 시간. 그러나 유형 뒤에 변수 이름을 지정하는 경향이 있으므로 실제로 정보를 잃지 않습니다.
그것은 때때로 예외를 만드는 상황에 따라 복잡한 것의 본질이며 소프트웨어는 복잡하지 않은 경우가 아닙니다.