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. SQL拼接大法

    SQL拼接大法:          Step1:括号先写上() Step2:在括号内写上(,     ,     ,     ,      ,     ,) Step3:再写上单引号(,'     ' ...

  2. springboot区分开发、测试、生产多环境的应用配置

    转:https://blog.csdn.net/daguairen/article/details/79236885 springboot区分开发.测试.生产多环境的应用配置(一) Spring可使用 ...

  3. 【Python】进程-控制块

    一.进程控制块 PCB (Process Control Block): 存放进程的管理和控制信息的数据结构称为进程控制块.它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时 ...

  4. scp 脚本

    #!/bin/bash ty=$ local_dir=$ remote_ip=$ remote_dir=$ showUsage() { echo -e "\033[31m ty local_ ...

  5. ajax跨域(No 'Access-Control-Allow-Origin' header is present on the requested resource)

    问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在response中添加 Access-Control-Allow-Origin 的header,才能让前者成功 ...

  6. CSS使用方法

    CSS行内样式: 在开始标签内添加style样式属性 如:<p style="color:red;">内容</p> CSS内部样式: 内部样式(嵌入样式), ...

  7. camp待补

    待修莫对 序列自动机 几何积分 沈阳 M 待删除背包  : 分组背包 K-LIS, K次二分(插到最后stop) 问题转化为LIS bzoj2131 hdu4055 最小线段覆盖环 实时路况 分治+f ...

  8. 洛谷 P3373:【模板】线段树 2(区间更新)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...

  9. C语言--第四周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1129 一.评分要求 要求1 完成PTA第四周所有题(20分). 要求2 4道 ...

  10. C语言--第三周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1073 一.评分要求 要求1 完成PTA第三周所有题(20分). 要求2 4道 ...