我正在尝试从一本关于泛型的书中完成练习题,但这个问题对我来说没有意义。在这里。
创建两个具有相同功能的类。对第一个类使用泛型,并将第二个类强制转换为对象类型。创建一个使用class和基于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;
}
我不知道我是否正确行事。请帮助: - )
答案 0 :(得分:6)
我认为问题是要求您创建一个集合类,并将类的实例插入其中。
,例如,
泛型版本:
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));
我没有检查是否编译,现在必须运行。
答案 1 :(得分:1)
我认为问题在于循环一个类的集合。
<强>通用强>
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();
答案 2 :(得分:1)
您被要求做的是使用您班级中的对象,因此Person&lt;&gt;是完美的。您需要做的是更改Human,以便Var1是一个对象。然后,无论你在哪里使用var1,都要将它转换为int:
class Human
{
object var1;
public Human(int yer)
{
var1 = (object) yer;
}
public int Value
{
get { return (int) var1; }
}
}
混淆来自于这个例子中的事实,var1除了int之外真的不能是任何东西,所以它真的不是泛型的好候选者,并且在生产中应该像你最初编写Human一样编写。但是当我写这篇文章时,这个练习就可以了。
答案 3 :(得分:0)
我认为除了for循环之外你已经做对了。 int是一个对象类型,所以替换
object her = (object)per.Value;
带
int her = per.Value;
你缺少的另一件事是一些性能指标。看看Timer类,看看你可以做些什么来看看哪个更好。
答案 4 :(得分:0)
我不确定,但听起来像是一个试图测试你对boxing and unboxing规则的知识的问题。
int i = 123; 对象o =(对象)i; //拳击
然后可以取消对象o并将其分配给整数变量i:
o = 123; i =(int)o; //取消装箱
如果对象被装箱并取消装箱,则在创建新对象时速度会变慢。
答案 5 :(得分:0)
是的,你做对了。纯对象实例没有太多可以做的,因为大多数操作符都不能处理它们。定义了四种公共方法:Equals,GetHashCode,GetType和ToString。我想你可以摆弄Equals,看看是否有任何不同。
答案 6 :(得分:0)
如果我做得对,那么根据我的计数器(DateTime.Now.Ticks),我根本看不出任何性能上的差异。
如果我采用endian的方法,那么我可以看到性能受到的影响。
希望我的考试题目更清晰一点。
谢谢大家。