C#泛型问题

时间:2008-10-21 11:01:46

标签: c# generics

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

创建两个具有相同功能的类。对第一个类使用泛型,并将第二个类强制转换为对象类型。创建一个使用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;
            }

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

7 个答案:

答案 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的方法,那么我可以看到性能受到的影响。

希望我的考试题目更清晰一点。

谢谢大家。