C#编程(三十一)----------泛型总结
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#编程(三十一)----------泛型总结的更多相关文章
- C#高级编程(第六版)学习:第三十一章:Windows窗体
第三十一章 Windows窗体 创建Windows窗体应用程序 在文本编辑器中输入: /* * form.cs * a simple windows form * */ using System; u ...
- Bootstrap <基础三十一>插件概览
在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...
- [.net 面向对象编程基础] (18) 泛型
[.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...
- 孤荷凌寒自学python第三十一天python的datetime.timedelta模块
孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...
- 使用Typescript重构axios(三十一)——添加axios.all和axios.spread方法
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...
- COJ969 WZJ的数据结构(负三十一)
WZJ的数据结构(负三十一) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 A国有两个主基站,供给全国的资源.定义一个主基站 ...
- NeHe OpenGL教程 第三十一课:加载模型
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)
摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网 ...
- Linux网络编程(三)
Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...
随机推荐
- 和为k的最长子数组及其延伸
问题1: /** * 问题描述: * 给定一个无序数组arr,其中元素可正.可负.可0, * 求arr所有的子数组中正数与负数个数相等的最长子数组长度 * * 解题思路:对数组进行处理,正数为1,负数 ...
- java安装1.8的经验和Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers问题处理
java安装1.8后的问题:之前安装了jdk1.7和jdk1.6,之后又安装jdk1.8,然后执行java -version,输出的是1.8的,后来在注册表把jdk1.8改为1.7,然 ...
- docker:定制node.js的版本
本想用alpine,但如果想使用node.js 6.3.1版本的软件, 总会搞不定glibc和libstdc++报一个无法识别版本信息的错误. 搞了一天,算了.使用debian:stretch-sli ...
- 【BZOJ】4380: [POI2015]Myjnie
题解 区间dp,先离散化所有价值 \(f[i][j][k]\)表示\([i,j]\)区间里最小值为\(k\)的价值最大是多少 只考虑\(i <= a <= b <= j\)的区间,枚 ...
- 【LOJ】#2107. 「JLOI2015」城池攻占
题解 用一个平衡树维护能攻占到u点的骑士,合并到父亲的时候去掉攻击力小于父亲生命值的那部分,只要把那棵树拆掉并且将树中的所有骑士更新一下答案,用无旋式treap很好写 合并的时候只要启发式合并就可以了 ...
- C++Primer,C++标准IO库阅读心得
IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...
- nginx no input file specified
今天在lnmp上调试php项目,之前已经在上面测试过tp5框架,可以正常访问.但是新项目由于项目中有些路径是写固定路径的.为了不去修改代码.配置新项目的时候,为新项目设置新的目录.问题就出现了,网页提 ...
- 【noip模拟赛1】古韵之同心锁
据说在一座OI桥上,同心锁上显示的文字有着它奇异的呈现方式,需要你把它稍做改变才可解密.每个同心锁上都有3个数据.第一个数据是一个字符串s.第二个数据m表示把s串从m处分为两段,s[1]至s[m-1] ...
- <泛> C++3D数学库设计详解 简单光学几何 && 随机向量生成
// 注:本内容为作者原创,禁止在其他网站复述内容以及用于商业盈利,如需引用,请标明出处:http://www.cnblogs.com/lv_anchoret/ Preface 当初写这个库,是为了 ...
- HttpServlet Service方法
service() 方法是执行实际任务的主要方法.Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端. 每次服务器接 ...