在课程中学习了泛型、lamda、linq的基本使用方法,接下来简单介绍一下我学到的内容。
一、泛型
泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。C#中泛型的语法与C++中的模板类似,但是编译器的实现和支持他们的方式并不相同。比如我们在编程时,有时会遇到处理两个功能相似,只是数据类型不同的的模块,通常我们只是复制一遍然后改变数据类型而已。但是如果使用泛型,就可以解决这一问题。C#泛型大致特点如下:1、如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。2 C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。3、C#的泛型采用“基类,接口,构造器,值类型/引用类型”的约束方式来实现对类型能数的“显式约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性。
在这次作业中我用的泛型主要是类型参数的约束,所以在这篇文章只介绍一下泛型约束的六种类型:(参考:http://msdn.microsoft.com/zh-cn/library/d5x73970(v=vs.80).aspx)
约束 | 说明 |
---|---|
T:结构 | 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)。 |
T:类 | 类型参数必须是引用类型,包括任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 |
T:U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。 |
我在作业中使用的约束如下
class GenericPhone
{
private string os;
private string name;
private double price;
public GenericPhone(string os, string name, double price)
{
this.os = os;
this.name = name ;
this.price = price;
}
public string Os
{
get { return os; }
set { os = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public double Price
{
get { return price; }
set { price = value; }
}
}
class ios : GenericPhone
{
public ios(string os, string name, double price) :base (os,name,price) {}
}
class Android : GenericPhone
{
public Android(string os, string name, double price): base(os, name, price){}
}
class WindowsPhone : GenericPhone
{
public WindowsPhone(string os, string name, double price) : base(os, name, price){}
}
class Phone<T> where T : GenericPhone
{
public void add(string os, string name, double price){}
<span style="white-space:pre"> </span>public void outputAll(string os){}
}
上述代码中class Phone<T> where T : GenericPhone表示在Phone<T>类中,T的取值只能是GenericPhone或者是GenericPhone的子继承。通过上述代码,可分别对不同类型的Phone(即ios系统、Android系统、WindowsPhone系统)的手机进行同样的操作(添加信息、展示信息、查询等功能)。
二、lamda
Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。
Lamda表达式格式:(input parameters) => expression //仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔。这次作业中没有特别使用到Lamda表达式,也就不多做介绍了。
三、LINQ查询语句
LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。 在 LINQ 查询中,始终会用到对象。 可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据。
在本次作业中,只有一处用到了LINQ。
var lint = from GenericPhone ph in list orderby ph.Price select ph;
这个排序语句可根据自己的要求升序或者降序排序,用起来更加方便。
本次课程中学到的并没有一一用到,但是我认为泛型的约束使用和LINQ语句能简化代码,也使代买看起来更加有条理。