잊지 않겠습니다.

'C# 4.0'에 해당되는 글 5건

  1. 2009.01.07 4. Variance
  2. 2009.01.07 3. Features for COM interop
  3. 2009.01.07 2. Named and Optional Arguments
  4. 2009.01.07 1. Dynamic Lookup
  5. 2009.01.07 C# 4.0의 새로운 기능들

4. Variance

.NET Framework 2009. 1. 7. 12:57

IEnumerable interface의 변경 

  1. public interface IEnumerable<out T> : IEnumerable  
  2. {  
  3.     IEnumerator<T> GetEnumerator();  
  4. }  
  5.   
  6. public interface IEnumerator<out T> : IEnumerator  
  7. {  
  8.     bool MoveNext();  
  9.     T Current { get; }  
  10. }  

 : out의 추가. 모든 결과의 output만이 가능한 상태로 interface의 변경

 

IComparer interface의 변경

  1. public interface IComparer<in T>  
  2. {  
  3.     public int Compare(T left, T right);  
  4. }  

각 Interface에서의 in, out의 명시적 사용이 된 형태로 interface 변경

Posted by Y2K
,

Dynamic import

: Dynamic lookup과 같이 사용되어서 COM에 대한 명시적 선언이 없이 COM 객체에 대한 접근 및 사용이 가능하다.

IDispatch의 이용과 거의 동일하게 사용 가능하다.

  1. //old code  
  2. ((Excel.Range)excel.Cells[1,1]).value2 = "Hello";  
  3.   
  4. //New Code  
  5. excel.Cells[1,1].Value = "Hello";  

 

Omitting ref

: COM에서는 input parameter가 output으로 이용되는 경우가 아주 많다. 대부분이 LRESULT를 반환하고, 나머지 결과들을 대부분 Input Parameter에서 reference 형태로 관리가 되는 경우가 대부분이다. 기존의 C#에서 COM object를 사용할 때에는 ref를 지원하였으나, 이제는 자동으로 형태를 구현 할 수 있게 변경된다.

: COM 객체에 대한 지원은 .NET Framework가 올라가면 올라갈수록 계속해서 변경되는 사항인 것 같다.;;
Posted by Y2K
,

Optional parameters

  1. public void Method1(int x, int y = 3, int z = 7);   
  2.   
  3. Method1(10, 11, 12); //ordinary call of Method1  
  4. Method1(10, 11); // x = 10, y = 11, z = 7  
  5. Method1(10); // x = 10, y = 3, z = 7  

: 가장 바라던 기능. 수많은 overload 함수들을 제거할 수 있게 된다. 다른 .NET Framework API들에서도 많은 변화가 있을 것 같다는 생각이 든다.

 

Named and optional arguments

  1. public void Method1(int x, int y = 3, int z = 7);   
  2.   
  3. Method1(10, 11, 12); //ordinary call of Method1  
  4. Method1(x : 1, z : 10); // x = 1, y = 3, z = 10  
  5. Method1(z : 10, x : 1); // x = 1, y = 3, z = 10 : reversing the order of arguments  
: 놀라운 변화중 하나. Ruby나 Python에서 제공되는 Named Arguments를 사용가능하다.
Posted by Y2K
,

1. Dynamic Lookup

.NET Framework 2009. 1. 7. 12:56


method나 instance를 동적으로 가능하도록 변경.

COM, IronPython, HTML DOM 또는 Reflection을 통해 얻어진 객체에 대한 동적인 접근이 가능.

 

The Dynamic Type

C# 4.0에서는 "dynamic" 으로 지정된 Type의 경우에는 runtime 시에 객체의 Byte code를 생성하게 된다.

 

  1. dynamic d = GetDynamicObject(....);  
  2. d.M(7)  

C# compiler에서 Compile시에 dynamic으로 지정된 Instance의 경우에는 Compile시에 넘어가게 되고, runtime시에 method를 각 parameter의 type에 따라서 구현, 실행하게 된다. 

이는 Type에서만 구현되는 것이 아닌, Method, Property 에서도 역시 같이 구현되게 된다.

 

: 상당히 멋진 기능이라고 생각되긴 하는데.. C#이 가진 선언적 언어 특성을 많이 버리는 느낌이 든다. 일단 백서에도 나와있듯이 안정성과 속도를 조금은 버리는 작업이기 때문에 사용하는 것에 있어서 많은 생각을 해봐야지 될것 같다. 무엇보다 Python이 아닌 IronPython의 객체를 얻어오는 것이라서, MS 가 아닌 다른 언어의 객체에 대한 구현은 조금 후에 알아봐야지 될것 같다. (분명히 Python도 되게 하는 방법이 생길것이다.)

 

: 그리고, 이미 사용되고 있는 곳은 매우 많다. Reflection을 통한 invoke와 너무나도 유사한 기능으로 Reflection의 확장으로 보이는 것은 나만의 착각인것일까? 

 

: 생각하지 못했던 내용이 있었다. JSON 데이터 포멧의 경우에는 자유롭게 확장들이 가능해진다. 사용되는 Class의 Property가 무엇인지만 알면 dynamic으로 선언해서 데이터를 얻어오고, 데이터에 대한 객체화가 매우 자유롭게 바뀌게 된다. 

  1. string jsonText = "{ xyz: 123, items: [ 10, 100, 1000 ] }";  
  2.   
  3. JsonReader jsonReader = new JsonReader(jsonText);  
  4. dynamic jsonObject = jsonReader.ReadValue();  
  5.   
  6. dynamic items = jsonObject.items;  
  7. items.Item(2, 1001);  
  8.   
  9. dynamic bar = new JsonObject();  
  10. bar.name = "c#";  
  11. jsonObject.bar = bar;  
  12.   
  13. JsonWriter writer = new JsonWriter();  
  14. writer.WriteValue((object)jsonObject);  
  15.   
  16. string newJsonText = writer.Json;  

 


Runtime Lookup

1. COM objects

: IDispatch를 통한 COM object의 이용. 

2. Dynamic objects

: IDynamicObject interface를 상속한 Class 

3. Plain objects 

: Standard .NET Object

위의 3가지 경우에서 Runtime lookup을 사용가능하다.  

 

  1. dynamic d1 = new Foo();  
  2. dynamic d2 = new Bar();  
  3. string s;  
  4.   
  5. d1.M(s, d2, 3, null);  

 

The Dynamic Langauage Runtime(DLR)

New API in .NET 4.0: DLR은 C#만이 아닌 .NET 기반의 다른 언어들에 대한 변환을 제공 

 

Open Issues

  • Extendted Method에 대한 지원을 할 수 없다. Dynamic으로 선언된 Instance에 대한 Extented Method를 구현하는 것은 불가능하다.
  • Anonymous functions은 dynamic method call에서 지원할 수 없다. 아래와 같은 코드는 사용 불가능하다.
  1. dynamic collection = ....;  
  2. var result = collection.Select(e=>e+5); //사용 불가능하다.  

 

 

Posted by Y2K
,

Visual Studio 2010과 더불어서 같이 준비중인 C# 4.0에서의 새로운 기능들을 간단히 알아보려고 생각중. 

참고 자료 사이트는

http://code.msdn.microsoft.com/csharpfuture


기본 테마

C# 4.0은 Dynamic programming을 기본 Theme로 가지고 있다.

Dynamic Programming언어라고 할 수 있는 Python이나 Ruby정도까지는 아니지만, Compile 할때가 아닌 Runtime시에 자신의 type을 결정할 수 있는 방법으로 구현되고자 한다.  이러한 Dynamic의 예는 다음과 같은 수 있다. 

1. Python이나 Ruby와 같은 Dynamic Programming language에서 생성된 object

2. IDispatch를 통해 구현된 COM objects

3. refrection을 통해 구현된 .NET framework의 객체들

4. 구조체가 변경된 object. (HTML DOM object)

    

C# 4.0의 주요한 기능은 다음과 같다.

1. Dynamic lookup

:  C#의 runtime시에 object의 type이 결정되게 된다.

2. Named and optional parameters

: C#에서의 각 parameter들은 각각의 기본값을 가질수 있다.

  ( C++에서의 기능과 동일하게 생각하면 된다. 왜 이제서야 구현이 되었는지 모르겠는 아주 편한 기능. 이 기능 하나로 많은 overload를 없애는 것이 가능하다.)

: C#에서의 각 parameter들은 각각의 이름을 가지고 값의 입력이 가능하다.

  ( python이나 javascript에서 간간히 나오는 dictionary 입력과 비슷한 함수의 호출이 가능하다. ) 

3. COM specific interop feature

: .NET Framework에서의 COM object의 interop의 개선 및 향상 

4. Variance 

: IEnumerable의 Interface 변경이 이루어졌다. (이건 좀 큰문제가 발생할 수 도 있을것 같은 생각이 든다. List<object> 등 IEnumerable의 Interface는 너무나 많은 곳에서 사용되고 있는데.. 이 부분은 어찌 해결이 될지..;)



Posted by Y2K
,