温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#如何自定义泛型类

发布时间:2021-12-01 14:00:54 来源:亿速云 阅读:274 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“C#如何自定义泛型类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#如何自定义泛型类”这篇文章吧。

Generic是Framework 2.0的新元素,中文名字称之为“泛型” ,特征是一个带有尖括号的类,比如List< T>

C#自定义泛型类用得最广泛,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。

这里只讨论C#自定义泛型类。基本自定义如下:

public class MyGeneric < T>  ...{      private T member;      public void Method (T obj)      ...{      }  }

这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。

public class MyGeneric < TKey, TValue>  ...{       private TKey key;       private TValue value;        public void Method (TKey k, TValue v)       ...{       }  }

泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。

限制:如果我们知道,这个将要传入的泛型类T,必定具有某些的属性,那么我们就可以在MyGeneric< T>中使用T的这些属性。这一点,是通过interface来实现的。

// 先定义一个interface  public interface IDocument  ...{     string Title ...{get;}     string Content ...{get;}  }   // 让范型类T实现这个interface  public class MyGeneric < T>  where T : IDocument  ...{       public void Method(T v)       ...{            Console.WriteLine(v.Title);       }  }   // 传入的类也必须实现interface  public class Document : IDocument  ...{  ......  }   // 使用这个泛型  MyGeneric< Document> doc = new MyGeneric< Document>();

泛型方法:我们同样可以定义泛型的方法

void Swap< T> (ref T x, ref T y)  ...{  T temp = x;  x = y;  y = temp;  }

泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理

public delegate void delegateSample < T> (ref T x, ref T y)   private void Swap (ref T x, ref T y)  ...{      T temp = x;      x = y;      y = temp;  }   // 调用  public void Run()  ...{     int i,j;     i = 3;     j = 5;     delegateSample< int> sample = new delegateSample< int> (Swap);     sample(i, j);  }

设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable< T>可以解决这个问题。

Nullable< int> x;   // 这样就设置了一个可空的整数变量x  x = 4;  x += 3;  if (x.HasValue)   // 使用HasValue属性来检查x是否为空  ...{ Console.WriteLine ("x="+x.ToString());  }  x = null;    // 可设空值

使用ArraySegment< T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。

int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};  // ***个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数  ArraySegment< int> segment = new ArraySegment< int>(arr, 2, 3);  // (array, offset, count)    for (int i = segment.Offset; i< = segment.Offset + segment.Count; i++)  ...{     Console.WriteLine(segment.Array[i]);    // 使用Array属性来访问传递的数组  }

在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。

以上是“C#如何自定义泛型类”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI