在繼承中,子類擁有父類的一切屬性和行為,而且任何父類出現的地方,都可以用子類來替代;可謂“長江後浪推前浪”啊 object是一切類的父類 泛型在編譯的時候確定類型(延遲思想); 泛型:用一個方法,來滿足不同類型的參數;泛型實際上是語法糖,由編譯器提供功能;沒有性能損失 泛型參數的個數可以隨便定義 貼 ...
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);
}
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類型的時候會有拆箱和裝箱~~~~~有性能損失
}
}