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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iview/view-design+vue2实现表单校验

1.iview/view-design介绍 iview是一款基于Vue.js的开源UI组件库&#xff0c;提供了丰富的组件和样式&#xff0c;支持响应式布局和多语言环境。它使用了最新的前端技术&#xff0c;如ES6、Webpack和SASS&#xff0c;让开发者可以快速构建高质量的Web应用程序。 View-design是一…

python+requests+pytest+allure自动化框架

1.核心库 requests request请求 openpyxl excel文件操作 loggin 日志 smtplib 发送邮件 configparser unittest.mock mock服务 2.目录结构 base utils testDatas conf testCases testReport logs 其他 2.1base base_path.py 存放绝对路径,dos命令或Jenkins执行…

渗透测试信息搜集

注&#xff1a;太简陋了&#xff0c;不忍直视 渗透测试信息收集 黑盒测试&#xff1a;给域名 灰盒测试&#xff1a;给域名、账户(或密码) 白盒测试&#xff1a;给域名、账户、密码 授权书 对安全公司进行授权 攻防演习 是对个人进行授权 渗透测试&#xff1a;&#xff0…

2023快速成为接口测试高手:实用指南!

大量线上BUG表明&#xff0c;对接口进行测试可以有效提升产品质量&#xff0c;暴露手工测试时难以发现的问题&#xff0c;同时也能缩短测试周期&#xff0c;提升测试效率。但在实际执行过程中&#xff0c;接口测试被很多同学打上了“上手难&#xff0c;门槛高”的标签。 本文旨…

游戏测试大揭秘,帮你轻松过关!

游戏测试可以看作是软件测试的一个分支&#xff0c;黑盒测试最基本的要求是会玩游戏。小公司会要求测试能力更加全面的员工&#xff0c;其中除了功能测试还要会性能测试&#xff0c;兼容测试&#xff0c;弱网测试&#xff0c;自动化测试等。 游戏测试是游戏开发过程中必不可少…

系列九、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…

stack和queue

目录 stack 介绍 头文件 简单使用 constructor empty size top push pop swap 使用 queue 介绍 头文件 简单使用 constructor empty size front back push pop swap 使用 stack 介绍 栈 先进后出 头文件 #include <stack> 简单使用 constru…

ELK+kafka+filebeat企业内部日志分析系统

1、组件介绍 1、Elasticsearch&#xff1a; 是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布…

Fiddler 无法抓包手机 https 报文的解决方案来啦!!

解决手机https无法抓包的问题 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息 这时候怎么解决呢&#xff1f; 以软件测试面试提刷题APP为例&#xff1a; Fiddler上的显示…

微信 H5 中实现客服功能的几种方式

微信 H5 中实现客服功能的几种方式 本文主要针对微信网页 H5 中的客服功能 一、使用微信客服接口及对话界面 服务号消息客服&#xff0c;当用户和公众号产生特定动作的交互时&#xff08;用户发送信息/点击自定义菜单/关注公众号/扫描二维码&#xff09;&#xff0c;微信将会…

rancher2.6 docker版本部署

1. 拉取镜像 docker pull rancher/rancher:v2.6.5 注&#xff1a; 上面命令中rancher的版本v2.6.5&#xff0c;仅仅是我因为我们环境中使用的k8s都是 1.20.1 到1.23.6 之间的版本。rancher支持的k8s版本&#xff0c;在github上查看&#xff1a;Release Release v2.6.5 ranche…

2048 数字合成大作战,Android小游戏开发

A. 项目描述 《2048》是一款经典的益智小游戏&#xff0c;它的目标是通过合并相同数字来达到2048这个最高分。 该游戏规则简单&#xff0c;玩家需要通过滑动屏幕来移动方块&#xff0c;相同数字的方块会合并成一个新的数字方块。这样的简单操作让人可以轻松上手。 《2048》小…

短视频ai剪辑矩阵分发saas系统源头技术开发

抖音账号矩阵系统是基于抖音开放平台研发的用于管理和运营多个抖音账号的平台。它可以帮助用户管理账号、发布内容、营销推广、分析数据等多项任务&#xff0c;从而提高账号的曝光度和影响力。 具体来说&#xff0c;抖音账号矩阵系统可以实现以下功能&#xff1a; 1.多账号多…

笔尖笔帽检测4:C++实现笔尖笔帽检测算法(含源码 可是实时检测)

笔尖笔帽检测4&#xff1a;C实现笔尖笔帽检测算法(含源码 可是实时检测) 目录 笔尖笔帽检测4&#xff1a;C实现笔尖笔帽检测算法(含源码 可是实时检测) 1.项目介绍 2.笔尖笔帽关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.笔尖笔…

举个栗子!Quick BI 技巧(4):创建面积图

面积图又叫区域图&#xff0c;是在折线图的基础之上形成的, 它将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充&#xff0c;这样一个填充区域我们叫做面积&#xff0c;颜色的填充也可以更好的突出趋势信息。 有数据粉好奇如何使用 Quick BI 来制作面积图&#xf…

网络安全工程师就业前景怎么样?

网络安全工程师的就业前景整体来看是不错的&#xff0c;近些年的岗位需求总体呈现上升的趋势&#xff0c;可以说只要有互联网的存在&#xff0c;就会有网络安全工程师的一席之地。不过现在企业更缺乏资深技术人才&#xff0c;如果只学会了皮毛&#xff0c;可能不会很好就业。 网…

「可移动工具车」物料管理的得力助手

随着工业制造企业不断发展&#xff0c;仓储的运营变得越来越重要&#xff0c;物料高效管理也迎来了新的挑战&#xff0c;工厂物料管理直接影响着生产效率和成本控制&#xff0c;不合理的物料管理可能导致物料溢出、过度库存、损耗增加等问题&#xff0c;进而影响企业的整体竞争…

OpenStack云计算平台-块存储服务

目录 一、块存储服务概览 二、安装并配置控制节点 1、先决条件 2、安全并配置组件 3、配置计算节点以使用块设备存储 4、完成安装 三、安装并配置一个存储节点 1、先决条件 2、安全并配置组件 3、完成安装 ​四、验证操作 一、块存储服务概览 OpenStack块存储服务(c…

了解5G安全标准,看这一篇就够了

随着移动通信系统在社会生活中的使用越来越广泛&#xff0c;特别是5G进一步以企业级应用作为核心应用场景&#xff0c;安全成为了包括5G在内的移动通信系统不可忽视的因素。本文梳理了全球主流移动通信标准化组织在安全方面的标准制定&#xff0c;从而可以快速了解5G协议层面对…

WorldWind Android上加载白模数据

这篇文章介绍下如何加载白模数据。这个白模数据的格式是shapefile格式的文件。白模数据拷贝到手机本地&#xff0c;然后读取白模数据&#xff0c;进行加载展示。 worldwind android本身是不支持加载白模数据的&#xff0c;但是可以根据现有提供的加载Polygons的方式&#xff0c…