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

Introduction to C# 2.0
C# 2.0 introduces several language extensions, the most important of which are Generics, Anonymous Methods, Iterators, and Partial Types.

C#2.0 介绍几种语言扩展,泛型,匿名方法,迭代器 和、partial Types.

· Generics permit classes, structs, interfaces, delegates, and methods to be parameterized by the types of data they store and manipulate. Generics are useful because they provide stronger compile-time type checking, require fewer explicit conversions between data types, and reduce the need for boxing operations and run-time type checks.

泛型允许类,结构,接口,代理还有方法被他们存储和操作数据类型参数化。泛型相当有用,因为他们提供强制的编译时类型检查,要求更少的数据类型之间的显式转换,并减少装箱拆箱的操作和运行时类型检查。

· Anonymous methods allow code blocks to be written “in-line” where delegate values are expected. Anonymous methods are similar to lambda functions in the Lisp programming language. C# 2.0 supports the creation of “closures” where anonymous methods access surrounding local variables and parameters.

· Iterators are methods that incrementally compute and yield a sequence of values. Iterators make it easy for a type to specify how the foreach statement will iterate over its elements.

· Partial types allow classes, structs, and interfaces to be broken into multiple pieces stored in different source files for easier development and maintenance. Additionally, partial types allow separation of machine-generated and user-written parts of types so that it is easier to augment code generated by a tool.

This chapter gives an introduction to these new features. Following the introduction are four chapters that provide a complete technical specification of the features.

这个章节将介绍这些新特性。随后的四个章节的介绍将提供有关特性的完整技术规范

The language extensions in C# 2.0 were designed to ensure maximum compatibility with existing code. For example, even though C# 2.0 gives special meaning to the words where, yield, and partial in certain contexts, these words can still be used as identifiers. Indeed, C# 2.0 adds no new keywords as such keywords could conflict with identifiers in existing code.

c#2.0中的语言扩展最大程度上保证和现有代码的兼容。举例说,即使c#2.0指定以下词如yield,partial在特定的上下文有特有的意义,他们依然可以作为标示符。甚至,c#2.0没有加任何新的可能会在现有代码冲突的关键词

Generics
Generics permit classes, structs, interfaces, delegates, and methods to be parameterized by the types of data they store and manipulate. C# generics will be immediately familiar to users of generics in Eiffel or Ada, or to users of C++ templates, though they do not suffer many of the complications of the latter.

泛型允许类,结构,接口,代理和方法被他们存储操作的数据类型参数化。C#泛型将很快被eiffel,ada的使用过泛型的用户熟悉,或是使用过c++templates,尽管他们不需要忍受以后的多种编译器。

Why generics?
Without generics, general purpose data structures can use type object to store data of any type. For example, the following simple Stack class stores its data in an object array, and its two methods, Push and Pop, use object to accept and return data, respectively:

如果没有泛型,一般数据结构能使用类型对象去存储任何数据类型。举例,下面所描述的一个很简单的栈的类存储数据在对象数组中。它有两个方法push和pop,使用对象分别地去接受和返回数据

public class Stack
{
object[] items;
int count;

public void Push(object item) {...}

public object Pop() {...}
}

While the use of type object makes the Stack class very flexible, it is not without drawbacks. For example, it is possible to push a value of any type, such a Customer instance, onto a stack. However, when a value is retrieved, the result of the Pop method must explicitly be cast back to the appropriate type, which is tedious to write and carries a performance penalty for run-time type checking:

当使用对象类型的时候栈类的使用更灵活,它并非没有缺陷。举例说,它很可能压入任何类型的值,如一个customer实例到一个栈。然而,当一个值返回,pop方法返回的结果必须显式转化成适当类型,不但编写是乏味的并且在运行时的类型检查降低性能。

Stack stack = new Stack();
stack.Push(new Customer());
Customer c = (Customer)stack.Pop();

If a value of a value type, such as an int, is passed to the Push method, it is automatically boxed. When the int is later retrieved, it must be unboxed with an explicit type cast:

如果是一个值类型,如整型传入push方法,它自动装箱。当整型在后来返回的时候,它必须进行显式的拆箱。

Stack stack = new Stack();
stack.Push(3);
int i = (int)stack.Pop();

Such boxing and unboxing operations add performance overhead since they involve dynamic memory allocations and run-time type checks.

当他们处于动态内存分配和运行时类型检查,装箱拆箱操作将增加性能消耗。

A further issue with the Stack class is that it is not possible to enforce the kind of data placed on a stack. Indeed, a Customer instance can be pushed on a stack and then accidentally cast it to the wrong type after it is retrieved:

进一步的关于栈的讨论,强迫数据的类别压入到栈是不可能的。事实上,一个customer实例能被压入栈并且很有可能偶然在它返回时被转化成错误的类型。

Stack stack = new Stack();
stack.Push(new Customer());
string s = (string)stack.Pop();

While the code above is an improper use of the Stack class, the code is technically speaking correct and a compile-time error is not reported. The problem does not become apparent until the code is executed, at which point an InvalidCastException is thrown.

The Stack class would clearly benefit from the ability to specify its element type. With generics, that becomes possible.

以上代码从技术上说是正确的且在编译时是不会报错的,但对stack类的用法是不正确的。这个问题直到代码执行才会显示出来,并抛出InvalidCastException异常.

栈类应当受益于指定元素类型的能力。有了泛型以后,这个将成为可能。

Creating and using generics

创建和使用泛型

Generics provide a facility for creating types that have type parameters. The example below declares a generic Stack class with a type parameter T. The type parameter is specified in < and > delimiters after the class name. Rather than forcing conversions to and from object, instances of Stack accept the type for which they are created and store data of that type without conversion. The type parameter T acts as a placeholder until an actual type is specified at use. Note that T is used as the element type for the internal items array, the type for the parameter to the Push method, and the return type for the Pop method:

泛型提供了一个便利的方法,通过类型参数去创建类型。下面的例子通过类型参数T声明了一个泛型的栈。类型参数在类名后面<>分隔符中定义。Stack实例接受它创建和存储的数据类型而不需要转换远胜于强制的对象转换。

public class Stack
{
T[] items;
int count;

public void Push(T item) {...}

public T Pop() {...}
}

When the generic class Stack is used, the actual type to substitute for T is specified. In the following example, int is given as the type argument for T:

当泛型类Stack被使用,替代T的真实类型将被指定。下面的例子里,int 被指定代替T。

Stack stack = new Stack();
stack.Push(3);
int x = stack.Pop();

The Stack type is called a constructed type. In the Stack type, every occurrence of T is replaced with the type argument int. When an instance of Stack is created, the native storage of the items array is an int[] rather than object[], providing substantial storage efficiency compared to the non-generic Stack. Likewise, the Push and Pop methods of a Stack operate on int values, making it a compile-time error to push values of other types onto the stack, and eliminating the need to explicitly cast values back to their original type when they’re retrieved.

Stack类型被称作构造类型. 在Stack里,每次出现T将被类型参数int代替。当一个Stack实例被创建,本身存储items数组是一个int型数组,比非泛型栈的对象数组提供真实性存储效率。同样的,Push和Pop方法操作int 值,如果push其他类型的数据给栈,将导致一个编译时错误,它排除了当值被返回时所要求的显式转化成原型。

Generics provide strong typing, meaning for example that it is an error to push an int onto a stack of Customer objects. Just as a Stack is restricted to operate only on int values, so is Stack restricted to Customer objects, and the compiler will report errors on the last two lines of the following example:

泛型提供强类型,意味着举例说来 将一个整型数据压入Customer 泛类型的栈。正像一个int泛型栈被严格约束只能操作int型,因此Customer型被严格要求操作Customer对象。下面例子的最后两行,编译器编译的时候会报告错误。

Stack stack = new Stack();
stack.Push(new Customer());
Customer c = stack.Pop();
stack.Push(3); // Type mismatch error
int x = stack.Pop(); // Type mismatch error

Generic type declarations may have any number of type parameters. The Stack example above has only one type parameter, but a generic Dictionary class might have two type parameters, one for the type of the keys and one for the type of the values:

泛型声明可以包括任何数目的类型参数。上面Stack的例子仅仅只有一个类型参数,但泛型Dictionary类可以含有两个类型参数,一个是关键字的类型,一个是值的类型。

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

public V this[K key] {...}
}

When Dictionary is used, two type arguments would have to be supplied:

当Dictionary被使用,必须提供两种类型参数

Dictionary dict = new Dictionary();
dict.Add("Peter", new Customer());
Customer c = dict["Peter"];

时间: 2024-08-31 15:30:14

c#v2.0 扩展特性 翻译(1)的相关文章

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

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

创新触手可及:WebSphere CloudBurst V2.0新特性

每一篇创新触手可及系列的文章都会从开发人员和其他从业人员的角度为您介绍关于新兴技术的信息和讨论,以及对前沿的 IBM WebSphere 产品的幕后观点. 新固件,新特性 IBM WebSphere CloudBurst Appliance firmware V2.0 不缺乏新特性.为了激发您对此新版本的兴趣,本文将带您概括地领略一下最重要的几个新特性.后续文章将会详细介绍这些新功能. 那么,我们现在就开始吧! 动态虚拟机操作 在版本 2.0 之前,WebSphere CloudBurst 中虚

C# 3.0 新特性:扩展方法初探

C#3.0中一个激动人心的特性就是扩展方法:你可以使用实例方法的语法来调用静态方法.本文仔细阐述了这一新特性并且给出了几个相应的例子. 声明扩展方法 扩展方法的行为和静态方法是非常类似的,你只能在静态类中声明它们.为声明一个扩展方法,你需要给该方法的第一个参数指定this关键字,如下例: // Program.cspublic static class EMClass{ public static int ToInt32Ext(this string s) { return Int32.Pars

C# 3.0 新特性----扩展方法

转自 http://www.cnblogs.com/jiejie_peng/archive/2010/04/08/1707195.html C# 3.0 新特性----扩展方法 主要目的掌握对一个已经编译的类的方法的扩展 特别注意a. 扩展某个类时,新建的类要使用 public static 修饰,因为默认的类是 internal 访问修饰符b. 这个类要有文件作用域,即不能作为嵌套类使用c. 扩展方法要声明为静态的d. 扩展方法的第一个参数类型即是要扩展的类,且该参数前要加 this 关键字e

DynamicReports v2.0.0发布 基于JasperReports扩展的Java报表库

DynamicReports v2.0.0发布 基于JasperReports扩展的Java报表库,可用它来快速创建报表而无需可视化报表http://www.aliyun.com/zixun/aggregation/6993.html">设计工具. DynamicReports is based on JasperReports. It allows to create dynamic report designs and it doesn't need a visual report d

JSR 286 Portlet的新特性,第1部分: Portlet 2.0新特性介绍

关于本系列 本系列文章专门针对具有 JSR 168 Portlet 开发基础,并且想了解 JSR 286 Portlet 新特性和开发流程的开发人 员.在学习完本系列后,您将了解相对于 JSR 168 Portlet,JSR 286 Portlet 究竟提供了哪些增强功能, 以及这些新增特性在实际开发 中的应用. 第 1 部分将简单回顾 JSR 168 Portlet, 并列出了 JSR 286 Portlet 的新增内容. 第 2 部分和第 3 部分将 通过在 Apache Pluto 2.0

容器安全检查工具 - Clair v2.0.0

本文讲的是容器安全检查工具 - Clair v2.0.0[编者的话]本文主要介绍了容器安全检查工具--Clair 以及 v2版本的主要变化. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部署与交付.如何提升测试效率.存储.网络.监控.安全等角度进行. 过去几年来,全球各地的组织都开始采用面向容器的基础设施.容器启蒙之路的第一步是将软件打包成容器镜像.将容器看作黑盒对软件

SaturnJS v2.0发布 基于JS的轻量级开发框架

SaturnJS基于JS的轻量级http://www.aliyun.com/zixun/aggregation/13435.html">开发框架,提供WEB前端应用开发的最佳解决方案,主要采用按需加载的方式加载各类JS插件,部分插件采用网上开源的JS代码,并且非常易于扩展,帮助开发者快速创建自己的JS代码库,从而提高开发效率. 完全颠覆1.0的架构方式,而是提供一个虚拟的类,并支持构造函数.继承以及多重继承等类的特性,帮助开发人员更好地使用JS来实现更为复杂的前端应用. 新增特性 配置文件

Apache MINA v2.0.3发布 一个网络应用程序框架

Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API. Apache MINA 也称为: ● NIO 框架库 ● 客户端服务器框架库 ● 一个网络套接字库 MINA虽然简单但是仍然提供了全功能的网络应用程序框架: ● 为不同的传输类型提供了统一的API: ○ 通过Java NIO提供TCP/IP 和 UDP/IP支持 ○ 通过RXTX提供串口通讯(