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;
            }

我不知道我做得对不对。请帮助:-)

C#泛型问题

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

例如,

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;//开箱

如果一个对象被装箱和取消装箱,那么创建新对象的速度会慢一些。

是的,你做得对。使用纯Object实例没有什么可做的,因为大多数操作符都无法处理它们。定义了四个公共方法:Equals、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();

性能上有很大的差异,因为泛型的速度大约是它的两倍。