C#中this的用法

本文详细解析了C#中this关键字的多种用途,包括区分重名的数据成员和形参、作为构造函数初始化语句、作为索引器的关键字以及作为参数传递等。同时介绍了如何使用this来扩展类的方法。

借鉴自:https://www.jb51.net/article/67204.htm

this用来区分重名的数据成员和形参

当类中函数的数据成员和函数的形参重名的时候,可以使用this来区分

    public class User
    {
        public int ID { get; set; }

        public string UserName { get; set; }


        public User(int UserID, string UserName)
        {
            this.UserName = UserName;  //使用this来区分
            this.ID = UserID;
        }
    }

this作为构造函数初始化语句

  public class VIP : User
    {
        public int integral { get; set; }
        public VIP()
        {
            ID = 520;
            integral = 1000;
        }

        public VIP(int UserID, string UserName)
         : base(UserID, UserName)  //调用父类的重载构造函数
        {
        }

        public VIP(string UserName) : this()  //用本类中的无参构造函数来初始化这个构造函数
        {
            this.UserName = UserName;
        }

        public VIP(int ID) : this(ID, "gcq")  //用本类中含有俩个参数的构造函数来初始化这个函数
        {
        }

        public void Say([GCQ] User user)
        {
            Console.WriteLine(string.Format("名字:{0} ID:{1}", user.UserName, user.ID));
        }
    }

this作为索引器的关键字

具体可查看具体介绍索引器那篇文章

   public class User
    {
        Dictionary<string, object> dicInfo = null;

        public int ID { get; set; }

        public string UserName { get; set; }

        public User()
        {
            dicInfo = new Dictionary<string, object>();
        }

        public User(int UserID,string UserName)
        {
            this.UserName = UserName;
            this.ID = UserID;
        }

        //索引器
        public object this[string name]  //在名字位置是关键字this
        {
            get { return dicInfo.ContainsKey(name) ? dicInfo[name] : null; }
            set { dicInfo[name] = value; }
        }
    }

this作为参数传递

        //this当作参数传递
        public void Said()
        {
            new VIP().Say(this);
        }

this用来扩展某个类的方法(this必须修饰第一个参数,用于扩展的类必须使用static修饰)

如果静态类A中静态函数的参数为B类类型,当使用this来修饰这个参数时,则可以实现B类的扩展,如果函数有多个参数,this只能用来修饰函数的第一个参数,也是说这个函数可以通过B.出来,成为B类的一部分,当调用的时候参数的填写则跳过使用this修饰的参数,它的用途大多用于给底层类库扩展成员方法,因为底层类库是不可修改的,如果你想为底层某个类库增加一个方法,则可以通过使用this来扩展,这样就可以通过底层类.出这个函数了。

    //静态类,来扩展User类
    public static class Helper
    {
        //this扩展User类 可以通过User类来调用func这个函数
        public static void func(this User user,int age)
        {
            Console.WriteLine(string.Format("名字:{0} ID:{1} 年龄:{2}", user.UserName, user.ID, age));
        }
    }
namespace lianxi
{
    public class User
    {
        Dictionary<string, object> dicInfo = null;

        public int ID { get; set; }

        public string UserName { get; set; }

        public User()
        {
            dicInfo = new Dictionary<string, object>();
        }

        public User(int UserID, string UserName)
        {
            this.UserName = UserName;
            this.ID = UserID;
        }

        //this当作参数传递
        public void Said()
        {
            new VIP().Say(this);
        }

        //索引器
        public object this[string name]  //在名字位置是关键字this
        {
            get { return dicInfo.ContainsKey(name) ? dicInfo[name] : null; }
            set { dicInfo[name] = value; }
        }
    }

    public class VIP : User
    {
        public int integral { get; set; }
        public VIP()
        {
            ID = 520;
            integral = 1000;
        }

        public VIP(int UserID, string UserName)
         : base(UserID, UserName)  //调用父类的重载构造函数
        {
        }

        public VIP(string UserName) : this()  //用本类中的无参构造函数来初始化这个构造函数
        {
            this.UserName = UserName;
        }

        public VIP(int ID) : this(ID, "gcq")  //用本类中含有俩个参数的构造函数来初始化这个函数
        {
        }

        public void Say([GCQ] User user)
        {
            Console.WriteLine(string.Format("名字:{0} ID:{1}", user.UserName, user.ID));
        }
    }

    //静态类,来扩展User类
    public static class Helper
    {
        //this扩展User类 可以通过User类来调用func这个函数
        public static void func(this User user,int age)
        {
            Console.WriteLine(string.Format("名字:{0} ID:{1} 年龄:{2}", user.UserName, user.ID, age));
        }
    }

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter)]
    public class GCQAttribute : Attribute
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
            User u = new User(1, "小明");
            u.Said();  //作参数传递    打印  名字:小明 ID:1

            VIP v = new VIP(2);
            v.func(100);     //用来扩展类方法,调用的时候跳过this修饰的参数   打印  名字:100
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值