繁体   English   中英

C#泛型问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM