using System.Linq;
namespaceVarTest
{
classProgram
{
staticvoidMain(string[] args)
{
// idx 변수 int로 컴파일 var idx = 5;
// str 변수 string로 컴파일var str = "Hello";
// arr 변수 int[]로 컴파일var arr = new[] { 0, 1, 2 };
// wordQuery 변수 IEnumerable<Word> 혹은 IQueryable<Word> 로 컴파일string[] words = { "사과", "딸리", "포도", "복숭아", "바나나" };
var wordQuery = from word in words
where word == "사과"select word;
}
}
}
var f = GetMagicNumber();
var total = 100 * f / 6;
Console.WriteLine($"Declared Type : {total.GetType().Name}, Value : {total}");
staticdoubleGetMagicNumber()
{
double num = 2;
return num;
}
위의 코드에서 total은 무슨 타입일까?
total의 정확한 타입은 GetMagicNumber() 의 반환 타입에 의해 결정된다.
GetMagicNumber()의 반환 타입을 5가지의 숫자 타입으로 바꿔가며 출력한 결과 내용이다.
Declared Type : Double, Value : 33.333333333333336
Declared Type : Single, Value : 33.333332
Declared Type : Decimal, Value : 33.333333333333333333333333333
Declared Type : Int32, Value : 33
Declared Type : Int64, Value : 33
컴파일러는 GetMagicNumber() 메서드의 반환 타입으로 f의 타입을 결정한다.
total 계산 시에 사용한 상수는 모두 리터럴 이므로 컴파일러가 이 상수들을 f와 동일한 타입으로 변환한 후 계산하게 되는데 이런 이유로 결과 값에 차이가 생기게 된 것이다.
이로 인해 숫자 타입과 var를 함께 사용하면 가독성 문제 뿐 아니라 정밀도와 관련된 혼돈스러운 문제를 유발할 가능성이 생긴다 때문에, 숫자타입은 지역변수에서 선언하더라도 var타입이 아닌 명시적 으로 선언하는 것을 권장한다.
List<string> fruitList = new List<string> { "Apple", "Grape", "Banana", "Orange", "Mango" };
IEnumerable<string> q =
from fruit in fruitList
select fruit;
var query = q.Where(s => s.StartsWith("A"));
위의 코드는 결과를 받아들일 변수 q를IEnumerable타입으로 명시적으로 선언했기 때문에 심각한 성능 문제를 유발할 수 있다.
q의 원래 반환값은IQeuryable타입을 반환하지만, 개발자가 q를 명시적으로IEnumerable으로 선언해 버렸기에IQueryable과 관련된 장점을 모두 잃게 된다. 이렇듯, 개발자가 Linq를 사용하여 해당 반환값을 정확하게 모르는 상태에서 잘못된 타입을 명시적으로 선언할 경우성능저하라는 문제를 직면하게 때문에 Linq 구문을 이용할때 var 변수로 반환값을 받는 것을 권장한다.'