C # 확장 방법 및 사용

큰 숲 네트워크 기술을 찾기 위해 플랫폼, 사이트 구축, 소프트웨어 개발, 시스템 운영 및 유지 보수를, GPS!
http://cnsendnet.taobao.com
센 과학 기술 공식 블로그에서
http://www.cnsendblog.com/index.php/?p=476

확장 방법을 사용하면, 새로운 파생 된 유형을 만들어 다시 컴파일하거나 원래 형식을 수정하지 않고 기존의 유형과 방법을 "추가"할 수 있습니다. 확장 방법은 정적 방법의 특별한 종류이지만, 확장의 동일한 유형에서 인스턴스 메서드로 호출 할 수 있습니다. 다음은 확장 메서드의 MSDN 공식 웹 사이트 설명, 그리고 지금은 장면의 예에 의해이 행동을 설명해야한다. 다음과 주요있는 기능} {콘솔 프로그램 클래스 프로그램을 가정 해 봅시다 :

정적 무효 메인 (문자열 []에 args)
{
날짜 시간 = 현재 DateTime.Now;
현 시간 = now.ToString ( "YYYY-MM-DD HH : MM : SS");
Console.WriteLine (시간);
Console.ReadKey ();
}

: 가정하자 수요는 날짜의 표시 형식은 "YYYY-MM-DD는"형식은 물론 단지 시간 초기화 다음과 같은 문구로 쓸 수있다되고, 변경된
문자열 = now.ToString 시간 ( "YYYY-MM-DD" )
하지만 날짜 형식을 변경하려는 경우 같은 많은가? 각각은 다시 변경해야합니까? 이러한 요구하면 그들은 사람들의 의견이 너무 바빠서 변경합니다. 기존의 솔루션은 쓰기 방법, 전화를 걸고 다른 유형의 헬퍼 클래스를 포장하는 것입니다.
현재 프로젝트 DateHelper 클래스에 본 실시 형태의 모의 추가 공용 클래스는 클래스의 메소드 정의 DateHelper {} :
공공 정적 스트링 dateToString (날짜 시간 DT)
{
dt.ToString (이하 "MM-DD-YYYY HH : MM : SS")을 반환 ;
}
이와 같이 다시 원래의 주요 기능은 다음과 같다 :

정적 무효 메인 (문자열 []에 args)
{
날짜 시간 = 현재 DateTime.Now;
문자열 시간은 DateHelper.DateToString을 (지금) =;
Console.WriteLine (시간);
Console.ReadKey ();
}

요구 사항의 변경하면이 시점에서, 당신은 단지 라인에 DateToString () 메소드의 DateHelp 클래스를 다시 작성해야, 많은 클래스가이 메소드를 호출하는 방법에 상관없이이 영향을받습니다. 이 문제를 해결하지만,이 클래스가 다른 방법, 또는 약간의 문제를 전화, 직접 호출 그것으로 now.DateToString ()처럼 우리를 만들 수있는 방법이 없다? 물론, 마이크로 소프트는 날짜 시간은 확장 메서드로 연결, 그래서 우리는 당신이 원하는 인스턴스 메서드를 만들 수 없습니다, 변경할 수 없습니다, 기록됩니다.
다음은 소자 확장 방법 :
1. 상기 방법은 정적 방식이어야
이 방법은 정적 클래스에 배치해야 2.
이 방법의 첫 번째 파라미터가이 시작되어야 (3), 및이 방법의 유형을 지정하는 확장
이상의 요소는 우리가 DateHelper 클래스 정적 클래스를 변경 공용 정적 클래스 DateHelper {} dateToString 재기록 동안 () 메소드
공공 정적 스트링 dateToString (이 본 날짜 시간 DT)
{
dt.ToString (이하 "MM-DD-YYYY HH를 반환 : mm : SS ")
}
. 그 주요 기능은, 입력에있어서 되돌아 이때"현재 "알 수는 (자동 프롬프트 dateToString)에있어서, 상기 코드를 가질 이렇게 기록 될 수있다 :

정적 무효 메인 (문자열 []에 args)
{
날짜 시간 = 현재 DateTime.Now;
현 시간 = now.DateToString ();
Console.WriteLine (시간);
Console.ReadKey ();
}

분명히, 이것은 그것들을 사용하는 것이 더 편리 할 것입니다, 그래서 우리는 단지 자체가 매우 읽을 수있는 확장의 동일한 유형을 가지고 인스턴스 메서드 인 것처럼 살펴 보자. 다음은 확장 방법의 특징을 요약하면 :
유형으로부터 연장 1. 확장 방법,이를 사용할 수없는 다른 유형을 사용하는 변수의 타입이어야이 경우 날짜 시간 형으로부터 연장에서, 단지 입력 날짜 시간 중에 가변 할 수있다. (now.DateToString ())
에있어서의 파라미터가 아닌이 확장 방법 2. 뒤에 파라미터, 본 실시 예는 어떠한 파라미터는 후자가 입력 한 내용으로부터 연장 방법의 dt 날짜 시간에 지정된,없는
경우 3. 확장 방법 및 예 방법은 동일한 특성을 갖고, 우선 호출 인스턴스 방법
4. 상위 클래스에서 확장 방법은, 대상물에 직접 서브 클래스 사용될 수
5. 인터페이스 객체를 직접 구현 될 수있는 확장 클래스
6에있어서 최종 확장 나에 컴파일러 :이 경우 now.DateToString ()에서 정적 클래스 정적 방법은 (), 결국 본질이다 DateHelper.DateToString (현재)로 컴파일됩니다
사실, 우리가 발생할 수 이러한 시간의 계면에서 확장하는 방법으로서 시나리오 구현 인터페이스 방법은 새로운 확장을 달성해야하는 클래스 이미 모든 이러한 변경은 매우 인 작업의 피곤, 당신은 확장 메서드 "Quxianjiuguo"를 사용할 수 있습니다 때로는 우리가 변화하지 않으려는이 클래스의 클래스에 새로운 메소드를 추가하려면, 다음 확장 방법이 방법은 "의사 추가는"접근 방식의 가치를 반영의 . 가장 일반적인 방법은 LINQ 표준 쿼리 연산자 1024 점 찬양 승리해야 코드 농민이 편리하고 효율적인 방법의 광범위한 사용을 확장하는 것입니다.

확장 방법은 무엇입니까?
  확장 방법 그대로 확장하는 방법을 지칭하고, 객체 지향 프로그래밍 패턴이 대응 클래스를 확산하는 방법을 말한다. 우리의 일반적인 이해에 따르면, 우리는 먼저 클래스에 대한 확장 메서드를 제공하는 목적을 달성 할 수 그래서, 클래스의 소스 코드를 얻을, 다음 코드에서이 클래스 메소드의 구성원을 추가해야합니다. 그러나 불행하게도, 소스 코드에서이 방법을 사용하면 작업을 할 수없는 경우가 아니라, 우리는 전체 코드의 안정성을 훼손 할 가능성이 인위적으로 소스 코드를 변경했다. 그것의 전제의 소스 코드를 변경하지 않고 클래스를 확장 할 수있는 방법을 제공 할 수있는 방법이 있습니까? 이것은 우리가 오늘 말하고 싶은 확장 방법이다, 그래서 우리는 방법은 전제의 소스 코드를 변경하지 않고 외부로 확장 할 수있는 방법을 제공 이해하는 방법을 확장 할 수 있습니다. 구현하는 C #에서 확장 방법은 우리가 Unity3D 게임 개발에서와 같은, 그것은 DOTween이 플러그인을 사용할 수 있으며, 상대적으로 간단하다. 이 플러그인은 애니메이션 플러그인을 재 작성하는 저자의 ITween되고,의 ITween이 효율성보다 크게 개선되었다. 우리가 호출 할 때 이러한 API 인터페이스는 우리가 더 많은 Unity3D 기본 기능을 사용하여 같은 플러그인-A를 사용하고 있다고 생각하기 어려운 것과 같은 방법을 달성하기 위해 확장 방법을 사용하는 것이 더 중요한 점은 우리가 DOTween을 사용 그래서 때, + uGUI 마음이 아주 편안하게 느낄 것이다 조합, 일반적인 같은 장소에 모든 가을.
확장 메서드 특성은 무엇인가?
  확장 방법은 객체 지향 프로그래밍에서 구현 정상은 즉, 우리는 클래스를 정의하고 적절한 방법이 구현 될 수있다 추가 할 필요가 동일합니다. 그러나 여기서 주목해야 할 세 가지 지점이 어디 먼저, 구현 클래스의 확장 메서드는 클래스 달성하기위한 클래스와 정적 클래스 및 확장 메서드의 이름 독립적이어야합니다., 확장 메서드를 구현하는 클래스 메소드는 정적 메소드이어야 두 번째, 세 번째, 첫번째 파라미터 클래스 방법 확장 방법을 구현은 클래스의 팽창을 달성하기 위해 키워드 방법을 이용하여 지정한다. 예를 들어, 우리는 우리가 그것을 어떻게해야 문자열 유형에 대한 ToInt 방법을 확장 할 경우 합법적 인 문자열이 정수 형식으로 변환, 당신은, int.parse () 메서드를 사용하여 알아? 함께 우리는 다음과 같은 코드를 보면 :

  1. /// <요약>
  2. /// 1 정적 클래스의 정의
  3. /// 2 정적 클래스 명 연장 방법을 달성하기 위해 특정 클래스 독립적
  4. /// </ 요약>
  5. 공공 정적 클래스 SomeClass
  6. {
  7. /// <요약>
  8. /// 3 특정의 고정 방법을 달성
  9. /// </ 요약>
  10. 첫번째 매개 변수를 사용 /// <매개 변수 이름 = "STR">도 4는,이 키워드 확장 방법 </ PARAM>의 유형을 지정하는 데 사용되어야
  11. /// <리턴> </ 반품>
  12. 공공 정적의 INT의 ToInt (이 문자열 STR)
  13. {
  14. 창 int.Parse (STR);
  15. }
  16. }
    는 C #에서 지원하는 확장 메서드는 확장 메서드를 작성할 때, .NET3.5 버전으로 시작하는 것을 참고해야합니다 당신의 .NET 버전이 요구 사항을 충족합니다. 버전 언급, 특히 후, 많은 친구가 Unity5.0 Unity3D 친구로부터 배우기 시작, 메시지는 종종 내 코드 등 내 블로그에 유사 질문, 내가이 세상 생각, 새로운 환경에서 실행되지 않습니다 언급 업데이트가 의심 할 여지없이이었다 가장 빠른 IT 기술, 우리는 아무 문제,하지만 때로는 때문에 이러한 기술 개발과 Python2.7 Python3, Unity4.X 및 Unity5.X 등 역사 문제의 새로운 버전을 사용,이 때 버전 발생할 수 있습니다 호환성 문제, 네트워크상의 자원이 최신이 아닌 경우이 시간,이 고대의 격언을 참조하는 데 사용되는 네트워크 관련 블로거 기사 또는 책을 보인다 때문에, 적시에 공식 날짜 문서를 체크 아웃하는 것이 좋습니다 : 할 편지 책은 어떤 책으로 만 객관적으로 냉정하게 올바른 지식을 결정하거나, 우리는 정말 유용한 지식을 배울 수 없습니다.
      자, 이제 우리는이 확장 메서드를 작성 완료 한 후, 다음과 같은 확장 방법을 사용할 수 있습니다 :
  17. 문자열 STR = "1234";
  18. INT 발 = str.ToInt ();
    우리가 그것을 할 수있는 방법을 확장 메서드에 매개 변수를 전달해야 할 때이 예 그래서, 어떻게 인수와 확장 메서드를 작성하는 방법을 보여? 우리는 첫 번째 인수의 충분한 후 성명에서 매개 변수를 계속 추가 할 필요가있다. 예를 들어, 우리는 종종 우리는 다음과 같은 코드에 의해 구현 될 수있다 일반적으로 Unity3D에 배치 된 3D 오브젝트 조정해야합니다
    transform.position Vector3 새로운 새 = (1,1,1);
    이 코드는 지금까지 비교적 간단하지만 Unity3D는 우리의 코드를 다시 계산 좌표에 관련된 경우 위치 속성에 추가 localPosition 속성, 나는 코드가 매우 긴 될 것이라고이 믿는 것을 알고있다. 무엇보다, 가끔 우리는 단지 3 차원 좌표의 치수를 변경하려면,하지만 우리는 코드가 더 길어질 수 이번에는 3 차원 좌표 transform.position, 당연한를 제공해야합니다. 이 문제를 해결하기 위해, 세 가지 방법을 확장 할 수 SetPositionX, SetPositionY, SetPositionZ 각각 X, Y, 세 부품 할당 Z 좌표, 우리는이 방법 SomeClass 클래스 추가 계속 :
  19. /// <요약>
  20. ///는 X 좌표가 설정 Tranform
  21. /// </ 요약>
  22. /// <PARAM NAME = "트란"> 当前 변환 </ PARAM>
  23. /// <PARAM NAME = "X"> X 坐标 </ PARAM>
  24. 공공 정적 무효 SetPositionX (이 변형 트란, 플로트 X)
  25. {
  26. tran.position 새로운 Vector3 = (X, tran.position.y, tran.position.z);
  27. }
  28. /// <요약>
  29. ///은 Y가 Tranform 좌표 집합
  30. /// </ 요약>
  31. /// <PARAM NAME = "트란"> 当前 변환 </ PARAM>
  32. /// <매개 변수 이름 = "X"> Y 坐标 </ PARAM>
  33. 공공 정적 무효 SetPositionY (이 변형 트란, 플로트 Y)
  34. {
  35. tran.position 새로운 Vector3 (tran.position.x, Y를 tran.position.z) =;
  36. }
  37. /// <요약>
  38. ///는 Z 좌표가 설정 Tranform
  39. /// </ 요약>
  40. /// <PARAM NAME = "트란"> 当前 변환 </ PARAM>
  41. /// <매개 변수 이름 = "X"> Z 坐标 </ PARAM>
  42. 공공 정적 무효 SetPositionZ (이 변형 트란, 플로트 z)
  43. {
  44. tran.position 새로운 Vector3 (tran.position.x, tran.position.y, Z가) =;
  45. }
    의 확장 방법의 장단점을 사용하여
      우리가 여기 그래서 낮은 확장 방법을 사용의 장단점을 논의하기 위해, 사용에 편리한 확장 방법. 물론, 비주얼 스튜디오 스마트 팁에 클래스와 확장 방법을 확장 할 수있는 무료 및 고의 사용을 확장 방법의 장점은 파란색 아래쪽 화살표로 식별됩니다. 단점 확장 방법은 나는 종종 언리얼 Engine4 게임에 그룹에 Unity3D 게임 엔진 경멸 사람들을 듣고, 더 나은 당신은, 사실, 모든 기술이 동일이 기능을 관리 할 수있는 확장 메서드 사람의 디자인을 살펴 보는 것입니다 러시 모어 산 엔진의 세계, 내가 UE4 좋은 사진 효과를 인정하지만, 정말이 엔진을 잘 활용을 할 수 있습니다, 얼마나 많은 사람들이 있습니까? 인 근접성의 원칙, 가장 작은 범위의 확장 방법의 사용을 따라야 확장 방법을 사용하는 경우, 확장 메서드는 특정 클래스가 아닌 추상 클래스를 달성했다. 우리가이 전체 코드로, 논리적 추상화 계층을 변경할 필요가 없습니다 그래서 우리는 그것을 논리적 수준에서 이러한 기능을 필요로 간단하기 때문에 확장 방법을 사용하여 "오염." 간단한 예를 들자면, 우리는 우리가 클래스를 확장하는 경우, "오염"원인이이 모든 객체의 클래스로부터 상속 한 영향을 미칠 것이다 의심의 여지가 분명 바람직하지 거기, 즉 .NET 기본 클래스는 객체 알고 가.
    요약
    • C #에서 구현 클래스의 확장 메서드는 정적 클래스와 클래스 이름과 확장 메서드 클래스의 실현 아무 상관이 없습니다해야
    정적 방법이어야 방법의 구현을 확장 할 수 • 수업 방법
    첫 번째 매개 변수 • 구현 클래스 방법 확장 방법이어야합니다 클래스가 확장 메서드 구현 지정하려면이 키워드를 사용하여
    , 근접의 원칙을 준수해야한다 확장 메소드를 구현 •를 "오염"을 방지하기 위해 최소한의 범위 확장 방법을 사용

큰 숲 네트워크 기술을 찾기 위해 플랫폼, 사이트 구축, 소프트웨어 개발, 시스템 운영 및 유지 보수를, GPS!
http://cnsendnet.taobao.com
센 과학 기술 공식 블로그에서
http://www.cnsendblog.com/index.php/?p=476

추천

출처blog.51cto.com/14036626/2482943