[英]C# generics question
我正在尝试从一本关于泛型的书中完成一个练习题,但是这个问题对我来说没有意义。 来了
创建两个具有相同功能的类。 对第一个类使用泛型,然后将第二个类转换为Object类型。 创建一个使用类和基于对象的类的for循环,以确定哪个性能更好。
我不确定转换为对象类型意味着什么。 到目前为止,这是我的代码
//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;
}
我不知道我是否做得对。 请帮助 :-)
我认为问题是要您创建一个集合类,然后将类的实例插入其中。
例如,
泛型版本:
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类,看看可以做些什么,看看哪种是性能更好的。
我不确定,但是在我看来,这似乎是一个问题,目的是测试您对装箱和拆箱规则的了解。
整数i = 123; 对象o =(对象)i; //装箱
然后可以将对象o拆箱并分配给整数变量i:
o = 123; i =(int)o; //拆箱
如果将一个对象装箱和拆箱,则创建新对象时会比较慢。
是的,您做对了。 对于纯对象实例,您无能为力,因为大多数运算符都不对其进行处理。 定义了四个公共方法:等于,GetHashCode,GetType和ToString。 我猜您可以摆弄Equals,看看有什么区别。
好吧,如果我做得对,那么根据我的计数器(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();
在性能上有很大的不同,因为泛型的速度大约是以前的两倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.