C#this关键字

C#this关键字
说明:
①this引用的是类中当前实例
②静态(static)函数没有this关键字
③this可以访问类中的属性,成员方法,构造方法

this四大应用

1:this访问属性—(类中解决与局部变量名称冲突问题)
类中this同一个字段会出现阴影

在这里插入图片描述
代码如下:

		static void Main(string[] args)
        {
            Console.Write("请输入你的名字:");//控制台输入
            string name=Console.ReadLine();//ReadLine()输入string类型数据
            Person p = new Person(name);//利用构造函数传递参数
            p.Print();

        }
        class Person
        {
            private string name;//字段private
            public Person(string name)//一个参数的构造函数
            {
                this.name = name;    
                //形参名字与类中字段名字相同,为了区分类中的属性和形参 使用this
            }
            public void Print()
            {
                Console.WriteLine("我的名字叫:" + this.name);
                Console.ReadKey();
            }
        }

在这里插入图片描述

2:this访问成员方法—(在类中调用自己的成员方法)

在这里插入图片描述
代码如下:

        static void Main(string[] args)
        {
            Print p = new Print();
            p.Test0();
            Console.ReadKey();
        }
        class Print
        {
            public void Test0()
            {
                Console.WriteLine("这是Test0方法。");
                this.Test1();//对类中自己的方法进行调用
            }
            public void Test1()
            {
                Console.WriteLine("这是Test1方法。");
            }

        }

在这里插入图片描述

3:this访问构造方法—(构造方法在实例对象时会被.NET自动调用,我们不能像调用其他成员方法那样调用构造方法,必须用:this(参数1,参数2,…)
格式:

        //  public 类名(形参)
        //   :this(实参1,参数2...)
        //   {}

代码:

 		static void Main(string[] args)
        {
            Print p = new Print("Aucl");//第一步:访问一个参数的构造方法
            Console.ReadKey();
        }
         class Print
         {
             private string name;
             private int age;
             public Print()//第六步:形参到这里   ★第九步
             {
                 Console.WriteLine("无参的构造方法。");//第七步:输出   ★第八步
                 Console.WriteLine();
             }
             public Print(string name)//第二步:形参到这里
                 :this("Aucl",20)     //第三步:通过this访问两个参数的构造方法  
             {                                                                        //★第十一步      
                 Console.WriteLine("我的名字叫:" + this.name);
                 Console.WriteLine("有一个参数的构造方法。");
             }
             public Print(string name, int age)//第四步:形参到这里   
                 : this()                      //第五步:通过this访问无参数的构造方法   
             {
                 Console.WriteLine("我的名字叫{0},今年{1}岁",this.name,this.age);//★第十步
                 Console.WriteLine("有2个参数的构造方法。");
                 Console.WriteLine();
             }
       }

在这里插入图片描述

拓展1:在构造方法中使用this调用重载构造方法的代码必须放在第一行,否则程序不能通过
①正确事例:
在这里插入图片描述
②错误事例:
在这里插入图片描述

拓展2:一个构造方法中只能调用一次重载的构造方法
在这里插入图片描述

拓展3:
①:构造方法内可以通过this.[参数]==>成员方法(构造方法)

 static void Main(string[] args)
        {
            Print p = new Print();
            Console.ReadKey();
        }

        class Print
        {
            public Print()//构造方法
            {
                Console.WriteLine("无参数的构造方法。");
                this.Print1();
            }
            public void Print1()//成员方法
            {
                Console.WriteLine("通过[this.普通方法名]调用普通成员方法。");
            }
        }

在这里插入图片描述

②:成员方法内不能通过:this.[参数]=/=>构造方法
在这里插入图片描述

4:索引器
*(索引器与属性可以对比学习,通常属性只能访问单一字段,如果访问多个数据成员需要索引器,它能够让对象通过数组的方式来进行提取) *

格式:

        /* [修饰符]数据类型 this [索引类型 index]
         * {
         *     get
         *     {
         *          //设置返回值     
         *     }
         *      set
         *      {
         *          //设置隐式参数value给字段赋值
         *      }
         * 
         * }

代码:

		static void Main(string[] args)
        {
            Person p = new Person();//创建对象
              p[1]="Aucl";          
              p[2]="男";
              p[3]="001";
              //索引器可以像数组一样对类成员进行访问
              p.Print();
            Console.ReadKey();
        }
        class Person
        {
            //★如果字符较多我们就需要定义很多个get/set来对字段进行赋值操作
            //★而有了索引器,只要通过定义一个索引器就可以对多个字段进行赋值
            //★简单 高效
            private string name;
            private string xb;
            private string  tel;
            public string this[int index]
            {//定义索引器 
                //get访问器没有break
                get                         
                {
                    switch(index)
                    {
                        case 1:
                            return name;
                        case 2:
                            return xb;
                        case 3:
                            return tel;
                        default:
                            throw new ArgumentOutOfRangeException("index");//确定输入是否正确
                    }
                }
                //set访问器有break
                set                         
                {
                    switch(index)
                    {
                        case 1:
                            name = value;
                            break;
                        case 2:
                            xb = value;
                            break;
                        case 3:
                            tel = value;
                            break;
                    }
                }
            }
            public void Print()
            {
                Console.WriteLine("我的名字叫:" + name + ",性别:" + xb + ",电话:" + tel);
            }
        }
每天进步一点点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AuCl.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值