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.










