C#的虚方法、静态方法、实例方法、抽象方法、拓展方法

1、虚方法

  • 首选虚方法就是加上一个标记,virtual,它的作用就是可以被子类进行重写。

  • 这个虚方法必须要有自己的方法体,它的子类并不一定要去重写它,根据需求定

例子:
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第1张图片
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第2张图片
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第3张图片
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第4张图片
另外有几个系统自带的虚方法

  • Equals
  • GetHashCode
  • Have
  • ToString

关于Equals()虚方法
1,对于字符串和值类型能够自动比较是否相等。Equals()默认支持的是‘引用’相等 也就是比较俩个对象的‘地址’,而非对象本身,如果是值类型的数据,则可以直接比较结果。
2,对于对象比较必须重写后才有意义。

这个方法其实就是为了重写方法而存在的(在声明中包含virtual关键字),否则没感觉到它存在的意义。

静态方法

使用了static 修饰符的方法为静态方法,反之则是非静态方法。
静态方法是一种 特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。
所以对静态方法不需要 首先创建一个类的实例,而是采用类名.静态方法的格式
(为什么可以直接点出来:
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第5张图片正常成员变量 例如:

class A
{
	public int a = 1;
}

是在主动调用 A a = new A();后才会初始化int a,
所以要想在静态方法里调用非静态变量,那么可以这样搞
:

C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第6张图片
但是静态类是不能声明非静态成员变量的
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第7张图片

1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!
static内部只能出现static变量和其他static方法!而且static方法中还不能使用this…等关键字…因为它是 属于整个类! ,注意他不能调用非静态的成员变量,因为静态成员的加载是在非静态成员之前 的,不需要生成对象就存在了,非静态成员只有在类的实例化的时候才会进行创建。
2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
4.C#中的方法有两种:实例方法,静态方法. 类的方法代码只有一份,它们的生命周期和类是一致的.实例方法是通过对象名调用的,静态方法与类关联而不是 与对象名关联.
5.那么在程序中什么地方可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数 据,比如连接字符串,配置信息等,当满足上面所 说的两点时,进行一次读取,以后就可以方便的使用了,同 时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。
对一个类无论创建了多少 个实 例,它的静态字段永远都只有一个副本(副本我理解为只有一块内存 静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员…因为静态成员 存在于内存,所以非静态成员可以直接访问类中静态的成员.
公用的处理函数,使用静态方法应该没有问题…牵涉 到数据共享,静态变量的函数要多考虑…静态变量要小心使用…
静态方法 原理就是共享代码段 共享代码段不会产生任何问题 因为代码段都是给CPU作为"读取"用的,除非你进行恶意"修改"运行时的代码段 所以静态方法是可以放心使用的
静态变量 原理就是共享数据段 同上 只要没有进行"写入"操作就不会产生问题 但是数据通常都是用于读和写 所以静态变量要注意使用

静态和常量的区别

C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第8张图片

静态构造函数在静态或者非静态类中

C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第9张图片
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第10张图片
C#的虚方法、静态方法、实例方法、抽象方法、拓展方法_第11张图片
静态构造函数总是在用到类里面的内容的时候调用,实例化对象也算,直接访问成员也算。注意new两次对象只会调用一次静态构造函数,构造函数会执行两次,注意静态构造和构造不算重载

抽象方法

  • 抽象方法必须用在抽象类中,有抽象类的不一定有抽象方法
  • 子类不能写成抽象类,因为只有子类能重写,抽象类中的抽象方法必须被子类重写
  • 抽象类除了类有abstract修饰符,它内部跟普通类一样,可以有:属性、构造、已经实现的方法。
  • 必须重写

注意点

其一:virtual关键字代表这个方法能被重写,就是能被继承并重写,因为要重写所以它的访问类型如果为private则毫无意义阻碍了重写动作的进行也就是它不能私有化,所以C#中virtual关键字和private关键字不能同时使用。

其二:因为静态的方法static和抽象方法abstract规定不能重写,同理C#中static,abstract关键字和virtual关键字不能同时使用。

其三:不能在声明虚方法的同时指定重写虚方法,因为重写方法只能重写基类的虚方法,也就是要提前在基类中声明虚方法,所以virtual关键字和override关键字不能同时使用。

拓展方法

概念

  • 为现有非静态类 变量类型 添加 新方法,比如给Int32加一个成员方法啥的
  • 静态类不允许别人拓展自己类内的方法
    作用
  • 1.提升程序拓展性
  • 2.不需要再对象中重新写方法
  • 3.不需要继承来添加方法
  • 4.为别人封装的类型写额外的方法
    特点
  • 1.一定是写在静态类中
  • 2.一定是个静态函数
  • 3.第一个参数为拓展目标
  • 4.第一个参数用this修饰
static class Tools
   {
       //为int拓展了一个成员方法
       //成员方法 是需要 实例化对象后 才 能使用的
       //value 代表 使用该方法的 实例化对象
       public static void SpeakValue(this int value)
       {
           //拓展的方法 的逻辑
           Console.WriteLine("唐老狮为int拓展的方法" + value);
       }
       //给string添加了一个成员方法
       public static void SpeakStringInfo(this string str, string str2, string str3)
       {
           Console.WriteLine("唐老狮为string拓展的方法");
           Console.WriteLine("调用方法的对象" + str);
           Console.WriteLine("传的参数" + str2 + str3);
       }
       public static void Fun3(this Test t)
       {
           Console.WriteLine("为test拓展的方法");
       }
      // public static void Fun2(this Test t)  // 如果这个方法和调用者自己类内的方法重名了,那么优先调用的是自己类本身的方法
     //   {
     //      Console.WriteLine("为test拓展的方法");
     //   }
   }

   class Test
   {
       public int i = 10;
       public void Fun1()
       {
           Console.WriteLine("123");
       }
       public void Fun2()
       {
           Console.WriteLine("456");
       }
   }
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("拓展方法");
           int i = 10;
           i.SpeakValue();

           string str = "000";
           str.SpeakStringInfo("唐老狮", "111");

           Test t = new Test();
           t.Fun2();
       }
   }

你可能感兴趣的:(C#,c#)