WEB开发网
开发学院软件开发C语言 C#模板编程:有了泛型,为什么还需要模板? 阅读

C#模板编程:有了泛型,为什么还需要模板?

 2010-09-30 22:42:27 来源:WEB开发网   
核心提示: 只用泛型的话,解决不了这个问题,C#模板编程:有了泛型,为什么还需要模板?(2),第一点,Byte,具体算法是极端错误的,且不完整的,Short,Int32

只用泛型的话,解决不了这个问题。第一点,Byte,Short,Int32,Int64,Single,Double之间未实现共同接口;第二点,为提升性能,Image<T>采用非托管内存实现,使用指针进行操作,而泛型中无法使用泛型指针。

使用C#模板可以解决这个问题——代码照旧,只是在头部写下:Using T0=XXX;Using T1=XXX;Using T2=XXX;即可。

由于欠缺源代码的Include机制,当要编写新的滤波器时,需要把相同的代码复制过去,然后更改头部的Using ……。但无论如何,这样使用,还是比在代码中直接写明类型,然后复制、粘帖、替换新类型的可读性以及可维护性要好。

如果.Net允许源代码的Include,C#的模板编程将变得更为流畅(比起C++还是欠缺很多)。不知道等后续.Net版本开放编译服务之后,会不会有更优雅的写法。

下面是我随便写下的一段对图像进行空间线性滤波的代码(不要看具体算法,具体算法是极端错误的,且不完整的,只用看看编码风格就行了,写这段代码只为验证这种编程模式的优点和缺点):

using System; 
using System.Collections.Generic; 
using System.Text; 
using T = System.Byte; 
using CacheT = System.Int32; 
using K = System.Int32; 
namespace Orc.SmartImage.UnmanagedImage 
{ 
    public static class FilterHelper 
    { 
        public unsafe static UnmanagedImage<T> Filter(this UnmanagedImage<T> src, FilterKernel<K> filter) 
        { 
            K* kernel = stackalloc K[filter.Length]; 
            Int32 srcWidth = src.Width; 
            Int32 srcHeight = src.Height; 
            Int32 kWidth = filter.Width; 
            Int32 kHeight = filter.Height; 
            T* start = (T*) src.StartIntPtr; 
            T* lineStart = start; 
            T* pStart = start; 
            T* pTemStart = pStart; 
            T* pT; 
            Int32* pK; 
            for (int c = 0; c < srcWidth; c++) 
            { 
                for (int r = 0; r < srcHeight; r++) 
                { 
                    pTemStart = pStart; 
                    pK = kernel; 
                    Int32 val = 0; 
                    for (int kc = 0; kc < kWidth; kc++) 
                    { 
                        pT = pStart; 
                        for (int kr = 0; kr < kHeight; kr++) 
                        { 
                            val += *pK * *pT; 
                            pT++; 
                            pK++; 
                        } 
                        pStart += srcWidth; 
                    } 
                    pStart = pTemStart; 
                    pStart++; 
                } 
                lineStart += srcWidth; 
                pStart = lineStart; 
            } 
            return null; 
        } 
    } 
}

是不是很像模板编程呢?

上一页  1 2 

Tags:模板 编程 为什么

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接