C#类(一):类和对象--this关键字

任务描述

大学期间,大四的课程数相对于大三的课程数会消减很多,这样学生们能够更加灵活的应用自己的时间。现制定一个课程表,标出周一到周五之间有课的日期。例如:

周一 有
周二 有
周三 无
周四 无
周五 有

根据编程要求,编写一个课表类,使之能够反映每天的课程安排。

相关知识

this
this关键字表示引用当前类实例。

用法一
this关键字用来限定和区分成员的相似名称。比如当我们编写类的成员函数的时候,函数传参名称通常与成员变量类型相对应,命名可能会有些混淆,例如:

class Person
{
    private string name;
    private int age;
    //声明函数setAttribute(),用来更新类成员变量
    //传参命名与成员变量类似
    public void setAttribute(string name, int age){
        name = name;   //易混淆或无法区分成员变量和传参
        age = age;    
    }
}




使用this区分:

class Person
{
    private string name;
    private int age;
    //声明函数setAttribute(),用来更新类成员变量
    //传参命名与成员变量类似
    public void setAttribute(string name, int age){
        this.name = name;   //第一个name,表示类成员,第二个表示参数变量
        this.age = age;
    }
}

其中参数也可命名其他相似的名称,例如前面加个下划线_,此时this可省略:

public void setAttribute(string _name, int _age);

用法二
替代对象作为参数传递给其他方法。

如下面这段代码:



namespace J4
{
    class Person    //第一个类Person
    {
        private string name;    //两个属性name和age
        private int age;
        public void setName(string name)    //传参string类型
        {
            this.name = name;
        }
        public void setName(WhitePerson wp) //传参为WhitePerson类对象,使用对象属性更新namg成员
        {
            this.name = wp.getName();
        }
    }
    class WhitePerson   //第二个类WhitePerson
    {
        private string name;    //不同属性name个height
        private int height;
        public string getName()
        {
            return name;
        }
        public void setName(string name)
        {
            this.name = name;
        }
        public void setHeight(int height)
        {
            this.height = height;
        }
        public Person getPerson()    //初始化WhitePerson对象后,使用该对象属性对Person类对象进行初始化
        {
            Person pTemp = new Person();
            pTemp.setName(this);    //传入this,作为对象
            return pTemp;
        }
    }
    class myCaller  //第三个调用类myCaller
    {
        public static void Main(string[] agrs)
        {
            Person p = new Person();
            WhitePerson wp = new WhitePerson(); //创建并初始化WhitePerson对象
            wp.setName("Jackie");
            wp.setHeight(177);
            p = wp.getPerson(); //直接返回Person对象
        }
    }
}

此段代码执行过程如下:

在myCaller类中静态函数Main()方法下,创建一个Person类型实例,Person实例p属性值未初始化;

创建一个WhitePerson类实例wp

类实例wp调用成员函数setName(),初始化wp的name属性

类实例wp调用成员函数setHeight(),初始化wp的height属性

wp调用getPerson()函数,在此函数中,创建一个临时Person实例pTemp,pTemp调用Person成员函数setName(),参数为WhitePerson对象;

在函数setName()中,使用WhitePerson对象的name属性初始化pTemp的name属性

getPeron()返回已初始化好的pTemp对象,并赋给Person实例p。

以后我们可能会经常遇见只使用某实例的某几个属性,这时,this作为替代对象进行传参。

用法三
this声明索引器。this可像数组一样使用索引对类成员变量进行操作。结构如下:

public int this[int index]{
    get { return array[index];}
    set { array[index] = value}
}

其中array[index]表示索引为index的成员变量,set和get分别为成员变量赋值和获取成员变量值。返回值为int类型,表明操作的类成员必须为int类型。value是关键字。
具体实例如下:

namespace J4
{
    class Person {
        string name;        //声明三个同类型成员
        string country;
        string city;
        public string this[int index]{  //使用this声明索引器,返回值为string类型
            set {
                switch(index){
                    case 0:     //设置name值,以此类推
                        this.name = value;
                        break;
                    case 1:
                        this.country = value;
                        break;
                    case 2:
                        this.city = value;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();    //索引越界
                }
            }
        }
        //显示是否设置成功
        public void saying() {
            Console.WriteLine("my name is " + name + ", I come from " + city + ", " + country);
        }
    }
    class myCaller {
        public static void Main(string[] args)
        {
            Person p = new Person();
                                //直接使用索引对成员变量操作
            p[0] = "Jackie";    //name
            p[1] = "China";     //country
            p[2] = "Beijing";   //city
            p.saying();
        }
    }

此段代码定义了Person类,类有三个成员变量,均为string类型,所以可使用this创建索引器:

public string this[int index];

在索引器中,我们根据索引值index,通过switch…case结构进行区分赋值。

switch(index){
    case 0:
        //...
        break;
    case 1:
        //...
        //...
}

定义完成后,我们在调用类中直接使用索引操作成员变量:

p[0] = "Jackie";    //name
p[1] = "China";     //country
p[2] = "Beijing";   //city

编程要求

本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:

使用this声明索引器,补全课表类Schedule

打印结果,程序正常运行

测试说明

测试过程:

平台将编译用户补全后代码,并根据程序的输出判断程序是否正确。
以下是测试样例:

测试输入:

预期输出:

Monday:True

Tuesday:True

Wednesday:False

Thursday:False

Friday:True

我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace J4
{
    class Schedule
    {
        bool Monday;
        bool Tuesday;
        bool Wednesday;
        bool Thursday;
        bool Friday;

        /********** Begin *********/
        //使用this索引器补全代码
         public bool this[int index]
        {  //使用this声明索引器,返回值为string类型
            set
            {
                switch (index)
                {
                    case 1:     //设置name值,以此类推
                        this.Monday = value;
                        break;
                    case 2:
                        this.Tuesday = value;
                        break;
                    case 3:
                        this.Wednesday = value;
                        break;
                    case 4:
                        this.Thursday = value;
                        break;
                    case 5:
                        this.Friday = value;
                        break;
                   

                    default:
                        throw new ArgumentOutOfRangeException();    //索引越界
                }
            }
        }

        /********** End *********/
        public void getResult()
        {
            Console.WriteLine("Monday:" + Monday);
            Console.WriteLine("Tuesday:" + Tuesday);
            Console.WriteLine("Wednesday:" + Wednesday);
            Console.WriteLine("Thursday:" + Thursday);
            Console.WriteLine("Friday:" + Friday);
        }
    }
    class myCaller
    {
        public static void Main(string[] args)
        {
            Schedule s = new Schedule();
            s[1] = true;
            s[2] = true;
            s[3] = false;
            s[4] = false;
            s[5] = true;

            s.getResult();

        }
    }
}

链接

链接: link.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值