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

简介: 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("这是扩展类的方法");
        }
    }
}

运行结果为:


相关文章
|
3月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
171 0
|
4月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
148 65
|
3月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
3月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
121 3
|
4月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
79 1
|
4月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
4月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
44 0
|
4月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
78 0
|
3月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
60 3
|
2月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
116 12