2011-09-27 3 views
3

C# 언어의 여러 패턴 기능이 있습니다. 즉, 클래스는 특정 인터페이스에서 파생 될 필요가 없습니다. 일부 C# 구문/기능에 참여하기 위해 특정 패턴을 구현합니다.C#에서 구문 패턴을 활성화하는 구문은 무엇입니까?

는 경우를 예로 들어 살펴 보겠습니다 :

여기
public class MyCollection : IEnumerable 
{ 
    public T Add(T name, T name2, ...) { } 
    public IEnumerator GetEnumerator() { return null; } 
} 

, TYPE 어떤 유형입니다. 기본적으로 우리는 IEnumerable을 구현하는 클래스가 있으며 어떤 수의 매개 변수와도 Add()이라는 메서드를 가지고 있습니다.

이 새로운 MyCollection 인스턴스의 다음 선언 할 수 있습니다 :

var mc = new MyCollection(); 
mc.Add(a1, a1, ...); 
mc.Add(b1, b2, ...); 

매직 :

new MyCollection{{a1, a2, ...}, {b1, b2, ...} } 

에 상당입니다! 한편, 최근에 (나는 BUILD 이벤트에서 믿는다) Anders Hejlsberg는 새로운 await/async이 패턴을 사용하여 구현 될 것이라는 것을 알려주었기 때문에 WinRT는 Task<T>이 아닌 다른 것을 반환 할 수있었습니다. 그래서 제 질문은 두 가지이다

,

  1. 무엇 앤더스 얘기 한 패턴, 또는 뭔가 오해 않았다

    ? 답은 WinRT가 제공하는 형식 인 IAsyncFoo과 게시되지 않은 사양 사이의 어딘가에 있어야합니다.
  2. C#에 다른 패턴이 이미 존재합니까? async를 들어
+0

Jon Skeet의 블로그에서 비동기 작업이 어떻게 작동하는지 확인해야합니다. 그는 자신을 어떻게/어떻게/스스로 구현할 수 있는지를 보여줌으로써 그것을 아주 깊이 파고 들게합니다. –

+0

이 블로그 게시물 [패턴 따라하기] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx)를 읽었는지 확실하지 않지만 재미 있을지도 몰라. – R0MANARMY

답변

7

초안 사양 입니다. Visual Studio home page에서 다운로드 할 수 있습니다.비동기의 패턴은 driis의 답변에서 제공되는 패턴입니다. 자세한 내용은 Eduasync blog series을 읽고 패턴에는 this post을 사용하십시오.

이 패턴 만 "당신이 기다릴 수있는 것"에 적용됩니다. 비동기 메서드 이어야합니다. void, Task 또는 Task<T>이 반환되어야합니다.

원래 언급 컬렉션 이니셜 라이저를 넘어 C#에서 다른 패턴의 측면에서

:

  • foreach 너무 오래 유형 MoveNext()이있는 유형을 반환하는 GetEnumerator 방법이 있기 때문에, 비는 IEnumerable implemenations을 반복 할 수 있으며 Select 호출에 Current 회원
  • LINQ query expressions 해결, Where, GroupBy
+0

감사합니다. Jon,이 기능의 전체 목록이라고 생각합니까? – Gleno

+0

@Gleno : 잘 모르겠지만, 계속 생각하겠습니다. –

6

은, 내가 생각하는의 awaiter 패턴에서 작동 is described best here, by Stephen Toub :

"언어가 올바른 방법 (예를 법 또는 확장 중 하나 방법) 노출 인스턴스를 기다리고 지원 : GetAwaiter 비동기 CTP, 작업의 GetAwait,이의 예를 들어 "

bool IsCompleted { get; } 
void OnCompleted(Action continuation); 
TResult GetResult(); // TResult can also be void 

:. 자체는 세 멤버를 노출하는 GetAwaiter는 유형을 반환해야 어 방법은 형 TaskAwaiter의 값을 반환 : 당신이 async의 모든 세부 사항을 원하는 경우, reading Jon Skeets posts about async을 시작

public struct TaskAwaiter 
{ 
    public bool IsCompleted { get; } 
    public void OnCompleted(Action continuation); 
    public void GetResult(); 
} 

. 주제에 대해 자세히 설명합니다. LINQ 패턴 당신이 언급으로 기반으로 수집 초기화 게다가


는, C#에서 다른 패턴을 기반으로 기능을 경우 : LINQ 키워드의 경우, 모든이 요구되는 오버로드 확인이 올바른와 인스턴스 또는 확장 방법을 발견하다 이름과 서명. Eric Lipperts article about the subject을 확인하십시오. 또한 foreach은 패턴 기반입니다. Eric은 링크 된 기사에서이 패턴에 대한 세부 정보도 설명합니다.

2

사용할 수있는 또 다른 패턴은 using 키워드입니다. 당신이 IDisposable를 구현하는 클래스가있는 경우 는 당신은 말할 수있다 : 나는 foreach 또는 쿼리보다 덜 "마법"입니다 가정 동안 유사한 무언가로 변환

using(Resource myResource = GetResource()) 
{ 
} 

Resource myResource; 
try 
{ 
    myResource = GetResource(); 
} 
finally 
{ 
    var disposable = myResource as IDisposable; 
    if(disposable != null) disposable.Dispose() 
} 

을 ::하기 연산자는 구문의 비교적 좋은 비트입니다.

마찬가지로 동일한 방법으로 yield return을 사용하면 자동으로 반복기를 구현할 수 있습니다.

public struct SimpleBitVector32 : IEnumerable<bool> 
{ 

    public SimpleBitVector32(uint value) 
    { 
     this.data = value; 
    } 

    private uint data; 
    public bool this[int offset] 
    { 
     get 
     { 
      unchecked 
      { 
       return (this.data & (1u << offset)) != 0; 
      } 
     } 
     set 
     { 
      unchecked 
      { 
       this.data = value ? (this.data | (1u << offset)) : (this.data & ~(1u << offset)); 
      } 
     } 
    } 

    public IEnumerator<bool> GetEnumerator() 
    { 
     for (int i = 0; i < 32; i++) 
     { 
      yield return this[i]; 
     } 
    } 


    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 
+0

+1! 어떤 이유로 든 내가 그것을 인정하고 싶지는 않지만, 당신은 마술과 같은 진술을 사용하여 돈을 벌고 있습니다. 나는 그것이 인터페이스 - make-it-kinda-less-magic 거래 때문에 생각한다. :) – Gleno

관련 문제