C#generics问题

我试图从一本关于generics的书中完成一个练习题,但这个问题对我来说没有意义。 在这里。

创建两个具有相同function的类。 对第一个类使用generics,并将第二个类强制转换为对象类型。 创建一个使用类和基于对象的类的for循环来确定哪个表现更好。

我不确定通过转换为Object类型意味着什么。 到目前为止,这是我的代码

//Generic class Person { 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 me = new Person(1); int hey = me.Value; } for (int i = 0; i < 1000000; i++) { Human per = new Human(1); object her = (object)per.Value; } 

我不知道我是否正确行事。 请帮忙 :-)

我认为问题是要求您创建一个集合类,并将您的类的实例插入其中。

例如,

generics版本:

 List myList = new List(); Human h = new Human(); myList.Add(h); 

对象版本:

 ArrayList myObjectList = new ArrayList(); Human h = new Human(); myObjectList.Add((object)h)); 

我没有检查是否编译,现在必须运行。

我认为问题是循环你的类的集合。

通用

 List pList = new List(); 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:

 class Human { object var1; public Human(int yer) { var1 = (object) yer; } public int Value { get { return (int) var1; } } } 

混淆来自于这个例子中的事实,var1除了int之外真的不能是任何东西,所以它真的不是generics的好候选者,而且在生产中应该像你最初编写Human一样编写。 但是正如我写的那样,这个练习没问题。

我认为除了for循环之外你已经做对了。 int是一个对象类型,所以替换

 object her = (object)per.Value; 

 int her = per.Value; 

你缺少的另一件事是一些性能指标。 看看Timer类,看看你可以做些什么来看看哪个是更好的表演者。

我不确定,但听起来像是一个试图测试你的拳击和拆箱规则知识的问题。

int i = 123; 对象o =(对象)i; //拳击

然后可以将对象o取消装箱并分配给整数变量i:

o = 123; i =(int)o; //取消装箱

如果对象被装箱并取消装箱,则在创建新对象时速度会变慢。

是的,你做得对。 由于大多数操作符不对它们起作用,因此使用纯Object实例的function并不多。 定义了四种公共方法:Equals,GetHashCode,GetType和ToString。 我想你可以摆弄Equals,看看是否有任何区别。

好吧,如果我做得对,那么根据我的计数器(DateTime.Now.Ticks),那么我根本看不出性能上的任何差异。

如果我采用endian的方法,那么我可以看到性能受到的影响。

让我们希望我的考试题目更加清晰。

感谢大家。

我知道这是这个问题的后期添加,但我使用了这个代码,并通过使用DateTime.Now.Ticks只需更新以下内容即可使用它:

  DateTime t = DateTime.Now; for (int i = 0; i < 1000000; i++) { Person me = new Person(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(); 

性能有很大差异,因为generics的速度快了两倍。