首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >接口转换与类转换

接口转换与类转换
EN

Stack Overflow用户
提问于 2011-01-03 23:38:56
回答 2查看 7K关注 0票数 17

我一直认为,在某些情况下,造型可能会成为性能的一个可衡量的障碍。当我们开始处理令人讨厌的异常抛出\捕获的不连贯的网络时,这可能是更多的情况。

考虑到我希望在编程时创建更正确的启发式方法,我被提示向.NET专家提出这个问题:接口强制转换比类强制转换快吗?

为了给出一个代码示例,假设这是存在的:

public interface IEntity { IParent DaddyMommy { get; } }
public interface IParent : IEntity { }
public class Parent : Entity, IParent { }
public class Entity : IEntity
{
    public IParent DaddyMommy { get; protected set; }
    public IParent AdamEve_Interfaces
    {
        get
        {
            IEntity e = this;
            while (e.DaddyMommy != null)
                e = e.DaddyMommy as IEntity;
            return e as IParent;
        }   
    }
    public Parent AdamEve_Classes
    {
        get
        {
            Entity e = this;
            while (e.DaddyMommy != null)
                e = e.DaddyMommy as Entity;
            return e as Parent;
        }
    }
}

那么,AdamEve_Interfaces比AdamEve_Classes快吗?如果是这样的话,增加了多少?如果你知道答案,为什么?

EN

回答 2

Stack Overflow用户

发布于 2011-01-03 23:44:31

你就得去测量。

但是,如果强制转换正在成为代码中的(潜在)瓶颈,那么问题菜单上的意大利面条就已经过时了。

票数 8
EN

Stack Overflow用户

发布于 2011-01-04 00:36:09

你试过测试它吗?这是一个运行10,000,000次的循环。在我的机器上,接口版本大约需要440ms,而类版本大约需要410ms。非常接近,但总体而言,类版本获胜。

using System;

namespace ConsoleApplication1
{
    public interface IEntity { IParent DaddyMommy { get; } }
    public interface IParent : IEntity { }
    public class Parent : Entity, IParent { }
    public class Entity : IEntity
    {
        public IParent DaddyMommy { get; protected set; }
        public IParent AdamEve_Interfaces
        {
            get
            {
                IEntity e = this;
                while (this.DaddyMommy != null)
                    e = e.DaddyMommy as IEntity;
                return e as IParent;
            }
        }
        public Parent AdamEve_Classes
        {
            get
            {
                Entity e = this;
                while (this.DaddyMommy != null)
                    e = e.DaddyMommy as Entity;
                return e as Parent;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Entity X = new Entity();
            Parent P;
            IParent IP;
            System.Diagnostics.Stopwatch ST = new System.Diagnostics.Stopwatch();
            Int32 i;

            ST.Start();
            for (i = 0; i < 10000000; i++)
            {
                IP = X.AdamEve_Interfaces;
            }
            ST.Stop();
            System.Diagnostics.Trace.WriteLine(ST.ElapsedMilliseconds);

            ST.Reset();

            ST.Start();
            for (i = 0; i < 10000000; i++)
            {
                P = X.AdamEve_Classes;
            }
            ST.Stop();
            System.Diagnostics.Trace.WriteLine(ST.ElapsedMilliseconds);
        }
    }

}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4585810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档