第一種實作方式 :
public class 盒子
{
public int 長 = 0;
public int 寬 = 0;
public int 高 = 0;
public object 內裝物品 = null;
public object 看里面裝了什么()
{
return 內裝物品;
}
}
public class 盒子<T> : 盒子
{
public new T 內裝物品 = default(T);
public new T 看里面裝了什么()
{
return 內裝物品;
}
}
第二種實作方式 :
public class 盒子2<T>
{
public int 長 = 0;
public int 寬 = 0;
public int 高 = 0;
public T 內裝物品 = default(T);
public T 取內裝物()
{
return 內裝物品;
}
}
public class 盒子2 : 盒子2<object>
{
public object 看里面裝了什么()
{
return 內裝物品;
}
}
測驗 :
public class Test
{
public static 盒子 test_00()
{
return new 盒子<int>();
}
public static 盒子<int> test_01()
{
return new 盒子();
}
public static 盒子2 test_10()
{
return new 盒子2<int>();
}
public static 盒子2<int> test_11()
{
return new 盒子2();
}
}
測驗代碼只有第一個方法是正確的, 后面三個都會報型別轉換的語法錯誤.
上面兩種實作方式, 盒子2看起來應該好理解一些, 盒子2<object> 是 盒子2<T> 的一種特例, 作為子類來實作.
但是實際使用, 感覺用第一種方式更好用, 型別轉換更靈活一些.
大神們覺得應該如何實作更好?
uj5u.com熱心網友回復:
第二個實作會好一些原因
- 強型別,不用擔心后續有一個引數傳進來和預期不相同,如下面代碼
public void 某個方法(object 內裝物品)
{
// 期望這個 內裝物品 是 int 型別,但是實際上型別是 bool 型別
}
使用強型別就不會出現上面問題
- 提升性能,在使用 object 轉換的時候,如果是值型別(如int這些)需要進行裝箱和拆箱(百度這個詞就能找到很多知識)
而裝箱拆箱是有一定的性能損耗的
uj5u.com熱心網友回復:

有一句話就靈活等于挖坑,因為太靈活了,所以反而除錯困難
有關除錯和寫代碼相關,歡迎看我博客 dotnet 代碼除錯方法
uj5u.com熱心網友回復:
第二種。泛型放在基類更合適。還有,你的基類方法應該添加為 virtual
派生類 override
uj5u.com熱心網友回復:
這讓我想起了慣用的預設泛型方式是這么做的:只是Entity繼承了Entity<int>
public static void Main(string[] args)
{
Entity t = new Entity();
t.Say();
Entity<string> t1 = new Entity<string>();
t1.Say();
Console.ReadLine();
}
public class Entity<T>
{
public T id { get; set; }
public virtual void Say()
{
Console.WriteLine(typeof(T).Name);
}
}
public class Entity : Entity<int>
{
}
uj5u.com熱心網友回復:
裝箱,拆箱?微軟說,我做了啊
object a=1;
int b=(int)a;
你就算換種形式,也是一個故事
xxx<T>.push()
xxx<T>.pop()
class xxx<T>
T temp;
void push<T>(T obj)
{
temp=obj;
}
T pop()
{
return temp;
}
so,基本上沒看出有啥作用,純理論考據,實際使用價值不高
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/52377.html
標籤:C#
