C#学习相关系列之base和this的常用方法

一、base的用法

        Base的用法使用场景主要可以概括为两种:

        1 、访问基类方法

        2、 调用基类构造函数

        使用要求:仅允许用于访问基类的构造函数、实例方法或实例属性访问器。从静态方法中使用 base 关键字是错误的所访问的基类是类声明中指定的基类。 例如,如果指定 class ClassB : ClassA,则从 ClassB 访问 ClassA 的成员,而不考虑 ClassA 的基类。

例子1、访问基类方法

    public class animal{public virtual void sound(){Console.WriteLine("动物的叫声:wowowow");}}public class dog:animal{public override void sound(){base.sound();Console.WriteLine("dog:wowowowo");}}static void Main(string[] args){dog dog = new dog();dog.sound();Console.ReadKey();}

        基类 Person 和派生类 Employee 都有一个名为 Getinfo 的方法。 通过使用 base 关键字,可以从派生类中调用基类的 Getinfo 方法。

运行结果为:

例子2、调用基类构造函数

    public class animal{public animal(){Console.WriteLine("发现未知动物");}public animal(int a){Console.WriteLine("发现{0}只未知动物",a);}public virtual void sound(){Console.WriteLine("动物的叫声:wowowow");}}public class dog:animal{public dog() : base(){Console.WriteLine("未知动物为小狗");}public dog(int a) : base(a){Console.WriteLine("小狗的数量为{0}",a);}public override void sound(){base.sound();Console.WriteLine("dog:wowowowo");}}class Program{static void Main(string[] args){dog dog = new dog(2);dog.sound();Console.ReadKey();}}

运行结果为:

 

从例子中我们也可以看的出对于继承类的构造函数,访问顺序是父类构造函数,再访问子类的构造函数。base 用于用户父类构造函数,this 用于调用自己的构造函数。)

二、this的用法

      this的用法主要总结为5种:

  1. 限定类似名称隐藏的成员
  2. 将对象作为参数传递给方法
  3. 声明索引器
  4. 串联构造函数
  5. 扩展方法

1、限定类似名称隐藏的成员(用 this 区别类成员和参数)

public class Employee
{private string alias;private string name;public Employee(string name, string alias){// Use this to qualify the members of the class// instead of the constructor parameters.this.name = name;this.alias = alias;}
}

 2、将对象作为参数传递给方法

    public class animal{public void leg_count(dog dog){Console.WriteLine("狗腿的数量为:"+dog.leg);}public void leg_count(duck duck){Console.WriteLine("鸡腿的数量为:" + duck.leg);}}public class dog{public int leg = 4;public animal animal;public void count(){animal = new animal();animal.leg_count(this);}}public class duck{public int leg = 2;public animal animal;public void count(){animal = new animal();animal.leg_count(this);}}static void Main(string[] args){dog dog = new dog();duck duck = new duck();dog.count();duck.count();Console.ReadKey();}

运行结果为:

 

3、声明索引器

索引器类似于属性。 很多时候,创建索引器与创建属性所使用的编程语言特性是一样的。 索引器使属性可以被索引:使用一个或多个参数引用的属性。 这些参数为某些值集合提供索引。

使用 this 关键字作为属性名声明索引器,并在方括号内声明参数。

namespace ConsoleApp1
{public class IndexExample{private string[] nameList = new string[10];public string this[int index]{get { return nameList[index]; }set { nameList[index] = value; }}public int this[string name]{get{for(int i = 0; i < nameList.Length; i++){if(nameList[i] == name) return i;}return -1;}}}public class Program{public static void Main(string[] args){IndexExample indexExample = new IndexExample();indexExample[0] = "Tom";indexExample[1] = "Lydia";Console.WriteLine("indexExample[0]: " + indexExample[0]);Console.WriteLine("indexExample['Lydia']: "+ indexExample["Lydia"]);}}
}

运行结果为:

4、串联构造函数

namespace ConsoleApp1
{public class Test{public Test(){Console.WriteLine("no parameter");}public Test(string str) : this(){Console.WriteLine("one parameter: " + str);}public Test(string str1, string str2): this(str1){Console.WriteLine("two parameters: " + str1 + " ; " + str2);}}public class ProgramTest{static void Main(string[] args){Console.WriteLine("Test t1 = new Test();");Test t1 = new Test();Console.WriteLine("Test t2 = new Test('str1');");Test t2 = new Test("str1");Console.WriteLine("Test t3 = new Test('str2', 'str3');");Test t3 = new Test("str2", "str3");}}
}

运行结果为:

Test t1 = new Test();
no parameter
Test t2 = new Test('str1');
no parameter
one parameter: str1
Test t3 = new Test('str2', 'str3');
no parameter
one parameter: str2
two parameters: str2 ; str3

 5、扩展方法

  • 定义包含扩展方法的类必须为静态类
  • 将扩展方法实现为静态方法,并且使其可见性至少与所在类的可见性相同。
  • 此方法的第一个参数指定方法所操作的类型;此参数前面必须加上 this 修饰符。
  • 在调用代码中,添加 using 指令,用于指定包含扩展方法类的 using。
  • 和调用类型的实例方法那样调用这些方法。

官方示例:

using System.Linq;
using System.Text;
using System;namespace CustomExtensions
{// Extension methods must be defined in a static class.public static class StringExtension{// This is the extension method.// The first parameter takes the "this" modifier// and specifies the type for which the method is defined.public static int WordCount(this string str){return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;}}
}
namespace Extension_Methods_Simple
{// Import the extension method namespace.using CustomExtensions;class Program{static void Main(string[] args){string s = "The quick brown fox jumped over the lazy dog.";// Call the method as if it were an// instance method on the type. Note that the first// parameter is not specified by the calling code.int i = s.WordCount();System.Console.WriteLine("Word count of s is {0}", i);}}
}

 自己自定义类的代码:

第一步、新建一个扩展类

第二步、对扩展类定义

扩展类要引用被扩展类的命名空间。

第三步、在使用界面内引入扩展类的命名空间

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using classextension;namespace 符号测试
{class Program{static void Main(string[] args){Test test = new Test();test.method();test.methodextension();Console.ReadKey();}}public class Test{public void method(){Console.WriteLine("这是原始类内的方法");}}}扩展类/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 符号测试;namespace classextension
{public  static class TestExtension{public static void methodextension(this Test test){Console.WriteLine("这是扩展类的方法");}}
}

运行结果为:

参考文献:

C# - base 关键字用法_c#中base的用法-CSDN博客

C# - this 的用法_c# 静态函数 子类this参数_wumingxiaoyao的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/215660.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp高德、百度、腾讯地图配置 SHA1

uniapp高德、百度、腾讯地图配置 SHA1 当winr弹出cmd弹框后输入 keytool -list -v -keystore debug.keystore 显示keytool 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。可以先看看是否有下载jdk且配置了环境变量&#xff0c;具体操作如下&#xff1a;keyto…

力扣每日一道系列 --- LeetCode 206. 反转链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 206. 反转链表 思路一&#xff1a;头插 初始化两个指针&#xff0c;cur 和 newhead。…

nginx基础篇学习

一、nginx编译安装 1、前往nginx官网获取安装包 下载安装包 2、解压 3、安装 进入安装包 安装准备&#xff1a;nginx的rewrite module重写模块依赖于pcre、pcre-devel、zlib和zlib-devel库&#xff0c;要先安装这些库 安装&#xff1a; 编译&#xff1a; 启动&#xff…

【链表之练习题】

文章目录 翻转链表找到链表的中间节点返回倒数第k个节点合并两个有序链表判断链表是否回文注意 翻转链表 //反转链表//实质上是把每一个节点头插法,原本第一个节点变成最后一个节点public ListNode reverseList(){//链表为空if (head null){return null;}//链表只有一个节点if…

【Qt之QTextDocument】使用及表格显示富文本解决方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格显示富文本结论 描述 QTextDocument类保存格式化的文本。 QTextDocument是结构化富文本文档的容器&#xff0c;支持样式文本和各种文档元素&#xff0c;如列表、表格、框架和图像。…

鸿蒙4.0开发笔记之DevEco Studio如何使用低代码开发模板进行开发的详细流程(六)

鸿蒙低代码开发 一、什么是低代码二、如何进行鸿蒙低代码开发1、 创建低代码开发工程&#xff08;方式壹&#xff09;2、已有工程则创建Visual文件&#xff08;方拾贰&#xff09; 三、低代码开发界面介绍四、低代码实现页面跳转五、低代码开发建议 一、什么是低代码 所谓低代码…

C#,《小白学程序》第三课:类class,类的数组及类数组的排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…

【数据结构】时间和空间复杂度

马上就要进入到数据结构的学习了 &#xff0c;我们先来了解一下时间和空间复杂度&#xff0c;这也可以判断我们的算法是否好坏&#xff1b; 如何衡量一个算法的好坏&#xff1f; 就是看它的算法效率 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

无需API开发,有赞小程序集成广告推广系统,提升品牌曝光

无需API开发&#xff0c;实现有赞小程序与其他系统的连接 有赞小程序作为一个多功能的电子商务解决方案&#xff0c;为商家提供了无需复杂API开发就可以实现系统连接和集成的便捷途径。通过有赞小程序&#xff0c;商家可以轻松实现与各种系统的数据同步和应用互联&#xff0c;…

2023年亚太杯数学建模C题新能源汽车成品文章(思路模型代码成品)

一、翻译 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料(非常规车用燃料是指汽油和柴油以外的燃料&#xff09;&#xff0c;并集成了汽车动力控制和驱动等先进技术的汽车。新能源汽车包括…

HEADER请求头都有哪些,作用是什么?

HTTP 请求头是在客户端向服务器发送 HTTP 请求时&#xff0c;包含有关请求的附加信息的部分。以下是一些常见的 HTTP 请求头及其作用&#xff1a; Accept&#xff1a; 作用&#xff1a; 客户端通知服务器可以接受哪些媒体类型&#xff08;如 text/html、application/json&…