ReSharper가 모든 것에 'var'을 사용하려는 이유는 무엇입니까?


214

방금 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 개발에 "들어갔습니다". 그래서 무슨 일이 일어나고 있는지, 그리고 그것이 유익한 지 아닌지를 정말로 알고 싶습니다.



27
나는 이것에 대해 한동안 생각해 왔으며 var타입이 전혀 분명하지 않은 경우에도 항상 사용해야한다고 결론을 내렸다 ! 이 때문에 이유는 강제로 내가 가지고 올 수있는 가장 설명이 포함 된 이름을 선택하는 나에게 궁극적으로 그 훨씬 더 읽을 수 많은 코드를 만든다. 궁극적으로 구현에서 로직을 분리하는 데 도움이됩니다. 물론 그것은 내 의견 일뿐입니다. 누군가에게 도움이되기를 바랍니다.).
MasterMastic

답변:


189

한 가지 이유는 가독성이 향상 되었기 때문입니다. 어떤게 더 좋아?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

또는

var dictionary = new Dictionary<int, MyLongNamedObject>();

260
나는 첫 번째를 말할 것입니다. 무슨 일이 일어나고 있는지 더 쉽게 볼 수 있습니다!
Mongus Pong

104
곰팡이 : 당신은 중복 텍스트를 좋아합니까 중복 텍스트를 좋아합니까? : D
Mark Simpson

73
내 의견으로는 명백한 것이 더 분명하다. var를 많이 사용하면 일부 시나리오에서 두통이 발생합니다.
user1231231412

172
개발자 var가 모든 것을 사용할 때 나는 그것을 싫어합니다 .TFS (웹 기반 diffs)를 사용하여 많은 코드 검토를하고 내 작업을 매우 어렵게 만듭니다. 즉 var items = GetSomeItems();vs IDataReader dr = GetSomeItems();둘 다 문을 사용하여 누락되었지만 IDataReadervs를 사용할 때 쉽게 잡을 수 var있습니다.
Chris Gessler

17
좋은 코드를 작성하는 훌륭한 개발자이고 Resharper와 같은 라이브러리를 사용하는 경우 처리하는 명시 적 유형을 알 필요가 없습니다. 인터페이스를 사용하여 계약을 선언하지만 구체적인 클래스는 선언하지 않는 것처럼 var를 사용하면 반환 "유형"이 무엇인지 신경 쓰지 말고 그것이하는 일만 신경 쓰고 잘 명명 된 변수를 사용한다고 말할 수 있습니다. intelli-sense & resharper / VS 도우미 (예 : Ctrl + 클릭으로 정의로 이동)를 사용하면 99 %의 방법을 얻을 수 있습니다. 또한 var를 사용하면 메서드 반환 유형을 변경하면 코드베이스를 다시 작성할 필요가 없습니다.
Joshua Barker

286

ReSharper가 제안하는 것은 var 키워드를 과도하게 사용하는 것입니다. 유형이 분명한 곳에서 사용할 수 있습니다.

var obj = new SomeObject();

유형이 명확하지 않은 경우 대신 작성해야합니다.

SomeObject obj = DB.SomeClass.GetObject(42);

36
악마를 옹호하기 위해, 아마도 메소드 나 변수 이름에서 유형이 명확하지 않은 경우 var를 과도하게 사용하는 것보다 이름을 짓는 데 문제가 있음을 나타냅니다. 나는 원칙적으로 var가 명확성을 제거하지 않을 때만 사용해야한다는 것에 동의합니다.
Matt Briggs

33
이 경우 오히려 더 나은 변수 이름을 사용합니다. 기본적으로 변수의 유형을 파악하기 위해 변수가 정의 된 위치를 찾아 보라고 제안합니다. 변수의 목적을 알 수 있도록 변수의 이름을 더 잘 지정할 것을 제안합니다.
Jaco Pretorius

18
@Jaco : +1이지만 type에 대한 정보는 변수 이름으로 사용하지 않는 것이 좋습니다. 예를 들어 헝가리 표기법은 좋은 습관으로 간주되지 않습니다.
Roman Boiko

8
ReSharper의 기본 설정이 과용인지 여부 var는 의견의 문제이며 "명확하게"서로 다른 것이 아닙니다. 컴파일러가 알아낼 수있는 것을 입력하지 않는 것이 좋습니다. 나는 C # 형식 유추를 좋아하고 종종 F # 형식 유추만큼 좋기를 바랍니다. 가능하다면 F #의 표준과 마찬가지로 메소드 매개 변수 및 반환 유형에서 명시 적 유형을 생략합니다. 물론 모든 사람이 동의하는 것은 아닙니다.
Joel Mueller

15
@AnonymousType : 여전히 요점을 놓치고 있습니다. 메소드 이름은 항상 메소드의 의도를 반영해야하지만, 그렇게하더라도 이름이 리턴 값의 유형을 지정한다는 의미는 아닙니다. Stream예를 들어 객체 에서 읽는 방법 은 이름 Read이 아니라 ReadAndReturnNumberOfBytesAsInt32.
Guffa

99

나는 개인적으로이 제안을 끄는 것을 선호합니다. 사용 var하면 가독성이 향상 될 수 있습니다. 그러나 언급했듯이 때로는 단순 유형으로 또는 결과 유형이 모호한 경우 감소합니다 .

사용 var하고 싶지 않을 때 선택하는 것을 선호합니다 . 그러나 다시, 그것은 바로 나입니다.


11
나는 ReSharper가 꽤 똑똑해야한다고 생각했다. 결과 유형이 명백한시기 (예 : 새 키워드를 가진 것)와 명확하지 않은시기를 아는 것이 현명하지 않습니까?
DisgruntledGoat

3
글쎄, 나는 그 특징의 특성을 모른다. 그러나 나는 그것이 제안한 양에 압도 당했다는 것을 알고있다. 그리고 나는 var상당히 자주 사용 합니다.
Bryan Menard

5
항상 var (resharper suggest와 같은)를 사용할 때 변수의 이름을 올바르게 지정해야한다는 것을 알았습니다.
Sauleil

제안을 끌 수 있습니까?
Chris S

@AngeDeLaMort : 요점은 부적절한 이름 인 fe를 사용하도록 강요한다는 것 var methodXYResultIntArray입니다. 그것은 모든 코딩 표준에 위배되며보다 간결합니다 int[] methodXYResult. byte[]나중에 메소드에서 를 반환 하려면 모든 변수 이름이 잘못되었습니다. 명시 적 유형을 사용하면이를 매우 쉽게 리팩토링 할 수 있습니다. var, fe 를 사용해야 할 이유가 있습니다 Dictionary<string, List<SomeType<int>>>. 그러나 전체 유형 이름이 너무 길지 않고 new오른쪽 (또는 명시 적 캐스트)을 사용하지 않으면 resharper가 제안하지 않아야합니다.
Tim Schmelter

69

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가 기본적으로 왜 전체를 사용합니까? 나는 그것을 사용하지 않는 것이 가장 좋은시기를 결정하기 위해 상황의 뉘앙스를 파싱 할 수 없기 때문에 쉽게 제안 할 것입니다.


5
IMHO 예제는 실제로 사용해야하는 좋은 이유 var이며 적절한 메소드 이름을 작성해야합니다. GetNumber() -but what type?- 왜 신경써? 알아야 할 것이 중요하다면, 메소드를 호출하십시오 . GetNumberAsDouble()마지막으로 하나의 메소드가 리턴 string되고 다른 하나가 리턴 되면 작동합니다 double.
nicodemus13

10
@ nicodemus13 일반적으로 함수 자체를 작성할 때가 아니라 실제로 리턴 값을 사용할 때 함수의 리턴 유형에 관심이있을 때 알고 있습니다. 제안 된 이름 지정 체계는 GetResultsAsIEnumerableOfDouble과 같은 악용으로 이어질 수 있으며 var를 사용하여 할당의 오른쪽으로 이동하여 할당의 왼쪽에서 제거한 유형 정보를 이동하면됩니다.
Eric

var value2 = Math.Abs ​​(-3); // 분명히 숫자 데이터 형식입니다. Abs 메소드에 7 개의 오버로드가있어 그것을 볼 때 모호한 결과를 가져온다는 점을 감안하면이 점에 완전히 동의하지 않습니다. imo
s1cart3r

var는 또한 다음과 같은 미묘한 논리 오류를 일으킬 수 있습니다. var counter = "0"; 당신이 원하는 것이 정수일 때.
alaniane

42

ReSharper에서 (8.02,하지만 가능성이 다른 버전), "사용 암시 적으로 형식화 된 로컬 변수 선언"제안에 대한 옵션에서 조정할 수 있습니다 우선 제 1 개구 ReSharper에서의 옵션 메뉴에 의해 그 무엇이든간에, :

ReSharper 옵션 메뉴

그런 다음 선택한 언어의 "검사 심각도"를 조정하여 "코드 검사"에서 내 경우에는 c # :

암시 적으로 형식화 된 지역 변수 제안 해제

보시다시피 ReSharper가 제안하는 모든 제안을 조정할 수있는 옵션이 있습니다. 이것이 이미 'var'사용 전략을 가지고 있고 ReSharper가 그것을 존중하기를 원하는 나와 같은 누군가를 돕기를 바랍니다. :)


이것은 전혀 묻지 않은 다른 질문에 대한 답변입니다.
Carles Alcolea

9
그러나 여기에 왔을 때 그것을 찾는 많은 사람들과 관련이 있습니다. +1
Ori Nachum

24

인스턴스화 된 객체의 유형을 변경하는 것이 더 쉽다고 언급 한 사람이 아무도 없습니다.

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

반복의형태입니다 . 내가 변경하려면 AVeryLongTypeName파생 클래스 중 하나에, 난 단지 사용하는 경우 한 번이를 변경할 필요가 var하위 클래스의 메소드에 액세스 할 수 있습니다 계속합니다.

그 외에도 개선 된 가독성은 중요한 점이지만 다른 사람들이 말했듯이 var을 과도하게 사용해서는 안되므로 Resharper에서 힌트를 끄는 것이 좋습니다.


"새로운"대신 팩토리 메소드를 호출 할 때 매우 유용
Ian Ringrose

코드를 처음 작성할 때 'MyClass'를 사용해야하고 작동하면 작동합니다. 변경해야 할 때, 특히 인터페이스가 관련된 경우 어디에서나 변경해야합니다. 코드는 에세이처럼 취급되어서는 안되며 의미적이고 잘 정의되어 있어야합니다.
Piotr Kula

24

'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좀 더 포괄적 인의 키워드를 나에게 대부분의 시간. 그러나 유형 뒤에 변수 이름을 지정하는 경향이 있으므로 실제로 정보를 잃지 않습니다.

그것은 때때로 예외를 만드는 상황에 따라 복잡한 것의 본질이며 소프트웨어는 복잡하지 않은 경우가 아닙니다.


1
나는 var한 줄을 읽는 동안 그것이 무엇인지 아는 한 아무것도 반대하지 않기 때문에이 대답이 가장 좋습니다 . 다른 도메인 모델을 사용하는 다른 솔루션에서 어떤 메소드가 반환되는지 잘 모를 경우 해당 유형을 명시 적으로 정의하여 읽기가 훨씬 쉽습니다. +1
Piotr Kula

반환 된 유형이 분명하지 않은 모든 경우에 유용한 정보를 생략하면서 var를 사용해서는 안된다는 데 동의합니다.
롤백

18

나도 이것을 싫어했다.

나는 이것의 사용에 대한 토론으로 변하기를 원하지 var않는다. 그것의 용도는 있지만 모든 곳에서 사용되어서는 안된다.

기억해야 할 핵심은 ReSharper가 원하는 코딩 표준으로 구성되어 있다는 것입니다.

편집 : ReSharper 및 var


13
1 년 정도 저항 한 후에는 항상 var를 사용합니다.
LiamB

15

나는 많은 정답을 보았지만 전체 답을 누락했습니다.

ReSharper var는 기본적으로 과다 사용 합니다. 나는 대부분의 사람들이 그것에 동의 할 것이라고 생각합니다. 언제 var사용될 때도 읽기 쉽고 new문장 을 사용할 때와 같이 유형이 분명 합니다. 사용에 대한 힌트 만 표시하도록 검사 심각도를 업데이트하는 방법을 보여주는 게시물이 하나 있습니다 var.

나는 다른 게시물에 대해 먼저 언급하여 이들을 설정할 위치를 추가하려고했지만 그 명성을 얻지 못했습니다. 분명히, 나는 설정의 스크린 샷을 게시 할 평판이 없었습니다.

가는 방법을 설명하겠습니다.

Visual Studio에서> 주 메뉴> Resharper> 옵션> 코드 편집> C #> 코드 스타일> 선언의 Var 사용법

  • 내장 유형의 경우 명시 적 유형 사용
  • 간단한 유형의 경우 'var'을 사용하십시오.
  • 다른 곳에서 사용

여기에 이미지 설명을 입력하십시오

ReSharper 도움말 문서 : 코드 구문 스타일 : 암시 적 / 명시 적 입력 ( 'var'키워드) — 'var'키워드 사용에 대한 환경 설정 구성


이것은 VAR 논쟁의 정답 외부로 표시한다, 이것은 균형 잡힌 접근이다
브라이언 오그 덴

"명확한 곳"이 어떻게 결정되는지 예를 들어 주시겠습니까?
굴림


13

내 규칙은 다음과 같습니다.

  • 당신은 (즉, 기본 유형을 선언하고 있습니까 byte, char, string, int[], double?, decimal, 등)? -> 유형을 사용하십시오.

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
  • 복잡한 유형을 선언하고 있습니까 (예 List<T>: Dictionary<T, T>, MyObj)? -> 사용 var:

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();

동의하지 않습니다 string myStr = "foo";. 문자열이라는 것이 분명합니다. 나는 당신의 모든 예제를 var 카테고리를 사용하는 방법과 명시 적 유형을 사용하는 메소드에서 반환되는 선언에 넣었습니다. 그러나 하루가 끝나면 특정 프로젝트에 대해 귀하와 팀이 더 나은 느낌을 갖습니다.
Dean Meehan

12

C # 코딩 규칙 에서 "var"을 사용하는 것이 좋습니다.

할당의 오른쪽에서 변수의 유형이 분명하거나 정확한 유형이 중요하지 않은 경우

아마 ReSharper에서 팁이 기본적으로 켜져있는 이유 일 것입니다. 또한 동일한 문서에서 바로 아래에서 가독성을 향상시키지 않는 경우도 있습니다.


유형이 나왔다는 것을 알면 좋습니다 System.Diagnostics.PerformanceCounter() . 내장 된 진단 클래스에서 성능 카운터를 쉽게 알 수 있습니다. 그러나 어떤 유형이 여기에 반환됩니까? var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)? 특히 솔루션에 100 개가 넘는 프로젝트가있는 경우 클로킹 단서가 없습니다.
Piotr Kula

"변수의 유형이 명백한 경우 권장"및 "또한 동일한 문서에서 바로 아래에서 가독성을 향상시키지 않는 경우도 제공합니다." 솔직히, 나는 당신의 요점을 놓친 것 같아요. 내 대답은 당신이 말하는 것과 같은 것을 말합니다.
jose

6

ReSharper는 var객체 생성을 방해하지 않기 때문에 권장 합니다.

이 두 가지 예를 비교하십시오.

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

쉽게 읽을 수있는 속기입니다.

"new"를 사용하여 새 객체를 명시 적으로 만들면 문제가 없다고 생각합니다. 그러나 예제에서 클래스의 이름이 올바르게 지정되지 않은 경우 명확하지 않을 수 있습니다.


6

BTW, ReSharper는 '이 제안을 코드에 적용하고 싶을 수도 있습니다'와 '코드가 깨졌습니다. 수정 하시겠습니까?'를 구분합니다. var키워드는 "만약 반전하는 중첩 줄이기"같은 것들과 함께, 제안 카테고리에; 따를 필요가 없습니다.

옵션 대화 상자를 통해 또는 해당 경고의 팝업 메뉴를 통해 각 경고가 얼마나 성가신지를 구성 할 수 있습니다. var제안 과 같은 것을 다운 그레이드하여 덜 두드러지게하거나 '확장 방법 사용'경고와 같은 것을 업그레이드하여 실제 오류로 표시 할 수 있습니다.



4

Var는 훌륭하다! 나는 var역동적 인 유형에 묶여 있는 인상을 받고있는 많은 개발자를 만났습니다. 그것은 여전히 ​​정적으로 타입이며, 컴파일러에 의해 결정됩니다.

var를 사용하면 놀라운 장점이 있습니다.



Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()Yuk 와 같이 타이핑적을 수록 더 짧고 읽기 쉽습니다 .

var postcodes = new Dictionary<int,IList<string>>()\ o / \ o /

좀 더 서술적인 변수 이름 -열렬한 이름 이지만 유동적 인 본질을 var여기 에 비추는 것이 중요하다고 생각합니다 . var약간 모호한 것처럼 유형 자체를 말하게하는 대신보다 결정적인 변수 이름을 권장합니다.

적은 코드 변경 -메소드 호출의 리턴 유형이 변경되는 경우. 사용되는 모든 장소가 아니라 메소드 호출 만 변경하면됩니다.

익명 유형 -익명 유형은 특히 WebApi 부분 리소스 와 같은 영역에서 매우 강력한 개념입니다. 입니다. var가 없으면 사용할 수 없습니다.

그러나 때로는 유형을 명시 적으로 선언하는 것이 유용하며 프리미티브 또는 구조체에서 가장 유용합니다. 예를 들어 개인적 으로이 구문이 매우 유용하지 않습니다.

for(var i = 0; i < 10; i++) 
{

}

vs

for(int i = 0; i < 10; i++) 
{

}

모두 개인 취향에 달려 있지만 var실제로 사용 하면 개발 속도가 빨라지고 익명의 선한 세상이 열립니다.


2

var를 사용하면 기술적으로 차이가 없으며 컴파일러에서 형식을 암시합니다. 다음과 같은 코드가 있다면 :

var x = 1;

x는 int로 간주되며 다른 값을 지정할 수 없습니다.

var 키워드는 변수 유형을 변경하는 경우 유용합니다. 그런 다음 두 개 대신 한 번만 변경하면됩니다.

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";

1
@ AlexKamburov 아래 코드 10 줄은 어쨌든 중단되며 var와 관련이 없습니다.
user3285954

1
@ user3285954 경우에 따라 var가 문제를 숨길 수 있으며 그 때 상황이 추악해질 수 있습니다. 문제는 코드를 작성하는 것이 아니라 유지 관리가 용이하다는 것입니다. 일부는 var로 더 깨끗하다고 ​​주장하지만 때로는 난독 화로 간주합니다. 종교 토론에 가깝습니다. brad-smith.info/blog/archives/336 개인적으로 Linq 문과 형식을 선언하는 것이 장황한 다른 장소에만 var를 사용합니다. 나는 var가 좋은 추가 요소라고 생각하며 사람들은 Anders Hejlsberg의 의견을 소개해야합니다.
Alex Kamburov

2

그만큼 var 키워드는 C # 3.0에서 도입되었습니다. 형식을 명시 적으로 지정하는 것을 잊을 수 있습니다.

당신이 사용 여부에 실제 차이가 없습니다

MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

또는

var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

순수한 가독성과 오류 발생 가능성을 제외하고.

진부한 예처럼 보이지만 다음을 이해하면 도움이 될 수 있습니다.

var myInt = 23;

int유형을 반환하는 반면

var myInt = "23";

를 반환 string유형을 .

MSDN 참조


2

명시 적 객체 유형을 지정하는 것은 어떻게 든 중복됩니다. 영어로 번역 되어도 "X 유형의 객체를 X 유형의 변수에 넣습니다"와 "X 유형의 객체를 변수에 넣습니다"라는 중복 소리가납니다.

그러나 'var'을 사용하면 한계가 있습니다. 그것은의 아래 사용 방지 다형성 이다 순수한 아름다움을 :

개가 동물을 확장한다고 가정하자. 고양이는 동물 클래스 계층 구조를 확장합니다.

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

x가 'var'로 선언 된 동일한 코드 는 컴파일되지 않습니다 .

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

어쨌든 원래 질문으로 돌아가서 Resharper를 사용하지 않지만 'var'을 사용하지 않을 때를 감지하기에 충분히 똑똑하다고 가정합니다. :-)


4
으로 된 바늘 캐스팅 as은 끔찍합니다. Animal x = new Cat(); DoStuffWithDog(x as Dog); 왜 x를 재사용합니까? 와 같은 것이 있으면 컴파일 오류를 런타임 오류로 바꿉니다 . Dog x = new Dog (), Cat y = new Cat (), 붐은 더 이상 모호하지 않습니다.
Mark Sowul

캐스팅 ( 'as'여부에 관계없이)으로 인해 런타임 오류가 발생할 수 있습니다. 당신이 무엇을하고 있는지 알 때 캐스팅에 대해 '무슨 짓'합니까? 왜 x를 재사용합니까? 여기 예제는 예시입니다. 이 예제의 목표는 'var'을 사용하여 참조가 다형성 일 때 제한을받는 방법을 보여주는 것입니다.
xtrem

5
다형성은 여기서 일어나고있는 것과 반대입니다. 이것은 유형의 객체를 and Animal를 사용하는 메소드 에 전달하려고합니다 . 다형성은 반대입니다. 따라서 유형의 객체를 다음 과 같은 메소드로 전달할 수 있습니다 . 예 : ,DogCatDogCatAnimalvoid Walk(Animal a)Walk(new Cat())Walk(new Dog())
Mark Sowul

이런 식으로 변수를 재사용해서는 안되며 매우 불쾌한 버그가 발생합니다. 짧은 방법에서는 그렇게 분명하지 않지만 15-20 줄의 코드가 있으면 x가 무엇인지 잊어 버릴 것입니다. 게으르지 마십시오. var dog = new Dog (); DoStuff (개); var cat = new Cat (); DoStuff (고양이);
user3285954

2
싸움이 없습니다. 변수를 선언하는 방법 (내재적 또는 명시 적)에 대한 느낌이 없습니다. 나는 실제로 대부분의 날 중 적어도 하나를 사용합니다. 암시 적 (var) 방법을 선택할 때 컴파일러가 가능한 가장 좁은 유형을 결정한다는 것을 강조하고 있습니다. 항상 원하는 것은 아닙니다. 그게 다야.
xtrem

2

내 생각에 var 로는 변수 값을 정의 할 때 유형이 무엇인지 즉시 알 수있을 때만 사용해야합니다.

예:

var s = "string value";

명백하다 s입니다 string.

변수 유형 이름이 매우 복잡한 경우에도 적합하다고 생각합니다.

예:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

이 시나리오 외에는를 사용하여 생성 된 GAIN이 표시되지 var않지만 해가 될 수있는 몇 가지 시나리오를 생각할 수 있습니다.

예를 들어 오른쪽 변수 값에 유형이 명확하게 표시되지 않는 일회용 유형이 있습니다. IDisposable의 폐기는 쉽게 잊을 수 있습니다

예:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.

1

'var'은 코드에 일종의 "동적"요소를 추가합니다 (물론 코드는 엄격하게 입력 된 상태로 유지되지만). 유형이 명확하지 않은 경우에는 사용하지 않는 것이 좋습니다. 이 예제를 고려하십시오.

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

두 클래스 모두 DoSomething ()을 구현하므로 GetTheObjectFromDatabase ()의 반환 유형이 유형 A에서 B로 변경되면 알 수 없습니다. 그러나 이제 코드는 실제로 완전히 다른 작업을 수행 할 수 있습니다.

로그에 서로 다른 내용을 쓰는 것만 큼 미묘 할 수 있으므로 너무 늦었다는 것을 알지 못할 수 있습니다.

var의 다음 사용은 항상 괜찮습니다.

var abc = new Something();

1

"var"을 지속적으로 사용하는 것을 싫어하는 사람들을 위해 "변수 소개"를 수행 할 때 ReSharper의 기본값을 var로 중지 할 수도 있습니다. 이것은 오랫동안 저를 좌절 시켰습니다. 항상 var로 기본 설정되어 있었고 매번 변경했습니다.

이러한 설정은 코드 편집> C #> 코드 스타일에 있습니다.

여기에 이미지 설명을 입력하십시오


0

eWolf가 지적한 바와 같이 기술적 차이는 없습니다. 하나를 사용할 수 있으며 생성 된 CLR 코드는 동일하게 보입니다.

내 의견으로는 주요 이점은 이것이 더 나은 변수 이름 지정을 사용하도록하는 경향이 있다는 것입니다. 귀하의 예에서 'foo'는 변수 이름에 대한 선택이 좋지 않습니다.


0

JetBrains (ReSharper의 저자)에 따르면 기본적으로 var를 사용하도록 권장합니다.

에서 자신의 웹 사이트 :

varC # 3.0에 도입 된 암시 적으로 형식화 된 지역 변수 ( 키워드 라고도 함 )를 사용하면 많은 시나리오에서 가독성이 향상되므로 매우 인기가 있습니다. 기본적으로 ReSharper는 var키워드 사용을 권장 하지만 사용 환경 설정을 유연하게 구성 할 수 있습니다. 예를 들어 특정 경우 나 어느 곳에서나 명시 적 유형을 사용하도록 선택할 수 있으며 ReSharper는 환경 설정을 강화하는 데 도움이됩니다.


명시 적 유형 선언이 필요한 시점을 어디에서 구성 할 수 있습니까?
user764754
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.