제네릭 2에서 계속
20.4 일반 대리자 선언
대리자 선언에는 유형 매개변수가 포함될 수 있습니다.
대리자 선언:
속성 opt 대리자 수정자 op t 대리자 반환 유형 식별자 유형 매개변수 목록 선택
(공식 매개변수 목록 선택) 유형 매개변수 제약 조건-절 선택 ;
(대리자 선언: 속성 선택적 대리자 수정자 선택적 대리자 반환 유형 식별자 유형 매개변수 목록 선택적(형식 매개변수 목록 선택적) 유형 매개변수 제약 조건문 선택적
유형 매개변수를 사용하여 선언된 대리자는 일반 대리자 선언입니다. 대리자 선언 형식 매개 변수 목록을 지원하는 경우에만 형식 매개 변수 제약 조건 문(§20.7)을 지원할 수 있습니다. 명시된 경우를 제외하고 일반 대리자 선언은 일반 대리자 선언과 동일한 규칙을 따릅니다. (§3.3) 대리자 선언의 형식 매개 변수 범위에는 반환 형식, 형식 매개 변수 목록 및 형식 매개 변수 제약 조건 문이 포함됩니다.
다른 일반 형식 선언과 마찬가지로 형식 인수도 있습니다. 생성된 대리자 형식을 형성하려면 생성된 대리자 형식의 매개 변수 및 반환 값이 대리자 선언의 생성된 대리자 형식의 각 형식 매개 변수에 해당하는 실제 매개 변수로 대체됩니다. 생성된 대리자 유형과 호환되는 메서드를 결정하는 데 사용됩니다. 예를 들어
delegate bool Predicate<T>(T value) class X { static bool F(int i){…} static bool G(string s){…} static void Main(){ Predicate<int> p1 = F; Predicate<string> p2=G; } }
이전 Main 메서드의 두 할당은 아래의 더 긴 형식과 동일합니다. .
static void Main(){ Predicate<int> p1 = new Predicate<int>(F); Predicate<string> p2 = new Predicate<string>(G); }
§21.9에 설명된 메소드 그룹 변환으로 인해 더 짧은 형식도 가능합니다. 🎜>20.5 생성된 유형
구성된 유형은 표현식에서도 사용할 수 있습니다. 간단한 이름(§20.9.3) 또는 멤버에 액세스(§20.9.4) >
type-name:(类型名字:) namespace-or-type-name(命名空间或类型名字) namespace-or-type-name:(命名空间或类型名字:) identifier type-argument-list(标识符类型实参列表可选) namespace-or-type-name. identifier(命名空间或类型名字.标识符) type-argument-list opt(类型实参列表可选)
유형 이름은 유형 매개변수를 직접 지정하지 않더라도 생성된 유형을 식별할 수 있습니다. 이 상황은 유형이 일반 클래스 선언 내에 중첩되어 있고 선언이 포함된 인스턴스 유형이 이름 조회(§20.1.2)로 인해 암시적으로 사용될 때 발생합니다.
namespace System.Collections { class Queue{…} } namespace Sysetm.Collections.Generic { class Queue<ElementType>{…} } namespace MyApplication { using System.Collections; using System.Collections.Generic; class X { Queue q1; //System.Collections.Queue Queue<int> q2;//System.Collections.Generic.Queue } }
20.5.1 유형 인수
유형 매개변수 목록의 각 실제 매개변수는 단지 유형일 뿐입니다.
class Outer<T> { public class Inner{…} public Inner i; //i的类型是Outer<T>.Inner }
20.5.2开放和封闭类型
所有类型都可以被分为开放类型(open type)或封闭类型(closed type)。开放类型是包含类型参数的类型。更明确的说法是
类型参数定义了一个开放类型
数组类型只有当其元素是一个开放类型时才是开放类型
构造类型只有当其类型实参中的一个或多个是开放类型时,它才是开放类型
非开放类型都是封闭类型。
在运行时,在泛型类型声明中的所有代码都在一个封闭构造类型的上下文执行,这个封闭构造类型是通过将类型实参应用到泛型声明中创建的。在泛型类型中的每个类型实参被绑定到一个特定运行时类型。所有语句和表达式的运行时处理总是针对封闭类型发生,而开放类型只发生在编译时处理。
每个封闭构造类型都有它自己的一组静态变量,它们并不被其他封闭类型共享。因为在运行时不存在开放类型,所以开放类型没有关联的静态变量。如果两个封闭构造类型是从同一个类型声明构造的,并且对应的类型实参也是相同的类型,那么它们就是相同的类型。
20.5.3构造类型的基类和接口
构造类类型有一个直接基类,就像是一个简单类类型。如果泛型类声明没有指定基类,其基类为object。如果基类在泛型类声明中被指定,构造类型的基类通过将在基类声明中的每个类型参数,替代为构造类型对应类型实参而得到。给定泛型类声明
class B<U , V>{…} class G<T>:B<string , T[]>{…}
构造类型G
相似地,构造类、结构和接口类型有一组显式的基接口。显式基接口通过接受泛型类型声明中的显式基接口声明和某种替代而形成,这种替代是将在基接口声明中的每个类型参数,替代为构造类型的对应类型实参。
一个类型的所有基类和基接口通过递归地得到中间基类和接口的基类与接口而形成。例如,给定泛型类声明
class A {…} class B<T>:A{…} class C<T>:B<IComparable<T>>{…} class D<T>:C<T[]>{…} D<int>的基类是C<int[]>,B<IComparable<int[]>>,A和object。
20.5.4构造类型的成员
构造类型的非继承成员通过替代成员声明的类型实参,构造类型的对应类型实参而得到。
例如,给定泛型类声明
class Gen<T,U> { public T[,],a; public void G(int i ,T t , Gen<U, T> gt){…} public U Prop(get{…}) set{…}} public int H{double d}{…} }
构造类型Gen
public int[,][] a; public void G(int I , int[] t , Gen<IComparable<string>,int[] gt>){…} public IComparable<string> Prop{get{…} set{…}} public int H(double d){…}
注意替代处理是基于类型声明的语义意义的,并不是简单的基于文本的替代。在泛型类声明Gen中的成员a的类型是“T的二维数组” 因此在先前实例化类型中的成员a的类型是“int型的一维数组的二维数组”或int[,][]。
构造类型的继承成员以一种相似的方法得到。首先直接基类的所有成员是已经确定的。如果基类自身是构造类型这可能包括当前规则的递归应用。然后,继承成员的每一个通过将成员声明中的每个类型参数,替代为构造类型对应类型实参而被转换。
class B<U> { public U F(long index){…} } class D<T>:B<T[]> { public T G(string s){…} }
在先前的例子中,构造类型D
20.5.5构造类型的可访问性
当构造类型C
20.5.6转换
构造类型遵循与非泛型类型相同的规则(§6)。当应用这些规则时,构造类型的基类和接口必须按§20.5.3中所描述的方式确定。
除了那些在§6中所描述的之外,构造引用类型之间不存在特别的转换。尤其是,不像数组类型,构造引用类型不允许“co-variant”转换。也就是说,类型List不能转换到类型List(无论是隐式或显式)即使是B派生于A也是如此。同样,也不存在从List到List
class A {…} class B:A{…} class Colletion{…} class List<T>:Collection{…} class Test { void F() { List<A> listA = new List<A>(); List<B> listB= new List<B>(); Collection c1 = listA; //OK,List<A>是一个集合 Collection c2 = listB; //OK,List<B>是一个集合 List<A> a1 = listB; //错误,没有隐式的转换 List<A> a2 = (List<A>)listB; //错误,没有显式的转换 } }
20.5.7System.Nullable
在.NET基类库中定义了泛型结构类型System.Nullable
可以从一个null类型向任何由System.Nullable
Nullable<int> x = null; Nullable<string> y = null;
和下面的写法相同。
Nullable<int> x = Nullable<int>.default; Nullable<string> y = Nullable<string>.default;
20.5.8使用别名指令
使用别名可以命名一个封闭构造类型,但不能命名一个没有提供类型实参的泛型类型声明。例如
namespace N1 { class A<T> { class B{} } class C{} } namespace N2 { using W = N1.A; //错误,不能命名泛型类型 using X = N1.A.B; //错误,不能命名泛型类型 using Y = N1.A<int>; //ok,可以命名封闭构造类型 using Z = N1.C; //ok }
20.5.9特性
开放类型不能被用于特性内的任何地方。一个封闭构造类型可以被用作特性的实参,但不能被用作特性名,因为System.Attribute不可能是泛型类声明的基类。
class A:Attribute { public A(Type t){…} } class B<T>: Attribute{} //错误,不能将Attribute用作基类 class List<T> { [A(typeof(T))] T t; //错误,在特性中有开放类型 } class X { [A(typeof(List<int>))] int x; //ok,封闭构造类型 [B<int>] int y; //错误,无效的特性名字 }
以上就是C# 2.0 Specification (泛型三)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

C#.netissuitable forenterprise-levelapplications는 richlibraries, androbustperformance, 그러나 itmaynotbeidealforcross-platformdevelopmentorwhenrawspeediscritical, wherelanguagesslikerustorthightordogrordogrognegrognegrognegrognecross-platformdevelopmentor.

.NET에서 C#의 프로그래밍 프로세스에는 다음 단계가 포함됩니다. 1) C# 코드 작성, 2) 중간 언어 (IL)로 컴파일하고 .NET 런타임 (CLR)에 의해 실행됩니다. .NET에서 C#의 장점은 현대적인 구문, 강력한 유형 시스템 및 .NET 프레임 워크와의 긴밀한 통합으로 데스크탑 응용 프로그램에서 웹 서비스에 이르기까지 다양한 개발 시나리오에 적합합니다.

C#은 Microsoft가 개발 한 최신 객체 지향 프로그래밍 언어이며 .NET 프레임 워크의 일부로 개발되었습니다. 1.C#은 캡슐화, 상속 및 다형성을 포함한 객체 지향 프로그래밍 (OOP)을 지원합니다. 2. C#의 비동기 프로그래밍은 응용 프로그램 응답 성을 향상시키기 위해 비동기 및 키워드를 기다리는 키워드를 통해 구현됩니다. 3. LINQ를 사용하여 데이터 컬렉션을 간결하게 처리하십시오. 4. 일반적인 오류에는 NULL 참조 예외 및 인덱스 외 예외가 포함됩니다. 디버깅 기술에는 디버거 사용 및 예외 처리가 포함됩니다. 5. 성능 최적화에는 StringBuilder 사용 및 불필요한 포장 및 Unboxing을 피하는 것이 포함됩니다.

C#.NET 애플리케이션에 대한 테스트 전략에는 단위 테스트, 통합 테스트 및 엔드 투 엔드 테스트가 포함됩니다. 1. 단위 테스트를 통해 MSTEST, NUNIT 또는 XUNIT 프레임 워크를 사용하여 코드의 최소 단위가 독립적으로 작동합니다. 2. 통합 테스트는 일반적으로 사용되는 시뮬레이션 된 데이터 및 외부 서비스를 결합한 여러 장치의 기능을 확인합니다. 3. 엔드 투 엔드 테스트는 사용자의 완전한 작동 프로세스를 시뮬레이션하며 셀레늄은 일반적으로 자동 테스트에 사용됩니다.

C# 수석 개발자와의 인터뷰에는 비동기 프로그래밍, LINQ 및 .NET 프레임 워크의 내부 작업 원리와 같은 핵심 지식을 마스터하는 것이 필요합니다. 1. 비동기 프로그래밍은 비동기를 통해 작업을 단순화하고 응용 프로그램 응답 성을 향상시키기 위해 기다리고 있습니다. 2.linq는 SQL 스타일로 데이터를 운영하고 성능에주의를 기울입니다. 3. Net Framework의 CLR은 메모리를 관리하며 가비지 컬렉션은주의해서 사용해야합니다.

C#.NET 인터뷰 질문 및 답변에는 기본 지식, 핵심 개념 및 고급 사용이 포함됩니다. 1) 기본 지식 : C#은 Microsoft가 개발 한 객체 지향 언어이며 주로 .NET 프레임 워크에 사용됩니다. 2) 핵심 개념 : 위임 및 이벤트는 동적 바인딩 방법을 허용하고 LINQ는 강력한 쿼리 기능을 제공합니다. 3) 고급 사용 : 비동기 프로그래밍은 응답 성을 향상시키고 표현 트리는 동적 코드 구성에 사용됩니다.

C#.net은 강력한 생태계와 풍부한 지원으로 인해 마이크로 서비스를 구축하는 데 인기있는 선택입니다. 1) ASP.NETCORE를 사용하여 RESTFULAPI를 작성하여 주문 생성 및 쿼리를 처리하십시오. 2) GRPC를 사용하여 마이크로 서비스 간의 효율적인 통신을 달성하고 주문 서비스를 정의하고 구현하십시오. 3) Docker Containerized 마이크로 서비스를 통해 배포 및 관리를 단순화합니다.

C# 및 .NET의 보안 모범 사례에는 입력 확인, 출력 인코딩, 예외 처리, 인증 및 인증이 포함됩니다. 1) 일반 표현식 또는 내장 방법을 사용하여 악성 데이터가 시스템에 들어가는 것을 방지하기 위해 입력을 확인하십시오. 2) XSS 공격을 방지하기 위해 출력 인코딩 httputility.htmlencode 메서드를 사용하십시오. 3) 예외 처리는 정보 유출을 피하고 오류를 기록하지만 자세한 정보를 사용자에게 반환하지는 않습니다. 4) ASP.NETIDENITY 및 CAMPLES 기반 승인을 사용하여 신청서를 무단 액세스로부터 보호합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.
