VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • Tuple补遗

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  在我前面的文章利用.net泛型实现了一个Tuple.在这两天的使用中发现还要再加点东西才能好用.有三个地方:1Tuple要想Array,Enum,Delegate一样有一个基类,这样在不确定Tuple类型参个数时可以用这个基类.2.要增加一个判断函数,用来确定任意给定的一个对象是否属于Tuple中的类型(也许再加一个判定是否Tuple内的item的函数).3.增加默认构造,这样做是为了那些只要类型而无需具体对象的场合.

  //只贴出Tuple<T1>和Tuple<T1, T2>的代码,其他的自己加

public class Tuple
  ...{
    public Tuple() ...{}
    //具体判断两个类型是否一致
    protected bool JudgeType<T, V>(T t, V v)
    ...{
      return typeof(T).Equals(v.GetType());
    }
    //Tuple中是否有这种类型
    public virtual bool HasType<V>(V v)
    ...{
      return false;
    }
  };
  public class Tuple<T1> : Tuple
  ...{
    T1 _t1;    
    public Tuple(T1 t1)
    ...{
      this._t1 = t1;
    }
    public Tuple() : this(default(T1)) ...{}
    public T1 Item_1
    ...{
      get...{return this._t1;}
    }
    public override bool HasType<V>(V v)
    ...{
      return base.HasType<V>(v) || this.JudgeType(this._t1, v);
    }  
  };
  public class Tuple<T1, T2> : Tuple<T1>
  ...{
    T2 _t2;
    public Tuple(T1 t1, T2 t2) : base(t1)
    ...{
      this._t2 = t2;
    }
    public Tuple() : this(default(T1), default(T2)) ...{ }
    public T2 Item_2
    ...{
      get...{return this._t2;}
    }
    public override bool HasType<V>(V v)
    ...{
      return base.HasType<V>(v) || base.JudgeType(this._t2, v);
    }
  };
在这里要说明一下protected bool JudgeType<T, V>(T t, V v)函数,它非常简单就是判断两个类型是否一致.不过要注意它的实现return typeof(T).Equals(v.GetType());其中T代表Tuple中的类型它使用typeof得到类型而v用GetType得到类型.这是因为GetType拿到的是对象的真实类型,而typeof(T)是对象基类型.

class A1 ...{}
class A2 : A1 ...{}
Tuple<A2> t = new Tuple<A2>();
A1 a1 = new A2();
t.HasType(a1);          //返回true

  如果return typeof(T).Equals(typeof(V));会返回false,因为V被认成是A1而不是A2.



相关教程