iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#泛型的定义、继承、方法和约束怎么理解
  • 785
分享到

C#泛型的定义、继承、方法和约束怎么理解

2023-06-18 00:06:31 785人浏览 薄情痞子
摘要

这篇文章主要讲解了“C#泛型的定义、继承、方法和约束怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型的定义、继承、方法和约束怎么理解”吧!C#泛型参数化了类型,把类型作为参数抽

这篇文章主要讲解了“C#泛型的定义、继承、方法和约束怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型的定义、继承、方法和约束怎么理解”吧!

C#泛型参数化了类型,把类型作为参数抽象出来,从而使我们在实际的运用当中能够更好的实现代码的重复利用,同时它提供了更强的类型安全,更高的效率,不过在约束方面,它只支持显示的约束,这样在灵活性方面就显得不是那么好了。我觉得它之所以能够提供更高的效率是因为泛型在实例化的时候采用了"on-demand"的模式,即按需实例化,发生在JIT(Just In Time)编译时。

下面来看如何定义一个C#泛型类,很简单,你只需要意识到一点,在这里,类型已经被参数化了:

using System;  using System.Collections.Generic;  using System.Text;   namespace GenericTest  {   class Program   {  static void Main(string[] args)  {   //使用string,int来实例化Test< T,S>类   Test< string, int> t = new Test< string, int>("SHY520",22);    //调用泛型类中的方法   t.SetValue();  }   }    /// < summary>   /// 定义一个泛型类,该类有两个类型参数,分别是T,S   /// Http://pw.cnblogs.com   /// < /summary>   /// < typeparam name="T">类型参数< /typeparam>   /// < typeparam name="S">类型参数< /typeparam>   public class Test< T,S>   {  //泛型类的类型参数可用于类成员  private T name;  private S age;   public Test(T Name,S Age)  {   this.name = Name;   this.age = Age;  }   public void SetValue()  {   Console.WriteLine(name.ToString());   Console.WriteLine(age.ToString());  }   }  }

上面的例子不是很恰当,目的是让初学泛型的你了解一下泛型的定义及实例化方法,如上,我们定义了一个泛型类,那么如何实现C#泛型类的继承呢?这里需要满足下面两点中的任何一点即可:

泛型类继承中,父类的类型参数已被实例化,这种情况下子类不一定必须是泛型类;

父类的类型参数没有被实例化,但来源于子类,也就是说父类和子类都是泛型类,并且二者有相同的类型参数;

//如果这样写的话,显然会报找不到类型T,S的错误  public class TestChild : Test< T, S> { }   //正确的写法应该是  public class TestChild : Test< string, int>{ }  public class TestChild< T, S> : Test< T, S> { }  public class TestChild< T, S> : Test< String, int> { }

接着我们来看看泛型接口,其创建以及继承规则和上面说的泛型类是一样的,看下面的代码:

public interface IList< T>   {   T[] GetElements();  }   public interface IDictionary< K,V>   {   void Add(K key, V value);   }   // 泛型接口的类型参数要么已实例化  // 要么来源于实现类声明的类型参数  class List< T> : IList< T>, IDictionary< int, T>   {   public T[] GetElements() { return null; }   public void Add(int index, T value)    {}  }

在来看一下C#泛型委托,首先我们定义一个类型参数为T的委托,然后在类中利用委托调用方法:

using System;  using System.Collections.Generic;  using System.Text;   namespace GenericTest  {   //定义一个委托,类型参数为T,返回值类型T   //泛型委托支持在返回值和参数上应用类型参数   delegate string GenericDelete< T>(T value);    class test   {  static string F(int i) { return "SHY520"; }  static string G(string s) { return "SHY520"; }   static void Main(string[] args)  {   GenericDelete< string> G1 = G;   GenericDelete< int> G2 = new GenericDelete< int>(F);  }   }   }

我们再来看C#泛型方法,C#的泛型机制只支持在方法申明上包含类型参数,也即是泛型方法。特别注意的是,泛型不支持在除了方法以外的其他类/接口成员上使用类型参数,但这些成员可以被包含在泛型类型中,并且可以使用泛型类型的类型参数。还有一点需要说的就是,泛型方法可以在泛型类型中,也可以存在于非泛型类型中。下面我们分别看一下泛型类型的申明,调用,重载和覆盖。

using System;  using System.Collections.Generic;  using System.Text;   namespace GenericTest  {   class GenericClass   {  //申明一个泛型方法  public T getvalue< T>(T t)  {   return t;  }   //调用泛型方法  //注意:在调用泛型方法时,对泛型方法的类型参数实例化  public int useMethod()  {   return this.getvalue< int>(10);  }   //重载getvalue方法  public int getvalue(int i)  {   return i;  }   }    //下面演示覆盖   //要注意的是,泛型方法被覆盖时,约束被默认继承,不需要重新指定约束关系   abstract class Parent   {  public abstract K TEST< K, V>(K k, V v) where K : V;   }    class Child : Parent   {  public override T TEST< T, S>(T t, S s)  {   return t;  }   }  }

***我们来看一下C#泛型中的约束:

C#中的泛型只支持显示的约束,因为这样才能保证C#所要求的类型安全,但显示的约束并非时必须的,如果不加约束,泛型类型参数将只能访问System.Object类型中的公有方法。“显式约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”共四种约束。

基类约束:

class A { public void F1() {} }   class B { public void F2() {} }   class C< S,T>   where S: A // S继承自A   where T: B // T继承自B   {    // 可以在类型为S的变量上调用F1,   // 可以在类型为T的变量上调用F2   }

接口约束

interface IPrintable { void Print(); }  interface IComparable< T> { int CompareTo(T v);}  interface IKeyProvider< T> { T GeTKEy(); }  class Dictionary< K,V>   where K: IComparable< K>   where V: IPrintable, IKeyProvider< K>   {    // 可以在类型为K的变量上调用CompareTo,    // 可以在类型为V的变量上调用Print和GetKey   }

构造器约束

class A { public A() { } }   class B { public B(int i) { } }   class C< T>   where T : new()   {    //可以在其中使用T t=new T();   }   C< A> c=new C< A>(); //可以,A有无参构造器  C< B> c=new C< B>(); //错误,B没有无参构造器

值/引用类型约束

public struct A { }   public class B { }   class C< T>   where T : struct   {    // T在这里面是一个值类型   }   C< A> c=new C< A>(); //可以,A是一个值类型  C< B> c=new C< B>(); //错误,B是一个引用类型

感谢各位的阅读,以上就是“C#泛型的定义、继承、方法和约束怎么理解”的内容了,经过本文的学习后,相信大家对C#泛型的定义、继承、方法和约束怎么理解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C#泛型的定义、继承、方法和约束怎么理解

本文链接: https://www.lsjlt.com/news/294514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#泛型的定义、继承、方法和约束怎么理解
    这篇文章主要讲解了“C#泛型的定义、继承、方法和约束怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型的定义、继承、方法和约束怎么理解”吧!C#泛型参数化了类型,把类型作为参数抽...
    99+
    2023-06-18
  • C#中怎么定义和使用泛型类和方法
    在C#中,泛型类和方法可以让你编写更加灵活和可复用的代码。以下是如何定义和使用泛型类和方法的示例: 定义泛型类: public cl...
    99+
    2024-03-06
    C#
  • java泛型方法怎么定义
    在Java中,可以使用以下语法来定义泛型方法: public <T> void methodName(T paramet...
    99+
    2024-03-13
    java
  • java泛型方法怎么定义和使用
    Java泛型方法可以在方法声明时使用泛型类型参数,以便在方法内部使用不特定的类型。定义和使用Java泛型方法的步骤如下: 在方法...
    99+
    2023-10-27
    java
  • C++类的继承怎么理解
    这篇文章主要讲解了“C++类的继承怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++类的继承怎么理解”吧!而基类中的公有成员在public派生时,不仅可以由派生类对象成员访问,也可...
    99+
    2023-06-17
  • Java泛型在集合使用与自定义及继承上的体现和通配符的使用
    泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时...
    99+
    2024-04-02
  • 详解C++中菱形继承的原理与解决方法
    目录菱形继承形成原因应对方案虚继承 vitrual解决二义性变量内存布局–虚基表感悟菱形继承形成原因 多继承,呈菱形状 菱形继承代码: class A { publi...
    99+
    2023-02-01
    C++菱形继承原理 C++菱形继承解决方法 C++菱形继承
  • Golang怎么自定义类型和方法集
    这篇文章主要介绍“Golang怎么自定义类型和方法集”,在日常操作中,相信很多人在Golang怎么自定义类型和方法集问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang怎么自定义类型和方法集”的疑惑有所...
    99+
    2023-07-05
  • 在c++中怎么定义类的方法
    在 c++ 中,使用以下语法定义类方法:returntype classname::methodname(parameters)。方法类型包括成员函数、静态成员函数、常量成员函数和虚方法...
    99+
    2024-05-12
    c++
  • Golang中的方法怎么定义和使用
    这篇文章主要介绍“Golang中的方法怎么定义和使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang中的方法怎么定义和使用”文章能帮助大家解决问题。方法语法在Golang中,方法定义的语法...
    99+
    2023-07-05
  • springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题
    一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 @Configurationpublic class JacksonConfig { public static fina...
    99+
    2023-08-30
    spring boot 后端 java
  • Java带返回值的方法怎么定义和调用
    这篇文章主要介绍了Java带返回值的方法怎么定义和调用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java带返回值的方法怎么定义和调用文章都会有所收获,下面我们一起来看看吧。带返回值的方法练习需求: 设计一个...
    99+
    2023-06-29
  • 详解scratch3.0二次开发之scratch-blocks中的blocks的类型、定义和使用方法
    scratch-blocks是scratch-gui依赖的一个基本模块。它的作用是生成gui界面上的blocks。(有关scratch-blocks的方法可以看我上一篇博客《scra...
    99+
    2024-04-02
  • HTML5怎么自定义data-* data(obj)属性和jquery的data()方法
    本篇内容介绍了“HTML5怎么自定义data-* data(obj)属性和jquery的data()方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理...
    99+
    2024-04-02
  • 怎么理解spark的自定义分区和排序及spark与jdbc
    这篇文章将为大家详细讲解有关怎么理解spark的自定义分区和排序及spark与jdbc,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。//自定义分区import org.apache...
    99+
    2023-06-02
  • Java带参数与带返回值的方法怎么定义和调用
    这篇文章主要介绍“Java带参数与带返回值的方法怎么定义和调用”,在日常操作中,相信很多人在Java带参数与带返回值的方法怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java带参数与带返回值的...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作