asp.net 2.0教程 C# 2.0新特性 泛型

原创 2007年10月14日 14:54:00

尊重作者,请保留 www.it55.com 链接字样。

C#2.0作为#1.X的升级版本,为我们引入了很多新的而且很实用的特性。最重要的当属泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和局部类(partial Types)。这些新特性在提供高度兼容性的同时,也在很大程度上提高了代码的效率和安全性。
本节我们学习有关于泛型的内容。
泛型存在的必要性:在1.X版本中,为了能适应不同类型的参数引入,我们常常需要重写一些函数,或者常常将其object化,以达到函数的通用性。但往往带给我们的是程序性能的下降和重复性劳动的增加。泛型的出现很好的解决了这个问题。其实简单的讲,泛型是一种可以传递或者灵活规范参数类型的机制。
泛型需要命名空间System.Collections.Generic的支持,可应用于类、方法、结构、接口、委托等设计中,集复用性、类型安全、高效率于一身。下面我们分别举例来看看泛型的几种使用方法。
1、泛型方法
using System;
using System.Collections.Generic;

public class GenericMethod
{
    // 静态 泛型方法
    public static string Output<T>(T t)
    {
        return "类型:" + t.GetType().ToString() + ";值:" + t.ToString();
    }
}

public partial class Generic_Method : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(GenericMethod.Output<int>(23) + "<br />");
        Response.Write(GenericMethod.Output<DateTime>(DateTime.Now) + "<br />");
    }
}

2、泛型抽象类
using System;
using System.Collections.Generic;

// 泛型抽象类
public abstract class GenericParent
{
    // 泛型抽象方法,返回值为一个泛型,加一个约束使泛型X要继承自泛型Y
    public abstract X Output<X, Y>(X x, Y y) where X : Y;

    // 泛型抽象方法,返回值为一个string类型,加一个约束使泛型X要继承自IListSource
    public abstract string Output2<X>(X x) where X : System.ComponentModel.IListSource;
}

public class GenericChild : GenericParent
{
    // 重写抽象类的泛型方法
    public override T Output<T, Z>(T t, Z z)
    {
        return t;
    }

    // 重写抽象类的泛型方法
    public override string Output2<T>(T t)
    {
        return t.GetType().ToString();
    }
}


public partial class Generic_Abstract : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        GenericChild gc = new GenericChild();
        Response.Write(gc.Output<string, IComparable>("aaa", "xxx"));
        Response.Write("<br />");

        Response.Write(gc.Output2<System.Data.DataTable>(new System.Data.DataTable()));
        Response.Write("<br />");
    }
}

3、泛型接口
using System;
using System.Collections.Generic;

// 泛型接口
public interface IGenericInterface<T>
{
    T CreateInstance();
}

// 实现上面泛型接口的泛型类
// 派生约束where T : TI(T要继承自TI)
// 构造函数约束where T : new()(T可以实例化)
public class Factory<T, TI> : IGenericInterface<TI>
    where T : TI, new()
{
    public TI CreateInstance()
    {
        return new T();
    }
}


public partial class Generic_Interface : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IGenericInterface<System.ComponentModel.IListSource> factory =
            new Factory<System.Data.DataTable, System.ComponentModel.IListSource>();

        Response.Write(factory.CreateInstance().GetType().ToString());
        Response.Write("<br />");
    }
}

4、泛型委托
using System;
using System.Collections.Generic;

public class GenericDelegate
{
    // 声明一个泛型委托
    public delegate string OutputDelegate<T>(T t);#p#分页标题#e#

    // 定义一个静态方法
    public static string DelegateFun(string s)
    {
        return String.Format("Hello, {0}", s);
    }

    // 定义一个静态方法
    public static string DelegateFun(DateTime dt)
    {
        return String.Format("Time, {0}", dt.ToString());
    }
}


public partial class Generic_Delegate : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // 使用泛型委托
        GenericDelegate.OutputDelegate<string> delegate1
            = new GenericDelegate.OutputDelegate<string>(GenericDelegate.DelegateFun);

        Response.Write(delegate1("aabbcc"));
        Response.Write("<br />");

        // 使用泛型委托(匿名方法)
        GenericDelegate.OutputDelegate<DateTime> delegate2 = GenericDelegate.DelegateFun;
        Response.Write(delegate2(DateTime.Now));
    }
}

下一节我们将继续学习C# 2.0的新特性 匿名方法、迭代器、局部类 

ASP.NET2.0轻松搞定统计图表

主页:http://blog.csdn.net/21aspnet/           时间:2007.3.27 本文讲述如何绘制条形图,折线图,柱形图,面积图等常见图形。 效果图: ...
  • jsjpanxiaoyu
  • jsjpanxiaoyu
  • 2015年03月22日 01:23
  • 1481

asp.net web api 2.0 实现跨域资源共享

asp.net web api 2 对跨域资源共享的支持1. 同源策略:同源策略是浏览器为保证安全最基本的功能, 只有同源的脚本才能够被执行,那么什么是同源呢?同源是指协议,域名以及端口号都相同,任何...
  • zhanxueguang
  • zhanxueguang
  • 2015年07月09日 20:47
  • 1362

C# Kinect 2.0 SDK 学习笔记(0)——基本情况介绍

去年十一的时候凑热闹买了个国行版的Xbox One,玩了一阵子之后开始对摄像头感兴趣,咬咬牙又买了个Adapter,把Kinect二代摄像头接到了电脑上,上网找了很多资料,官方2.0的SDK已经放出,...
  • ivanyoung66
  • ivanyoung66
  • 2015年07月05日 21:39
  • 2020

Asp.Net Core 2.0 生成操作数据库文件需要的文件

开发环境 VS2017 + Win7 x64 生成操作数据库文件需要配置或添加的文件 1、Startup.cs public IConfiguration Configuratio...
  • king_hh
  • king_hh
  • 2017年12月29日 16:50
  • 87

C# Kinect 2.0 SDK 学习笔记(1)——彩色影像数据流

彩色影像数据流是Kinect摄像头最基本的数据,图像相当于一般的摄像头(废话)。 本节主要是获取Kinect摄像头的彩色影像数据,在Image控件上将其展示出来。 新建WPF项目KinectC...
  • ivanyoung66
  • ivanyoung66
  • 2015年07月06日 22:27
  • 2345

Joe's OpenGL ES 2.0 系列经典入门教程(第一课:Introduction)

偶然机会,大柚发现一套非常适合ru
  • luozhonglan
  • luozhonglan
  • 2014年04月12日 23:19
  • 1661

配置asp.net 2.0的项目到IIS7

首先碰到以下问题: 无法读取配置节"system.web.extensions",因为它缺少节声明 在微软的论坛找到了解决的办法: http://forums.asp.net/p/1...
  • orichisonic
  • orichisonic
  • 2015年11月10日 13:54
  • 591

IIS6.0手动安装与配置asp.net2.0全过程

这个问题不是很新了,但是相信对一些新手来说还是有一定难度的,或是一些程序员本身就没有机会接触到这块,正好今天 我配置计算机,把这个过程记录下来,希望以后能用的上,也希望能给大家带来一点帮助(本次试用的...
  • szyone
  • szyone
  • 2013年07月04日 14:38
  • 659

Retrofit2.0详解(一简单使用)

几个月前,对Retrofit进行了一个系统的学习,不过没有做一个整理和总结,正好国庆没什么事就写几篇博客对Retrofit的简单使用,上传下载进度监听,封装使用,源码解析做一个学习,记录如下 ...
  • qq_31694651
  • qq_31694651
  • 2016年10月07日 11:30
  • 1885

asp.net identity(微软首推的身份验证)2.0分析-基于vs2015默认程序

因为总是感觉,asp.net identity用起来不太舒服,比如代码的扩展性,以及维护以后的版本,所以对其进行分析 下面进入正文: 在vs2015自带的默认程序中,App_Start/Ident...
  • loongsking
  • loongsking
  • 2017年02月05日 17:50
  • 886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net 2.0教程 C# 2.0新特性 泛型
举报原因:
原因补充:

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