using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dogCage = new Cage<Dog>();
// 放进去
dogCage.Putin(new Dog("jack"));
dogCage.Putin(new Dog("job"));
// 取出来
var dog2= dogCage.Takeout();
dog2.ShowName();
}
}
public class Dog
{
private string Name;
private int age = ;
public Dog(string dname)
{
Name = dname;
}
public void ShowName()
{
Console.WriteLine("这是一条狗:{0}", Name);
}
public void ShowAge()
{
Console.WriteLine("宠物的年龄为" + age);
}
// 使用重载运算符
public static Dog operator ++(Dog dog)
{
dog.age++; // 年龄自增
return dog;
}
}
// 泛型类的使用,定义笼子
public class Cage<T>
{
T[] array; // 定义一个数组
readonly int Size; // 定义一个笼子大小
int num; // 定义现有的数量
public Cage(int n)
{
// 构造函数
Size = n;
num = ;
array = new T[Size]; // 设置数组(笼子)的大小
}
// 将宠物放到笼子里
public void Putin(T pet)
{
// 如果还没有满,将宠物放到笼子里
if (Size > num)
array[num++] = pet;
else
Console.WriteLine("宠物已经装满了...");
}
// 将宠物取出来
public T Takeout()
{
// 如果有宠物,那么取出来
if (num > )
return array[--num];
else
{
// 如果没有宠物了,那么返回空
Console.WriteLine("笼子空了!!!");
return default(T);
}
}
}
}

泛型方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// 使用泛型方法
var dog1 = new Dog("jack");
dog1.isHabby<Person>(new Person());
dog1.isHabby<int>();
}
}
public class Dog
{
private string Name;
private int age = ;
public Dog(string dname)
{
Name = dname;
}
public void ShowName()
{
Console.WriteLine("这是一条狗:{0}", Name);
}
public void ShowAge()
{
Console.WriteLine("宠物的年龄为" + age);
}
// 泛型方法
public void isHabby<T>(T target)
{
Console.WriteLine("看到 {0} 很开心!!!", target.ToString());
}
}
public class Person
{
//
}
}

使用where添加约束:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dog = new Dog("jack");
dog.isHabby<Person>(new Person());
// 下面方法会失败,因为使用where添加了约束
//dog.isHabby<int>(3);
}
}
public class Dog
{
private string Name;
public Dog(string name)
{
Name = name;
}
public void ShowName()
{
Console.WriteLine("宠物的名字是:" + Name);
}
// where T:class 表示对该方法添加了只能够传递类的约束
public void isHabby<T>(T target) where T:class
{
Console.WriteLine("见到{0}很高兴...", target.ToString());
}
}
public class Person
{
//
}
}

使用where 还能够对特定的类进行约束:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dog = new Dog("jack");
dog.isHabby<Cat>(new Cat());
}
}
public class Aminal
{
//
}
public class Cat : Aminal
{
//
}
public class Dog
{
private string Name;
public Dog(string name)
{
Name = name;
}
public void ShowName()
{
Console.WriteLine("宠物的名字是:" + Name);
}
public void isHabby<T>(T target) where T:Aminal
{
Console.WriteLine("见到{0}很高兴...", target.ToString());
}
}
}

泛型接口:允许我们将接口成员的参数和返回值类型设置为泛型参数的接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Labardor dog1 = new Labardor();
dog1.Act(new SiteDog());
}
}
public abstract class DogCmd
{
// 定义抽象方法
public abstract string GetCmd();
}
public class SiteDog : DogCmd
{
// 重写抽象方法
public override string GetCmd()
{
return "site";
}
}
// 泛型接口
public interface IDogLearn<C> where C : DogCmd
{
// 接口函数
void Act(C cmd);
}
public class Labardor : IDogLearn<SiteDog>
{
// 实现接口函数
public void Act(SiteDog cmd)
{
Console.WriteLine(cmd.GetCmd());
}
}
}

////////////////////////////////////////////////////////

另一个例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
class Employee
{
protected string id;
protected string name;
protected string age;
// 无参构造函数
public Employee() { }
// 有参构造函数
public Employee(string uid, string uname, string uage)
{
this.id = uid;
this.name = uname;
this.age = uage;
}
// 使用泛型
public void printMessage(Stack<Employee> emcee)
{
foreach(Employee s in emcee)
{
Console.WriteLine("id:{0}, name:{1}, age:{2}", s.id, s.name, s.age);
}
}
}
static void Main(string[] args)
{
// 调用泛型
Stack<Employee> empl = new Stack<Employee>();
do
{
Console.Write("请输入一个id:");
string id = Console.ReadLine();
Console.Write("请输入一个name:");
string name = Console.ReadLine();
Console.Write("请输入一个age:");
string age = Console.ReadLine();
Employee e = new Employee(id, name, age);
empl.Push(e);
Console.Write("是否继续(Y/N):");
} while (Console.ReadLine().ToUpper() == "Y");
Employee a = new Employee();
a.printMessage(empl);
}
}
}

使用泛型相比于集合的好处:

1.在编译时就会报错,不需要等到编译时才报错。

2.泛型避免了集合中add添加时类型不一样的装箱和拆箱。

3.代码重用行更高。

泛型已经能够满足很多需求,但是如果要在性能上有提升可以了解一下System.Collections.Specialized

泛型委托

Func<...,out >:有返回值的泛型委托,最后一个为返回值。

Action<...>:无返回值的泛型委托。

扩展方法

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 社区学习
{
class Program
{
static void Main(string[] args)
{
#region 把集合中小于8的字符串打印出来
// 定义一个集合
List<string> strList = new List<string>()
{
"","","","",""
};
IEnumerable<string> Temps = strList.Where(delegate (string a) { return a.CompareTo("") < ; }); // 筛选,注是字符串小于8而不是字符串数值
foreach(string temp in Temps)
{
Console.WriteLine(temp);
}
#endregion
Console.WriteLine("================================");
#region 使用扩展方法
IEnumerable<string> Items = strList.MyWhere(delegate (string a) { return a.CompareTo("") < ; });
foreach (string Item in Items)
{
Console.WriteLine(Item);
}
#endregion
}
} // 定义扩展方法
public static class MyListExt
{
public static List<string> MyWhere(this List<string> list, Func<string, bool> funcWhere)
{
List<string> result = new List<string>();
foreach(string item in list)
{
if(funcWhere(item))
{
result.Add(item);
}
}
return result;
}
}
}

C# 泛型类和泛型方法的更多相关文章

  1. paip.自定义java 泛型类与泛型方法的实现总结

    paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法     public static <atiType,retType> retType reduce ...

  2. 转:C# 泛型编程之泛型类、泛型方法、泛型约束

    C# 泛型编程之泛型类.泛型方法.泛型约束 分类: asp.net c#2012-08-07 17:36 5998人阅读 评论(0) 收藏 举报 c#编程classobject编译器struct 泛型 ...

  3. JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符

    JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...

  4. C#动态调用泛型类、泛型方法

    在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...

  5. JAVA——泛型类和泛型方法(静态方法泛型)

    泛型类定义的泛型,在整个类中有效.如果被方法是用,那么 泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了. 为了让不同的方法可以操作不同类型,而且类型还不确定.那么 可以将泛型定义在方 ...

  6. 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库

    采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...

  7. C# 泛型编程之泛型类、泛型方法、泛型约束

    来自Hauk的文章 C# 泛型编程之泛型类.泛型方法.泛型约束 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为 ...

  8. Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限

    泛型: 一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入.泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型.使用泛型比使用Object变量再进行强 ...

  9. Java泛型类和泛型方法

    java编程思想说道: 泛型类是应用在整个类上,但同时可以在类中包含参数化方法,而这个方法所在的类可以是泛型,也可以不是泛型,也就是说是否有泛型方法,与其所在的类是否是泛型类没有关系. 泛型方法是的该 ...

  10. Java中的泛型类和泛型方法区别和联系

    泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...

随机推荐

  1. arduino使用oled显示时间MQ_2温湿度

    这代码一般都是复制过来,在小改下就行了 代码如下: double Fahrenheit(double celsius) { ; } //摄氏温度度转化为华氏温度 double Kelvin(doubl ...

  2. Linux下Ganglia集群监控安装、配置笔记

    http://www.blogjava.net/henry14/archive/2011/12/17/ganglia.html 枪声依旧 Linux下Ganglia集群监控安装.配置笔记 Gangli ...

  3. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...

  4. 推荐系统-05-Spark电影推荐、评估与部署

    一.新建scala项目 二.构造程序 代码如下 package xyz.pl8 import java.io.File import org.apache.log4j.{Level, Logger} ...

  5. Java 面试题 —— java 源码

    1. 静态工厂方法 静态工厂方法不必在每次调用它们的时候都创建一个新的对象: Boolean.valueOf(boolean): public final class Boolean { public ...

  6. 带列表写入文件出错先 json.dumps

    output = json.dumps(output, ensure_ascii=False).encode('utf-8')

  7. Factor Graph因子图

    参考链接1: 参考链接2: 参考ppt3: Factor Graph 是概率图的一种,概率图有很多种,最常见的就是Bayesian Network (贝叶斯网络)和Markov Random Fiel ...

  8. windows下前端开发工具遇到的问题总结(yeoman bower grunt)

    我用的是windows环境 一毕要环境: 1:nodejs 官网:https://nodejs.org/en/ 2:由于很多国外网站国内都访问不了(如果没有设置会出现很多奇怪的错误),所有必需FQ 我 ...

  9. 2016 ACM-ICPC EC-Final

    题目链接:Uva传送门 CFGym传送门 UVALive7897 Number Theory Problem (找规律签到) 思路: 8的幂次都是可以的,因为an-1一定能分解成a-1乘上一个多项式. ...

  10. centos6下安装opencv3

    环境 centos6.5 opencv3.3.0 python3.4.9 下载 opencv可从GitHub下载https://github.com/opencv/opencv/tree/3.4.3可 ...