C#泛型问题
本文关键字:问题 泛型 | 更新日期: 2023-09-27 17:48:48
我正试图完成一本关于泛型的书中的练习题,但这个问题对我来说没有意义。
创建两个具有相同功能的类。对第一个类使用泛型,并将第二个类强制转换为Object类型。创建一个for循环,该循环使用类和基于对象的类来确定哪一个性能更好。
我不知道强制转换为Object类型意味着什么。这是我到目前为止的代码
//Generic
class Person<T> {
T var1;
public Person(T yer) {
var1 = yer;
}
public T Value { get { return var1; } }
}
//Normal class
class Human {
int var1;
public Human(int yer) {
var1 = yer;
}
public int Value { get { return var1; } }
}
我运行循环的主程序
for (int i = 0; i < 1000000; i++) {
Person<int> me = new Person<int>(1);
int hey = me.Value;
}
for (int i = 0; i < 1000000; i++) {
Human per = new Human(1);
object her = (object)per.Value;
}
我不知道我做得对不对。请帮助:-)
我认为问题是要求您创建一个集合类,并将类的实例插入其中。
例如,
Generics版本:
List<Human> myList = new List<Human>();
Human h = new Human();
myList.Add(h);
对象版本:
ArrayList myObjectList = new ArrayList();
Human h = new Human();
myObjectList.Add((object)h));
我还没有检查它是否编译,现在必须运行。
我认为问题是在类的集合上循环。
通用
List<Person> pList = new List<Person>();
for(int i = 0; i<1000; ++i)
pList.Add(new Person(30));
StopWatch sw = new StopWatch();
sw.start();
int sum = 0;
foreach(Person p in pList)
sum += p.Value;
sw.Stop();
对象
ArrayList hList = new ArrayList;
for(int i = 0; i<1000; ++i)
hList.Add(new Human(30));
StopWatch sw = new StopWatch();
sw.start();
int sum = 0;
foreach(Object h in hList)
sum += ((Human)h).Value;
sw.Stop();
要求您在类中使用Object,因此Person<>是完美的。您需要做的是更改Human,使Var1成为一个对象。然后,无论您在哪里使用var1,都将其转换为int或从int转换为
class Human
{
object var1;
public Human(int yer)
{
var1 = (object) yer;
}
public int Value
{
get { return (int) var1; }
}
}
在这个例子中,混淆的地方在于,var1除了int之外,真的不能是任何东西,所以它真的不是泛型的好候选者,在生产中应该像最初编写Human一样编写。但正如我写的那样,这个练习是可以的。
除了for循环外,我认为您做得对。int是一种对象类型,因此请替换
object her = (object)per.Value;
带有
int her = per.Value;
您还缺少一些性能计数器。看看Timer类,看看你可以做什么样的事情,看看哪一个表现更好。
我不确定,但在我看来,这听起来像是一个试图测试你对装箱和拆箱规则的了解的问题。
int i=123;object o=(object)i;//装箱
然后可以将对象o开箱并分配给整数变量i:
o=123;i=(int)o;//开箱
如果一个对象被装箱和取消装箱,那么创建新对象的速度会慢一些。
如果我做得对,那么根据我的计数器(DateTime.Now.Ticks),我看不到任何性能差异。
如果我采用endian的方法,那么我可以看到性能受到的影响
希望我的考题更清楚一点。
谢谢大家。
我知道这是对这个问题的后期添加,但我准确地使用了这个代码,并通过使用DateTime.Now.Ticks
更新以下内容使其工作:
DateTime t = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
Person<int> me = new Person<int>(1);
int hey = me.Value;
}
long a = DateTime.Now.Ticks - t.Ticks;
TimeSpan A = new TimeSpan(a);
for (int i = 0; i < 1000000; i++)
{
Human per = new Human(1);
object her = (object)per.Value;
}
long b = DateTime.Now.Ticks - t.Ticks;
TimeSpan B = new TimeSpan(b);
Console.WriteLine(A.ToString());
Console.WriteLine(B.ToString());
Console.ReadLine();
性能上有很大的差异,因为泛型的速度大约是它的两倍。