Object
: https://msdn.microsoft.com/ko-kr/library/9kkx3h3c.aspxobject 형식의 변수에는 모든 형식의 값을 할당할 수 있음.
- boxing : 값 형식의 변수를 object 형식으로 변환하는 경우
int i = 123; // The following line boxes i. object o = i;
o = 123; i = (int)o; // unboxing
class ObjectTest { public int i = 10; } class MainClass2 { static void Main() { object a; a = 1; // an example of boxing Console.WriteLine(a); Console.WriteLine(a.GetType()); Console.WriteLine(a.ToString()); a = new ObjectTest(); ObjectTest classRef; classRef = (ObjectTest)a; Console.WriteLine(classRef.i); } } /* Output 1 System.Int32 1 * 10 */
var
: https://msdn.microsoft.com/ko-kr/library/bb383973.aspx* 메서드 범위 내에서 선언된 변수로서 암시적 형식인 var를 가질 수 있음
* 컴파일 시점에 컴파일러에서 형식을 결정함
* 선언과 동시에 초기화 되어야 하며 이후 type 변경 불가
아래는 기능면에서는 동일함.
var i = 10; // implicitly typed int i = 10; //explicitly typed
주로 다음 예시 처럼 사용할 것 같음.
// Example #1: var is optional because // the select clause specifies a string string[] words = { "apple", "strawberry", "grape", "peach", "banana" }; var wordQuery = from word in words where word[0] == 'g' select word; // Because each element in the sequence is a string, // not an anonymous type, var is optional here also. foreach (string s in wordQuery) { Console.WriteLine(s); } // Example #2: var is required because // the select clause specifies an anonymous type var custQuery = from cust in customers where cust.City == "Phoenix" select new { cust.Name, cust.Phone }; // var must be used because each item // in the sequence is an anonymous type foreach (var item in custQuery) { Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone); }
var 형식은 annonymous 형식을 위해 사용 되어 짐.
: https://msdn.microsoft.com/ko-kr/library/bb397696.aspx
var v = new { Amount = 108, Message = "Hello" }; // Rest the mouse pointer over v.Amount and v.Message in the following // statement to verify that their inferred types are int and string. Console.WriteLine(v.Amount + v.Message);
- 익명 형식은 필드, 속성, 이벤트, 메서드 반환 형식으로 선언될 수 없다고 함.
dynamic
: https://msdn.microsoft.com/ko-kr/library/dd264741.aspx
솔직히 직접 안써봐서 모르겠음.
* 형식 검사를 컴파일 타임이 아니라 런타임 때 수행 함.
* 대부분 환경에서 object와 동일하게 동작하고 실제 컴파일 시점에 object 형식 변수에 컴파일 된다고 하여 dynamic 형식은 컴파일 시점에만 존재한다고 함.
* COM API, IronPython 라이브러리 같은 동적 API 및 HTML DOM에 대한 액세스를 간소화 한다고 함.(??)
class Program { static void Main(string[] args) { dynamic dyn = 1; object obj = 1; // Rest the mouse pointer over dyn and obj to see their // types at compile time. System.Console.WriteLine(dyn.GetType()); System.Console.WriteLine(obj.GetType()); } }
WriteLine
문은 dyn
및 obj
의 런타임 형식을 표시합니다. 이 시점에서는 모두 동일한 형식 정수입니다. 다음 출력이 생성됩니다.System.Int32
System.Int32
컴파일 시간에
dyn
및 obj
사이의 차이를 확인하려면 앞의 예제에서 선언과 WriteLine
문 사이에 다음 두 줄을 추가합니다.dyn = dyn + 3; obj = obj + 3;
식
obj + 3
에 정수와 개체를 추가하려고 시도한 경우 컴파일러 오류가 보고됩니다. 그러나 dyn + 3
에 대해서는 오류가 보고되지 않습니다.dyn
이 포함된 식은 dyn
의 형식이 dynamic
이기 때문에 컴파일할 때 확인되지 않습니다.var와의 차이점
* 속성, 매개변수, 반환값, 지역 변수 등에서 사용 가능
* 초기화 이후 type 변경 가능
* 런타임 시점에 타입을 확장하여 runtime error가 발생 할 수 있음.
댓글 없음:
댓글 쓰기