programing

사용할 항목 : var 또는 개체 이름 유형?

goodcopy 2021. 1. 17. 11:56
반응형

사용할 항목 : var 또는 개체 이름 유형?


이 질문에 이미 답변이 있습니다.

이것은 프로그래밍 할 때 항상 궁금해하는 질문입니다. 코드를 작성할 때 무엇을 사용해야할까요?

var myFiles = Directory.GetFiles(fullPath);

또는

string[] myFiles = Directory.GetFiles(fullPath);

var 는 새롭고 암시 적으로 형식화 된 로컬 변수 이므로 로컬로만 사용할 수 있고 null 일 수 없음과 같은 규칙이 있지만 "일반적으로"사용하는 이점이 있는지 궁금합니다.

"일반적으로"부분은 익명 유형 , 객체 및 컬렉션 이니셜 라이저쿼리 표현식 이 아니라 var 익명 객체를 사용하려는 의도가 아니므로 제가 의미하는 바는 위의 예와 같습니다.

당신의 생각은 무엇입니까?


varLINQ와의 명백한 사용 외에도 가독성을 위해 털이 많은 변수 선언을 축약하는데도 사용합니다.

var d = new Dictionary<string, Dictionary<string, Queue<SomeClass>>>();

일반적으로, 나는 그것을 포기하기를 꺼리는 정적 타이핑으로부터 일종의 편안함을 얻습니다. 나는 변수를 선언 할 때 내가 무엇을하는지 안다는 느낌을 좋아합니다. 변수를 선언하는 것은 컴파일러에게 무언가를 말하는 것이 아니라 코드를 읽는 사람에게 무언가를 말하는 것입니다.

예를 들어 보겠습니다. 을 반환하는 메서드가 있다고 가정합니다 List<string>. 이 코드는 확실히 정확하며 C # 개발자의 90 %가이 코드를 작성하는 방법이라고 생각합니다.

List<string> list = MyMethod();

당연 하죠? 실제로 var. 를 쉽게 사용할 수있는 곳이 있습니다 .

충분히 사실입니다. 그러나 코드의 버전은 단지 변수를 선언하지 않고, 그것을 쓴 사람이 할하려는 어떤 날을 말하고있다 :

IEnumerable<string> list = MyMethod();

이 코드를 작성한 개발자는 "이 목록을 변경하지 않을 것이며, 멤버에 액세스하기 위해 인덱스를 사용하지 않을 것입니다. 목록을 반복하는 것입니다."라고 말합니다. 이는 한 줄의 코드에서 얻을 수있는 많은 정보입니다. 을 사용하면 포기하는 것 var입니다.

물론 처음에 사용하지 않았다면 포기하는 것이 아닙니다. 해당 코드 줄을 작성하는 종류의 개발자라면 이미 사용하지 않을 것임을 이미 알고 var있습니다.

편집하다:

방금 Jon Skeet의 게시물을 다시 읽었는데 Eric Lippert의이 인용문이 저에게 튀어 나왔습니다.

암시 적으로 입력 된 지역은 방법을 무시하고 무엇을 강조 할 수있는 작은 방법입니다.

나는 실제로 많은 경우에 암시 적 타이핑을 사용하는 것이 암시적인 것을 떠나는 것이라고 생각합니다. 무엇에 집착하지 않아도 괜찮습니다. 예를 들어 다음과 같은 LINQ 쿼리를 자연스럽게 작성하겠습니다.

var rows = from DataRow r in parentRow.GetChildRows(myRelation)
           where r.Field<bool>("Flag")
           orderby r.Field<int>("SortKey")
           select r;

이 코드를 읽을 때 내가 읽을 때 생각하는 것 중 하나는 " rowsis an IEnumerable<DataRow>."입니다. LINQ 쿼리가 반환하는 것이 무엇인지 알기 때문에 IEnumerable<T>바로 선택되는 개체의 유형을 볼 수 있습니다.

그것이 명시 되지 않은 경우 입니다. 제가 추론 할 수 있도록 남겨 두었습니다.

이제 제가 LINQ를 사용하는 경우의 약 90 %에서 이것은 아주 작은 문제가 아닙니다. 90 %의 경우 다음 코드 줄은 다음과 같습니다.

foreach (DataRow r in rows)

그러나 다음 rows과 같이 선언하는 것이 매우 유용 할 코드를 구상하는 것은 어렵지 않습니다. IEnumerable<DataRow>여러 종류의 객체가 쿼리되는 코드, 반복 옆에 쿼리 선언을 배치하는 것이 불가능했습니다. rowsIntelliSense로 검사 할 수 있으면 유용합니다 . 그리고 그것은 방법이 아니라 무엇입니다.


"모든 곳에서 var 사용"에서 "기본적으로해야하는 익명 유형에서만 var 사용"에 이르기까지 다양한 의견을 얻을 수 있습니다. 나는 Eric Lippert의 의견을 좋아 합니다 .

모든 코드는 추상화입니다. 코드가 "정말"하는 것은 데이터를 조작하는 것입니까? 아니, 숫자? 비트? 아니, 전압? 아니, 전자? 예,하지만 전자 수준에서 코드를 이해하는 것은 나쁜 생각입니다! 코딩 기술은 청중에게 적합한 추상화 수준이 무엇인지 파악하는 것입니다.

높은 수준의 언어에서는 코드가 수행하는 작업 (의미 론적)과 코드가 수행하는 방식 사이에 항상 이러한 긴장이 있습니다. 유지 관리 프로그래머는 변경 작업에 성공하려면 무엇을 어떻게해야하는지 이해해야합니다.

LINQ의 요점은 "어떻게"를 대폭 축소하고 "무엇"을 대대적으로 강조한다는 것입니다. 프로그래머는 쿼리 이해를 사용하여 미래의 청중에게 "이 결과 집합이 어떻게 계산되는지 정확히 알거나 신경을 써서는 안된다고 생각하지만 결과 집합의 의미가 무엇인지에 대해 매우 신경을 써야한다고 생각합니다."라고 말합니다. 그들은 코드를 구현되는 비즈니스 프로세스에 더 가깝게 만들고 그것을 만드는 비트와 전자로부터 멀어지게 만듭니다.

암시 적으로 입력 된 지역은 방법을 무시하고 무엇을 강조 할 수있는 작은 방법입니다. 그것이 특정한 경우에 옳은 일인지 여부는 판단이다. 그래서 나는 사람들에게 유형에 대한 지식이 관련이 있고 그 선택이 메소드의 지속적인 작동에 중요하다면 암시 적 유형을 사용하지 않는다고 말합니다. 명시 적 타이핑은 "나는 이것이 어떤 이유로 작동하는지 당신에게 말하고 있습니다.주의를 기울이십시오"라고 말합니다. 암시 적 타이핑은 "이 항목이 목록인지 고객 []인지는 중요하지 않습니다. 중요한 것은 고객 모음이라는 것입니다."

개인적으로 유형이 합리적으로 분명하지 않은 경우에는 사용 하지 않는 경향 이 있습니다. 여기서 LINQ 쿼리를 "합리적으로 분명한"것으로 포함합니다. Directory.GetFiles예를 들어, string[]a FileInfo[](또는 완전히 다른 것) 대신 a를 반환하는 것이 분명하지 않고 나중에 수행하는 작업에 큰 차이를 만드는 것이 분명 하지 않기 때문에 저는 그렇게하지 않을 것입니다.

할당 연산자의 오른쪽에 생성자 호출이있는 경우에는 훨씬 더 많이 var사용할 것입니다. 유형이 무엇인지 노골적으로 분명합니다. 이것은 복잡한 제네릭 유형 (예 : Dictionary<string,List<int>>.


개인적으로 저는 두 곳에서만 var를 사용합니다.

  1. 익명 유형, 즉. LINQ 관련 (경우에 따라 var이 필요한 경우)
  2. 문이 동일한 유형에서 특정 유형을 선언하고 구성하는 경우

즉. 이것은 포인트 2의 예입니다.

var names = new List<String>();

수정 됨 : 이것은 Jon Skeet의 질문에 대한 응답입니다.

위의 답변은 실제로 단순화되었습니다. 기본적으로 유형이 다음 중 하나 인 var를 사용 합니다.

  1. 알 필요가 없음 (그다지 많은 장소는 아님)
  2. 알 수 없음 (LINQ, 익명 형식)
  3. 그렇지 않으면 알려지지 않았거나 코드에서 분명합니다.

모두 당신이 코드를 다시 얻을 개체가 어떤 종류의 후손, 그리고 있다는 점이다 쓰기 장소에 알 필요가 공장 방법의 경우에는 몇 가지 유형이 정적 팩토리 메소드를 가지고, 그때 내가 사용하는 것 var . 이렇게 :

var connection = DatabaseConnection.CreateFromConnectionString("...");

The above example is a real example from my code. It is clear, at least to me and the people that use this code, that connection is a DatabaseConnection descendant, but the exact type is not needed for neither understanding the code, nor using it.


I tried the "use var everywhere" style... and here is why I didn't continue to use it.

  1. Degraded readability at times
  2. Limits Intellisense after =
  3. Typing "var" really wasn't much shorter than typing "int", "string", etc., especially with intellisense.

With that said, I DO still use it with LINQ.


Coming from the land of functional programming, where type-inference rules the day, I use var for all locals wherever possible.

In Visual Studio, if you are ever wondering what the type of any local is, all you have to do is hover over it with your mouse.


This post have some good guidlines on when to use var type interface or object types.


I tend to use var everywhere, but my co-workers said stop, it is less readable to us. So I now I use var only on anonymous types, LINQ queries and where is constructor on right side.


I think it's interesting to note how this is usually handled in Haskell. Thanks to the Curry-Howard isomorphism, the (most general) type of any expression in Haskell can be inferred, and thus type declarations are essentially not required anywhere, with a few exceptions; for example, sometimes you deliberately want to limit the type to something more specific than would be inferred.

Of course, what is required and what is recommended are not the same thing; in practice, the convention seems to be that top-level definitions always have type declarations, while localised definitions have the type declarations left out. This seems to strike a good balance between explicitness-for-readability of the definition as a whole, contrasted with brevity-for-readability of the local "helper" or "temporary" definitions. If I understand correctly, you can't use var for "top-level" definitions (like a method or global function) in the first place, so I guess this translates to "use var everywhere you can" in C# world. Of course, typing "int" is the same number of keystrokes as "var", but most examples will be longer than that.

ReferenceURL : https://stackoverflow.com/questions/236878/what-to-use-var-or-object-name-type

반응형