문제

이 질문은 이미 여기에 답이 있습니다.

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

var myFiles = Directory.GetFiles(fullPath);

또는

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

var 새롭고 a 암시 적으로 타이핑 된 로컬 변수, 따라서 우리는 로컬로만 사용할 수 있으며 Null 등의 규칙이 있지만 "정상적으로"사용하는 이점을 얻는 지 궁금합니다.

"정상적으로"부분은 말이 아닙니다 익명 유형, 객체 및 수집 초기화기 그리고 쿼리 표현식 그것이 var 익명 객체를 사용하려는 의도 였으므로 내 말은 ... 위의 예와 마찬가지로.

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

도움이 되었습니까?

해결책

명백한 사용을 넘어서 var LINQ를 사용하면 가독성에 대한 털이 변수 선언을 약칭하는 데 사용합니다.

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

일반적으로, 나는 정적 타이핑으로부터 일종의 편안함을 얻습니다. 나는 변수를 선언 할 때 내가하고있는 일을 알고 있다는 느낌이 마음에 듭니다. 변수를 선언하는 것은 컴파일러에게 무언가를 말하는 것이 아니라 코드를 읽는 사람에게 무언가를 말하고 있습니다.

예를 들어 드리겠습니다. a를 반환하는 메소드가 있다고 가정합니다 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;

내가 그 코드를 읽을 때, 내가 읽을 때 내가 생각하는 것 중 하나는 "rows 이다 IEnumerable<DataRow>. "LINQ 쿼리가 무엇인지 알고 있기 때문에 IEnumerable<T>, 그리고 바로 거기에서 선택되는 물체의 유형을 볼 수 있습니다.

그것은 무엇인가입니다 그렇지 않았습니다 명시 적으로 만들어졌습니다. 내가 추론하기 위해 남겨졌습니다.

이제 LINQ를 사용하는 경우의 약 90%에서는 작은 부분이 중요하지 않습니다. 시간의 90%이기 때문에 다음 코드 라인은 다음과 같습니다.

foreach (DataRow r in rows)

그러나 선언하는 것이 매우 유용한 코드를 구상하는 것은 어렵지 않습니다. rows ~처럼 IEnumerable<DataRow> - 다양한 종류의 객체가 쿼리되는 코드, 반복 옆에 쿼리 선언을 넣을 수 없었으며 검사 할 수있는 것이 유용합니다. rows Intellisense와 함께. 그리고 그것은 어떤 것이 아니라, 어떤 것입니다.

다른 팁

"Var var everywhere"에서 "기본적으로 필요한 익명 유형으로 Var를 사용하는 것"에 이르기까지 다양한 의견을 얻을 수 있습니다. 좋아요 Eric Lippert가 가져 가고 있습니다:

모든 코드는 추상화입니다. 코드가 "실제로"하는 일은 데이터를 조작하는 것입니까? 아니요. 숫자? 비트? 아니요. 전압? 아니요. 전자? 예, 그러나 전자 수준에서 코드를 이해하는 것은 나쁜 생각입니다! 코딩의 기술은 청중에게 올바른 추상화 수준이 무엇인지 알아내는 것입니다.

높은 수준의 언어에는 코드가하는 일과 코드가 어떻게 달성하는지 사이에 항상 이러한 긴장이 있습니다. 유지 보수 프로그래머는 변경에 성공할 수있는 방법과 방법을 모두 이해해야합니다.

LINQ의 요점은 그것이 "방법"을 대폭 강조하고 "무엇"을 크게 강조한다는 것입니다. 쿼리 이해력을 사용함으로써 프로그래머는 미래의 청중에게 "이 결과 세트가 어떻게 계산되는지 정확히 알거나 신경 쓰지 않아야한다고 생각하지만 결과 세트의 의미론에 대해 매우 관심을 가져야합니다." 그들은 코드가 구현되는 비즈니스 프로세스에 더 가깝게 만들고 그것을 만드는 비트와 전자에서 멀어집니다.

암시 적으로 입력 한 현지인은 방법을 강조하고 무엇을 강조 할 수있는 작은 방법 일뿐입니다. 그것이 특정 경우에 옳은 일인지 여부는 판단 요청입니다. 따라서 유형에 대한 지식이 관련이 있고 그 선택이 방법의 지속적인 작동에 결정적이라면 암시 적 유형을 사용하지 않는다고 사람들에게 말합니다. 명시 적 타이핑은 "이것이 왜 그런 이유로 어떻게 작동하는지 말해주고있다"고 말합니다. 암시 적 타이핑은 "이 일이 목록인지 고객 []인지는 중요하지 않습니다. 중요한 것은 고객 모음이라는 것입니다."

개인적으로 나는하지 않습니다 추세 유형이 합리적으로 명백하지 않은 경우 사용하려면 LINQ 쿼리를 "합리적으로 명백한"것으로 포함합니다. 나는 그것을하지 않을 것이다 Directory.GetFiles 예를 들어, 그것이 실제로 string[] (말) 대신 a FileInfo[] (또는 전적으로 다른 것) - 그리고 그것은 당신이 나중에하는 일에 큰 차이를 만듭니다.

과제 연산자의 오른쪽에 생성자 호출이있는 경우 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("...");

위의 예는 내 코드의 실제 예입니다. 적어도 나와이 코드를 사용하는 사람들에게는 분명합니다. 연결 DatabaseConnection Descendant이지만 코드를 이해하거나 사용하지 않으면 정확한 유형이 필요하지 않습니다.

나는 "Everywhere 사용"스타일을 시도했는데 ... 여기에 계속 사용하지 않은 이유입니다.

  1. 때때로 가독성이 저하되었습니다
  2. 지능적인 후 =
  3. "var"를 입력하는 것은 특히 Intellisense와 함께 "int", "string"등을 입력하는 것보다 훨씬 짧지 않았습니다.

그 말로, 나는 여전히 LINQ와 함께 사용합니다.

기능적 프로그래밍의 땅에서 나오는데, 이는 하루에 유형의 감소가 규칙을하는데, 나는 사용합니다. var 가능한 모든 현지인에게.

Visual Studio에서는 로컬의 유형이 무엇인지 궁금하다면 마우스로 마우스 위로 올라 가기 만하면됩니다.

이것 게시하다 var 유형 인터페이스 또는 객체 유형을 사용하는시기에 대한 좋은 지침이 있습니다.

나는 사용하는 경향이있다 var 어느 곳에서나, 그러나 나의 동료들은 멈췄다. 그래서 나는 지금 사용합니다 var 익명 유형, LINQ 쿼리 및 오른쪽의 생성자가있는 곳에서만.

나는 이것이 Haskell에서 일반적으로 어떻게 처리되는지 주목하는 것이 흥미 롭다고 생각합니다. 감사합니다 카레-하위 동형, Haskell에서 표현식의 (가장 일반적인) 유형의 유형을 추론 할 수 있으므로 유형의 선언은 본질적으로 어디에서나 필요하지 않으며 몇 가지 예외가 있습니다. 예를 들어, 때때로, 당신은 의도적으로 유형을 추론하는 것보다 더 구체적인 것으로 제한하기를 원합니다.

물론, 필요하고 권장되는 것은 같은 것이 아닙니다. 실제로,이 협약은 최상위 정의가 항상 유형 선언을 가지고있는 반면, 현지화 된 정의에는 유형 선언이 제외 된 것으로 보인다. 이것은 정의의 명시 적 읽기에 대한 명시성 전체의 균형을 유지하는 것으로 보이며, 전체적으로 "도우미"또는 "임시"정의의 간결성과 대조되는 정의의 전체적으로 판독 할 수 있습니다. 내가 올바르게 이해하면 사용할 수 없습니다 var 처음에 "최상위"정의 (메소드 또는 글로벌 함수와 같은)의 경우, 이것이 "사용"으로 번역 된 것 같습니다. var 당신이 할 수있는 모든 곳에서 "C# World. 물론 타이핑"int"같은 수의 키 스트로크입니다."var"그러나 대부분의 예는 그보다 길어질 것입니다.

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