C# 泛型类和泛型方法
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# 泛型类和泛型方法的更多相关文章
- paip.自定义java 泛型类与泛型方法的实现总结
paip.自定义java 泛型类与泛型方法的实现总结 ============泛型方法 public static <atiType,retType> retType reduce ...
- 转:C# 泛型编程之泛型类、泛型方法、泛型约束
C# 泛型编程之泛型类.泛型方法.泛型约束 分类: asp.net c#2012-08-07 17:36 5998人阅读 评论(0) 收藏 举报 c#编程classobject编译器struct 泛型 ...
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
- C#动态调用泛型类、泛型方法
在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...
- JAVA——泛型类和泛型方法(静态方法泛型)
泛型类定义的泛型,在整个类中有效.如果被方法是用,那么 泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了. 为了让不同的方法可以操作不同类型,而且类型还不确定.那么 可以将泛型定义在方 ...
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...
- C# 泛型编程之泛型类、泛型方法、泛型约束
来自Hauk的文章 C# 泛型编程之泛型类.泛型方法.泛型约束 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为 ...
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
泛型: 一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入.泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型.使用泛型比使用Object变量再进行强 ...
- Java泛型类和泛型方法
java编程思想说道: 泛型类是应用在整个类上,但同时可以在类中包含参数化方法,而这个方法所在的类可以是泛型,也可以不是泛型,也就是说是否有泛型方法,与其所在的类是否是泛型类没有关系. 泛型方法是的该 ...
- Java中的泛型类和泛型方法区别和联系
泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...
随机推荐
- Android:getContext().getSystemService()
一.介绍 getSystemService是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象 二.语法 Windo ...
- Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。
Delphi 10.3.1发布了,对10.3.0存在的各种问题,做了大量的修正.但听高勇说TNetHttpClient在多线程中存在问题,今天做了一下测试,确实如此,看来,还需要官方进一步修正! 具体 ...
- python django 创建虚拟环境
DRF---django-rest-framework: 1.通过一个案例简单回顾一下django, 一.前后端分离,不分离 不分离:前端页面的显示,都是由后端返回的,就是说后端处理了参数,数据库,之 ...
- socket 聊天室实现
server #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket ...
- 初识 数据库及Oracle数据库
一.数据库基本概念二.数据库举例三.Oracle特点四.Oracle版本五.安装Oracle注意事项六.SQL简介七.Select语句 一.数据库基本概念 数据库(Database,DB)数据库管理系 ...
- Python之路,第十五篇:Python入门与基础15
python3 异常 异常(基础) 什么是错误? 错误是指由于逻辑或语法错误等,导致一个程序已无法正常执行的问题. 什么是异常? 异常是程序出错时标识的一种状态,当异常发生时,程序不会再向下执行, ...
- Gym .101879 USP Try-outs (寒假自训第七场)
B .Aesthetics in poetry 题意:给定N个数,(N<2000 ,a[i] <=1e9),让你找一个最大的K,使得N个数膜K的余数个数全都等于N/K个. 思路:我们找到N ...
- doc四则运算
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.ut ...
- happens-before俗解
happens-before俗解 学习Java并发,到后面总会接触到happens-before偏序关系.初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人 ...
- Chrome (开发者工具)快捷键
https://9iphp.com/web/javascript/chrome-devtools-shortcuts.html https://www.cnblogs.com/davidwang456 ...