C\#4.0 의 새로운 기능 인'결 성 된 매개 변수'의 실현 에 대한 상세 한 설명
C\#4.0 결 성 된 매개 변수의 새로운 특성 에 대해 모두 가 낯 설 지 않 을 것 이 라 고 믿 습 니 다.결 성 된 매개 변수 란 말 그대로 성명 방법의 특정한 매개 변 수 를 지정 할 때 기본 값 을 지정 하 는 것 입 니 다.이 방법 을 호출 할 때 이 기본 값 을 사용 하면 이 매개 변 수 를 지정 할 필요 가 없습니다.많은 언어 차원 의 특성(문법 사탕)의 실현 과 마찬가지 로 부족 한 매개 변수 도 컴 파일 러 가 우 리 를 위해 하 는 작은 방법 이다.결 성 된 매개 변 수 는 최종 적 으로 두 개의 특수 한 사용자 정의 특성 인 OptionalAttribute 와 Default ParameterValueAttribute 로 나타 납 니 다.
목차
4.567917.1.매개 변수 가 부족 한 용법
예 를 들 어 다음 TestMethod 방법 은 다음 두 개의 매개 변수 bar 와 baz 가 부족 한 매개 변수 이 고 기본 값 은 각각'Bar'와'Baz'이다.
1: static void TestMethod(string foo, string bar = "Bar", string baz = "Baz")
2: {
3: Console.WriteLine("{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
4: }
TestMethod 를 호출 할 때,우 리 는 부족 한 매개 변수 값 을 자 유 롭 게 선택 하거나,부족 한 값 을 덮어 씁 니 다.
1: static void Main(string[] args)
2: {
3: TestMethod("Foo");
4: TestMethod("Foo", "Bar1");
5: TestMethod("Foo", "Bar1", "Baz1");
6: }
다음은 출력 결과:1: Foo - Bar - Baz
2: Foo - Bar1 - Baz
3: Foo - Bar1 - Baz1
결 성 된 매개 변수 에 대한 사용 은 두 가지 간단 한 제한 이 있 습 니 다.하 나 는 결 성 된 매개 변수 에 대한 성명 은 일반 매개 변수 뒤에 만 놓 을 수 있 습 니 다.다음 코드 에서 정 의 된 TestMethod 방법 에서 결 성 된 매개 변수 bar 뒤에 결 성 된 매개 변수 baz 가 있 습 니 다.이러한 코드 는 컴 파일 을 통 해 컴 파일 할 수 없습니다.(컴 파일 오류 정 보 는 optional parameters must appeared after all required parameters)
1: static void TestMethod(string foo, string bar = "Bar", string baz)
2: {
3: Console.WriteLine("{0, -5} - {1, -5} - {2, -5}", foo, bar, baz);
4: }
그러나 결 성 된 매개 변 수 는 배열 매개 변수(params 매개 변수)와 함께 할 수 있 습 니 다.실제로 어떤 상황 에서 도 params 매개 변 수 는 마지막 성명 의 매개 변수 일 수 있 습 니 다.결 성 된 매개 변수 에 대한 성명 의 위치 제한,주요 재 업로드 방법의 식별 체제 가 결정 한 다 는 점 은 모두 가 쉽게 이해 할 수 있다.결 성 된 매개 변수 에 대한 또 다른 제한 은 지정 한 결 성 값 은 상수 여야 한 다 는 것 이다.이것 은 실제 적 으로 결 성 된 매개 변수 로 서 의 데이터 유형 에 제한 을 두 었 다―시스템 이 정의 하 는 기본 유형 일 수 밖 에 없다.아래 에 정 의 된 TestMethod 방법 에서 저 희 는 DateTime 형식의 부족 한 매개 변 수 를 정의 하고 매개 변수 부족 값 을 DateTime.Now 로 정의 합 니 다.DateTime.Now 는 상수 가 아니 기 때문에 이러한 코드 도 컴 파일 을 통 해 컴 파일 할 수 없습니다.(오류 메시지 컴 파일:Default parameter value for'date'must be a copile-time constant)
1: static void TestMethod(DateTime date = DateTime.Now)
2: {
3: //Others...
4: }
2.결 성 된 매개 변 수 를 실현 하 는 두 가지 특성:OptionalAttribute 와 DefaultParameterValueAttribute왜 부족 한 매개 변수의 기본 값 은 상수 만 받 아들 일 수 있 습 니까?만약 네가 결 성 된 매개 변수의 본질 을 이해 했다 면,이것 은 문제 가 아니다.그렇다면 결 성 된 매개 변 수 는 어떻게 이 루어 졌 을 까?
많은 언어 차원 의 특성(문법 사탕)의 실현 과 마찬가지 로 부족 한 매개 변 수 는 컴 파일 러 가 우 리 를 위해 하 는 작은 방법 이 고 진정 으로 컴 파일 된 것 은 우리 가 더 이상 알 수 없 는 것 이다.결 성 된 파 라 메 터 를 포함 하 는 C\#코드 가 컴 파일 된 후에 결 성 된 파 라 메 터 는 두 개의 특수 한 사용자 정의 특성 인 OptionalAttribute 와 Default ParameterValueAttribute 에 나타 납 니 다.전 자 는 매개 변 수 를 결 성 된 매개 변수 로 표시 하고 후 자 는 결 성 된 값 을 지정 한다.
1: [ComVisible(true), AttributeUsage(AttributeTargets.Parameter, Inherited=false)]
2: public sealed class OptionalAttribute : Attribute
3: {
4: }
5:
6: [AttributeUsage(AttributeTargets.Parameter)]
7: public sealed class DefaultParameterValueAttribute : Attribute
8: {
9: public DefaultParameterValueAttribute(object value);
10: public object Value {get; }
11: }
처음에 우리 가 정의 한 TestMethod 방법 에 대해 컴 파일 된 형식 은 다음 과 같다.
1: private static void TestMethod(string foo,
2: [Optional, DefaultParameterValue("Bar")] string bar,
3: [Optional, DefaultParameterValue("Baz")] string baz)
4: {
5: //Others..
6: }
매개 변수 가 부족 한 기본 값 은 결국 Default ParameterValueAttribute 의 매개 변수 로 존재 하기 때문에 상수 여야 합 니 다.3.optionalAttribute 와 DefaultParameterValueAttribute 를 통 해 결 성 된 매개 변 수 를 직접 정의 합 니 다.
결 성 된 매개 변 수 는 최종 적 으로 OptionalAttribute 와 Default Parameter ValueAttribute 라 는 두 가지 특성 으로 나타 나 는데 우 리 는 이 를 통 해 결 성 된 매개 변 수 를 직접 정의 할 수 있 습 니까?정 답 은 물론 입 니 다.아래 코드 처럼 정상적으로 실 행 될 수 있 습 니 다.
1: static void Main(string[] args)
2: {
3: TestMethod("Foo");
4: TestMethod("Foo","Bar1");
5: TestMethod("Foo","Bar1","Baz1");
6: }
7:
8: private static void TestMethod(string foo,
9: [Optional, DefaultParameterValue("Bar")] string bar,
10: [Optional, DefaultParameterValue("Baz")] string baz)
11: {
12: //Others..
13: }
결 성 된 매개 변 수 를 포함 하 는 방법 을 호출 하고 지정 한 매개 변 수 를 표시 하지 않 으 면 컴 파일 러 는 컴 파일 할 때 기본 값 을 자동 으로 추가 합 니 다.위의 Main 방법 에 대해 아래 는 이와 같은 효 과 를 가 진 컴 파일 후 코드 입 니 다.
1: private static void Main(string[] args)
2: {
3: TestMethod("Foo", "Bar", "Baz");
4: TestMethod("Foo", "Bar1", "Baz");
5: TestMethod("Foo", "Bar1", "Baz1");
6: }
optionalAttribute 와 Default Parameter ValueAttribute 라 는 두 가지 특성 을 통 해 결 성 된 파 라 메 터 를 정의 할 수 있 지만,결 성 된 파 라 메 터 를 일반 매개 변수 로 정의 하기 전에 컴 파일 러 가 잘못 보고 하지 않 습 니 다.오히려 방법 에 부족 한 매개 변 수 는 사실상 일반 매개 변수 에 해당 한다.
1: static void Main(string[] args)
2: {
3: //TestMethod("Foo","Baz");
4: //
5: TestMethod("Foo","Bar1","Baz1");
6: }
7: private static void TestMethod(string foo,
8: [Optional, DefaultParameterValue("Bar")] string bar,
9: string baz)
10: {
11: //Others..
12: }
총결산C\#4.0 의 새로운 기능 인'결 성 된 매개 변수'의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#4.0 의 새로운 기능 인'결 성 된 매개 변수'내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!