C#泛型总结

C#中的所谓的泛型程序设计和C++中相应的模版类似.

泛型方法

C#中的泛型方法是指使用了类型参数的方法成员,案例:

static void Main(string[] args)

{

int a=1;

int b=2;

Swap<int>(ref a,ref b);

//Swqp(ref a,ref b);效果和上面一句相同

Console.WriteLine("a = {0},b = {1} ",a,b);

}

public static void Swap<T>(ref T x,ref T y)

{

T temp=x;

x=y;

y=temp;

}

在使用泛型方法的时候需要注意几点:

1.泛型方法可以对其参数类型进行类型限制其中包括:主要限制,次要限制,函数限制

2.C#中是不允许对类的构造函数,属性,事件,索引函数和操作符等特殊函数定义为泛型方法的.

3.泛型方法也可以被定义为虚方法,重载方法,抽象方法或者密封方法等,泛型方法也可以实现override重载,也能利用其实现多态么还有一点就是在派生类中重载基类中的泛型方法时,会自动继承基类中的泛型方法的所有类型限制,没有必要再去重新声明一遍,当然重新声明也是错误的.

4.泛型方法是可以通过委托机制来调用的,其实现机制有两种,分别是:”普通委托”和”泛型委托”

案例:

public static void Swap<T>(ref T x,ref T y)

{

T temp=x;

x=y;

y=temp;

}

public static void Clear<T>(ref T x, ref T y)

{

x = default(T);

y = default(T);

}

补充:在泛型类和方法中,在预先未知以下情况时,如何将默认值分配给参数化类型T:

1.T是引用类型还是值类型

2.如果T是值类型,则它是数值还是结构

3.如果T是引用类型,则t=null有效,若T为数值类型,则t=0才有效,若为结构,则要符合结构中的每个类型.

所以在我们不确定的情况下,使用default关键字,系统会自动的为他分配默认值.

public T Delete(T t)

{

T temp=default(T);

//action

return temp;

}

因为事先不知道T是何种类型,可能是int型可能是string类型,或者是结构.

在这种情况下,要返回函数结果时,使用default就可以返回一个默认值了,因为都是系统为我们做这些.

普通委托:

public delegate void fun(ref int x,ref int y);

int a=1;

int b=2;

fun fun1;

fun1=Swap<int>;

fun1(ref a, ref b);

泛型委托:

public delegate void fun<T>(ref T x,ref T y);

fun<int> fun2;

fun2=Swap<int>;

fun2(ref a, ref b);

泛型类和泛型接口

案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication11

{

class Program

{

static void Main(string[] args)

{

}

}

public class LinkNode<T>

{

protected T data;

protected LinkNode<T> next;

public T Data

{

get { return data; }

set { data = value; }

}

public LinkNode<T> Next

{

get { return next; }

set { next = value; }

}

public LinkNode()

{

data = default(T);

}

public LinkNode(T t)

{

data = t;

}

public static LinkNode<T> operator >>(LinkNode<T> node, int n)

{

LinkNode<T> node1 = new LinkNode<T>();

node1 = node;

for (int i = 0; i < n; i++)

{

node1 = node.next;

}

return node1;

}

public static bool operator ==(LinkNode<T> t1, LinkNode<T> t2)

{

//return (t1.Data ==t2.Data);

//错误不能直接将比较符运用到未知类型的T类型中

//但是可以直接利用object类中的比较方法如Equals();

return (t1.Data.Equals(t2.Data));

}

}

}

分析:

1.泛型类的构造函数名称是与类名同名的,并不包括类型参数

2.不能随意的在泛型类中将比较运算符运用于参数类型的对象中,这样一定会报错,但是如果是运用object类中的相关方法是可行的的.

3.在一个泛型类中可以使用多个泛型参数

4.泛型类本身不能拥有任何东西,只有泛型类的构造类型和其具体实例才能拥有成员方法或数据成员.而在C#中泛型类中的静态成员则是属于该泛型类的构造类型

5.无论是在写泛型类,泛型接口或是泛型方法时都可以加上类型限制,即C#支持在泛型定义过程中通过where关键字来对类型参数进行限制,限制方式主要包括:主要限制(可以限制为struct值类型或者class引用类型),次要限制(限制该类型参数必须从指定的基类或接口继承而来),构造函数限制(要求类型参数的目标类型必须提供一个无参的构造函数),这里的类型限制在C#的程序设计中提供了极大的方便,这是C++中的模板不能匹敌的,但同时牺牲了一些灵活性.

6.由泛型类型所引发的泛型类的继承问题,在泛型类之间的继承中有一天基本的原则就是:开放类型不能作为封闭类型的基类.    也就是说,在普通类继承泛型类时,非泛型的普通类是不能直接继承自泛型类的,但能继承自泛型类的封闭构造函数.就是在继承的过程中类的”开放性”不能变小,但能变大或者不变.

C#编程(三十一)----------泛型总结的更多相关文章

  1. C#高级编程(第六版)学习:第三十一章:Windows窗体

    第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...

  2. Bootstrap <基础三十一>插件概览

    在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...

  3. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  4. 孤荷凌寒自学python第三十一天python的datetime.timedelta模块

     孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...

  5. 使用Typescript重构axios(三十一)——添加axios.all和axios.spread方法

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...

  7. COJ969 WZJ的数据结构(负三十一)

    WZJ的数据结构(负三十一) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 A国有两个主基站,供给全国的资源.定义一个主基站 ...

  8. NeHe OpenGL教程 第三十一课:加载模型

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. 三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

    摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网 ...

  10. Linux网络编程(三)

    Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...

随机推荐

  1. wordpress配置通过IP直接访问及apache的配置

    wordpress配置通过IP直接访问 环境: 操作系统:centos6.5 yum安装lamp环境: yum -y install mysql mysql-server php php-mysql ...

  2. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  3. js中ajax异步问题

    1.JS的执行顺序问题 浏览器是按照从上到下的顺序解析页面,因此正常情况下,JavaScript脚本的执行顺序也是从上到下的,即页面上先出现的代码或先被引入的代码总是被先执行,即使是允许并行下载Jav ...

  4. 大数据统计分析平台之一、Kafka单机搭建

    1.zookeeper搭建 Kafka集群依赖zookeeper,需要提前搭建好zookeeper 单机模式(7步)(集群模式进阶请移步:http://blog.51cto.com/nileader/ ...

  5. 《jquery实战》javascript 必知必会(2)

    A2 一等公民函数 在传统 OO 语言里,对象包含数据和方法.这些语言里,数据和方法通常是不同的概念:javascript另辟蹊径. 与其他 js 的类型一样,函数可以作为对象处理,如String.N ...

  6. MAC下调试JSON接口的工具(HTTP抓包工具)

    MAC下的HTTP接口抓包工具,专业级: 专门做JSON接口测试的工具,简单好用!

  7. [转] HTML5中meta属性的使用详解

    meta属性在HTML中占据了很重要的位置.如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等.虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能够熟 ...

  8. Git(四)Git的分支管理

    一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...

  9. Bzoj4818:生成函数 快速幂

    转来的题面:首先这题显然补集转化,就是用全部方案减去不含任何质数的方案.然后怎么做呢?考虑m比较小,我们能大力把<=m的质数全都筛出来.发现n很大,要么倍增要么快速幂......发现p相当小,所 ...

  10. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...