2016년 11월 23일 수요일

object vs var vs dynamic in C#

Object

: https://msdn.microsoft.com/ko-kr/library/9kkx3h3c.aspx
object 형식의 변수에는 모든 형식의 값을 할당할 수 있음.

- boxing : 값 형식의 변수를 object 형식으로 변환하는 경우

            int i = 123;
            // The following line boxes i.
            object o = i;  
- unboxing : object 형식의 변수를 값 형식으로 변환하는 경우

            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);  
- 익명 형식은 object에서 직접 파생되고 object를 제외한 모든 형식으로 캐스팅 될 수 없는 class 형식으라고 함. 다른 reference 형식과 같음.
- 익명 형식은 필드, 속성, 이벤트, 메서드 반환 형식으로 선언될 수 없다고 함.



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가 발생 할 수 있음.




댓글 없음:

댓글 쓰기