int -2147483648~2147483647 21亿
在继承中,子类拥有父类的一切属性和行为,而且任何父类出现的地方,都可以用子类来替代;可谓“长江后浪推前浪”啊
object是一切类的父类
泛型在编译的时候确定类型(延迟思想);
泛型:用一个方法,来满足不同类型的参数;泛型实际上是语法糖,由编译器提供功能;没有性能损失
泛型参数的个数可以随便定义
========================贴代码=====================================================
public class GenericClass //定义一个泛型类 { public static void show < T > (T tParameter) //泛型是一个方法后<T> 括号里传参数 { Console.WriteLine("这是{0},类型是{1}", tParameter, tParameter.GetType()); } public static int Show < T, S > (string s, int t, int d) //泛型传的类型可以是多个T,S { int num = Convert.ToInt32(s); return num + t + d; } public static void Add < T > (int i, string s, double d) { double dd = i + d; Console.WriteLine("我是{0},我今年{1}岁", s, dd); } public static void ShowObject(object obj) //object 是所有类型的基类,但是在传入类型的时候,可能会牵扯到不同类型之间的装箱和拆箱,有性能损失;泛型没有装拆箱,没有性能损失 { Console.WriteLine("这是{0},类型是{1}", obj, obj.GetType()); } public static void ShowT < SPara > (SPara tparameter) //这个任何类型都可以用,只要传入类型,括号里的参数正确就ok { Console.WriteLine("这个是泛型类Show T,parameter={0},parameterType={1}", tparameter, tparameter.GetType()); } public static void ShowTT < SPara, T, S > (SPara tparameter, T t, S s) //传入多个类型 { Console.WriteLine("这个是泛型类ShowTT,parameter={0},parameterType={1},t={2},tType={3},s={4},sType={5}", tparameter, tparameter.GetType(), t, t.GetType(), s, s.GetType()); } }
public class GenericConstaint //定义泛型约束 { //where后面意思是T不仅要是个class对象,还可以new对象(可以有无参数构造) public static T Get < T > (T t) where T: class, new() //必须是个引用类型,string class .... { //引用类型的默认值是null T tt = new T(); //约束加了new(),才能new出来 return default(T); //不管T是什么类型,都会给一个默认值, // default 为泛型代码中的默认关键字, // 给定参数化类型 T 的一个变量 t, 只有当 T 为引用类型时, 语句 t = null 才有效; // 只有当 T 为数值类型而不是结构时, 语句 t = 0 才能正常使用。 // 解决方案是使用 // default 关键字, 此关键字对于引用类型会返回空, 对于数值类型会返回零。 对于结构, 此关键字将返回初始化为零或空的每个结构成员, 具体取决于这些结构是值类型还是引用类型。 } public static T GetQuery < T > (T t) where T: struct //必须是个值类型, { //值类型的默认值不确定 return default(T); } public static void SayHi < T > (T t) where T: People //t必须是People类型或者people类型的子类 { Console.WriteLine("ID:{0},Name:{1}", t.Id, t.name); t.SayHi(); } public interface ISaySometing { void SayHello(); } } public class People { public string name { set; get; } public int Id { set; get; } public void SayHi() { Console.WriteLine("上午好"); } }
class Program { static void Main(string[] args) { GenericClass.show < DateTime > (DateTime.Now); int num = GenericClass.Show < string, string > ("1", 1, 1); Console.WriteLine(num); //在泛型的单个类型的时候,<T>是传参数的类型;当要传入多个参数的时候,括号里可以有多个参数 GenericClass.Add < int > (4, "zhu", 1.0); //object 是所有类型的父类 GenericClass.ShowObject("132"); //ShowObject方法可以传入各种类型~~~string GenericClass.ShowObject(1231); //ShowObject方法可以传入各种类型~~~int GenericClass.ShowObject(DateTime.Now.Year); //ShowObject方法可以传入各种类型~~~DateTime GenericClass.ShowT < string > ("朱凯宾"); // public static void ShowT<SPara>(SPara tparameter)只要传入相对应的T GenericClass.ShowT < DateTime > (DateTime.Now); GenericClass.ShowTT < DateTime, int, string > (DateTime.Now, 100, "猪八戒"); Console.WriteLine("**********泛型约束****************"); //泛型约束声明后,类型参数必须满足约束 //GenericConstaint.Get<int>(3);// 这样会报错,泛型约束where是class,class是引用类型,int是值类型 // GenericConstaint.Get<string>("132");//string是引用类型,因为约束加了new(), 但是string类型是没有无参数构造的,所有会报错 GenericConstaint.GetQuery < int > (123); //值类型 //DateTime 是个结构体,不是引用类型 GenericConstaint.GetQuery < DateTime > (DateTime.Now); People p = new People() { Id = 1, name = "我是people" }; GenericConstaint.SayHi < People > (p); Console.ReadLine(); //用泛型没有装箱和拆箱,所以没有性能损失 //用object类型的时候会有拆箱和装箱~~~~~有性能损失 } }