c#v2.0 扩展特性 翻译(2)

翻译 2004年07月22日 11:11:00

 Generic type instantiations

范型实例化

Similar to a non-generic type, the compiled representation of a generic type is intermediate language (IL) instructions and metadata. The representation of the generic type of course also encodes the existence and use of type parameters.

和非泛型类似,泛型被编译后表示成中间代码指令和元数据。泛型的表示当然也是将已有的和使用的类型参数编码

 

The first time an application creates an instance of a constructed generic type, such as Stack<int>, the just-in-time (JIT) compiler of the .NET Common Language Runtime converts the generic IL and metadata to native code, substituting actual types for type parameters in the process. Subsequent references to that constructed generic type then use the same native code. The process of creating a specific constructed type from a generic type is known as a generic type instantiation.

当应用程序第一次创建一个新的被构造的泛型,例如Stack<int>.Net公共运行时的JIT将泛型的中间代码和元数据转化成本地代码,在进程中用真实类型取代类型参数。后来引用已经被构建的泛型就运行本地代码。根据指定的构建类型来创建泛型被称作泛型的实例化。

 

The .NET Common Language Runtime creates a specialized copy of the native code for each generic type instantiation with a value type, but shares a single copy of the native code for all reference types (since, at the native code level, references are just pointers with the same representation).

.Net 公共语言运行时为每个值类型的泛型创建一个专门的本地代码拷贝。但会为所有引用类型共享一个单独的本地代码拷贝。(因为,在本地代码层次,引用和指针就是同一表示)

 

19.1.2 Constraints

约束

 

Commonly, a generic class will do more than just store data based on a type parameter. Often, the generic class will want to invoke methods on objects whose type is given by a type parameter. For example, an Add method in a Dictionary<K,V> class might need to compare keys using a CompareTo method:

一般来说,一个泛型类不仅可以存储建立在类型参数上的数据,还能做更多。通常,泛型类会尝试调用被指定类型对象上的方法。举例说,在Dictionary<K,V>类中一个Add方法可能需要通过CompareTo方法比较关键字。

public class Dictionary<K,V>
{
public void Add(K key, V value)
{
     ...

     if (key.CompareTo(x) < 0) {...}    // Error, no CompareTo method
     ...
}
}

Since the type argument specified for K could be any type, the only members that can be assumed to exist on the key parameter are those declared by type object, such as Equals, GetHashCode, and ToString; a compile-time error therefore occurs in the example above. It is of course possible to cast the key parameter to a type that contains a CompareTo method. For example, the key parameter could be cast to IComparable:

然而类型参数K可能是任何类型,被假定存在于Key参数的唯一成员变量是那些object类型所声明的,比如说 EqualGetHashCodeToString ;上面的代码将引发一个编译时错误。当然也可以把Key

参数转化成一个包含CompareTo方法的类型。例如,Key参数可能被转化成支持IComparable接口

public class Dictionary<K,V>
{
public void Add(K key, V value)
{
     ...

     if (((IComparable)key).CompareTo(x) < 0) {...}
     ...
}
}

While this solution works, it requires a dynamic type check at run-time, which adds overhead. It furthermore defers error reporting to run-time, throwing an InvalidCastException if a key doesn’t implement IComparable.

当以上解决方案运行时,加在上面的代码要求进行一个运行时的动态类型检查。而且它在运行时才报告错误,并在当key不支持IComparable接口时会抛出一个InvalidCastException.

 

To provide stronger compile-time type checking and reduce type casts, C# permits an optional list of constraints to be supplied for each type parameter. A type parameter constraint specifies a requirement that a type must fulfill in order to be used as an argument for that type parameter. Constraints are declared using the word where, followed by the name of a type parameter, followed by a list of class or interface types, or the constructor constraint new().

为了提供更强的编译时类型检查和减少类型转换,C#允许一个可选择的约束列表去提供给每一个类型参数。作为一个类型参数约束的要求,一个类型参数约束指定一个必须完全履行的类型。约束通过关键字where声明,后面跟上类型参数的名字,再跟上一串类或接口,或是一个约束构造器new()

In order for the Dictionary<K,V> class to ensure that keys always implement IComparable, the class declaration can specify a constraint for the type parameter K:

为了保证Dictionary<K,V>类的Key支持IComparable接口,类的声明指定一个类型参数的约束。

 

public class Dictionary<K,V> where K: IComparable
{
public void Add(K key, V value)
{
     ...

     if (key.CompareTo(x) < 0) {...}
     ...
}
}

Given this declaration the compiler will ensure that any type argument supplied for K is a type that implements IComparable. Furthermore, it is no longer necessary to explicitly cast the key parameter to IComparable before calling the CompareTo method; all members of a type given as a constraint for a type parameter are directly available on values of that type parameter type.

指定以后,编译器将确保任何提供给K的类型参数必须支持IComparable接口。而且,在调用CompareTo 方法前,它不再需要显式的把Key参数转化支持IComparable接口。被一个类型参数的约束所给定的所有成员在类型值上直接可见

 

For a given type parameter, it is possible to specify any number of interfaces as constraints, but no more than one class. Each constrained type parameter has a separate where clause. In the example below, the type parameter K has two interface constraints, while the type parameter E has a class constraint and a constructor constraint:

作为一个给定的类型参数,但对一个类可能会指定任何数量的接口作为约束。每种约束类型参数有一个Where子句分隔。在下面的例子里,类型参数K有两个接口约束,然而类型参数E有一个类约束和一个构建约束。

public class EntityTable<K,E>
where K: IComparable<K>, IPersistable
where E: Entity, new()
{
public void Add(K key, E entity)
{
     ...

     if (key.CompareTo(x) < 0) {...}
     ...
}
}

The constructor constraint, new(), in the example above ensures that a type used as a type argument for E has a public, parameterless constructor, and it permits the generic class to use new E() to create instances of that type.

上面例子中的构建约束new(),确保作为类型参数E的类型有一个公共的,无参数的构建函数,且它允许泛型类 使用 new E() 去创建该类型的实例。

 

Type parameter constrains should be used with care. While they provide stronger compile-time type checking and in some cases improve performance, they also restrict the possible uses of a generic type. For example, a generic class List<T> might constrain T to implement IComparable such that the list’s Sort method can compare items. However, doing so would preclude use of List<T> for types that don’t implement IComparable, even if the Sort method is never actually called in those cases.

类型参数约束应该小心使用。他们提供更强的编译时类型检查并能在某些例子来提高性能,也能约束泛型的使用可能性。举例说,一个List<T>泛型可能会约束T实现IComparable接口,这样ListSort方法就可以比较项目。然而,这将使不支持IComparable接口的类型不能使用List<T>,即使Sort方法没有在案例中被调用。

扩展VLAN特性与管理——3

QinQ映射配置与管理 QinQ映射功能可以将用户的VLAN标签映射为指定的VLAN标签,从而起到屏蔽不同用户VLAN标签的作用。但QinQ映射功能只能在子接口上应用,通过QinQ映射功能,子接口在向...
  • kaoa000
  • kaoa000
  • 2017年07月07日 13:25
  • 221

给Mac系统浏览器扩展翻译功能

Google Chrome可以即时翻译网页。可是,如果你用惯了Safari,不想安装Google Chrome,又需要对外文网页即时翻译,那么,请看下面: 前提:先打开Safari,点击“显示-显示个...
  • u010070526
  • u010070526
  • 2015年07月08日 14:16
  • 1552

扩展VLAN特性与管理——2

QinQ基础 前面介绍的VLAN都是单层标签的,也就是在数据帧中只有一个802.1Q标签头,QinQ(是802.1Q-in-802.1Q的简称)技术是一项可在数据帧中的原802.1Q标签头基础上再增加...
  • kaoa000
  • kaoa000
  • 2017年06月29日 09:53
  • 259

RMI--原理及实现浅析

转载自:http://blog.csdn.net/qb2049_xg/article/details/3278672 转载自:http://www.blogjava.net/yeshucheng/ar...
  • szzt_lingpeng
  • szzt_lingpeng
  • 2016年04月11日 09:08
  • 546

扩展VLAN特性与管理——1

扩展VLAN特性是为了解决在普通VLAN应用过程中出现的一些问题而开发的。如VLAN聚合是为了解决普通VLAN间通信必须使每个VLAN位于不同的IP子网,必须为每个VLAN配置VLANIF接口并分配I...
  • kaoa000
  • kaoa000
  • 2017年06月23日 12:30
  • 409

V4L2文档翻译(四)

扩展控制 介绍 控制机制原本是用于用户设置(如亮度,饱和度等)。但无论如何,它恰恰证明了对于复杂驱动他是个非常有用的模型,如每个驱动包含一个大型API的子模块。 MPEG编码API就是在这样...
  • airk000
  • airk000
  • 2014年04月08日 23:40
  • 2044

AngularJS的四大核心特性(二)

AngularJS第三特性指令系统 如上HTML代码中出现了这个标签,但是浏览器不认识标签,默认的执行行为就是将其忽略。而AngularJS为了不让它被忽略,故在js中如下...
  • qqxyy99
  • qqxyy99
  • 2017年02月08日 15:39
  • 608

ASM 翻译系列第二弹:ASM 12C 版本新特性

随着Oracle 12c的发布,也就意味着全新版本的ASM面世了。已知的重大新特性有Flex ASM,数据预校验和更加便捷的磁盘管理操作。下面针对这几个方面进行详细介绍。 Flex ASM ...
  • woqutechteam
  • woqutechteam
  • 2017年02月22日 10:34
  • 334

Java8新特性浅析

欢迎阅读我编写的Java 8介绍。本教程将带领你一步一步地认识这门语言的新特性。通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解。看完这篇教程后,你还将...
  • chenleixing
  • chenleixing
  • 2015年08月20日 08:52
  • 4261

Unity使用C#高级特性扩展方法

C#扩展方法 最近在工作中遇到一个问题,即在不修改原始类的情况下,为类添加新的方法和属性,于是在C#的高级特性中发现了解决方案:扩展方法 下面的扩展方法的定义:             ...
  • huidaoguo
  • huidaoguo
  • 2014年10月23日 16:33
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#v2.0 扩展特性 翻译(2)
举报原因:
原因补充:

(最多只允许输入30个字)