C#中this的用法

用法一 this代表当前类的实例对象

 

用法二 this串联构造函数

namespace Demo

{

   public class Test

    {

       public Test()

       {

           Console.WriteLine("无参构造函数");

       }

       // this()对应无参构造方法Test()

     // 先执行Test(),后执行Test(string text)

       public Test(string text) : this()

       {

           Console.WriteLine(text);

           Console.WriteLine("有参构造函数");

       }

    }

 

   class Program

    {

       static void Main(string[] args)

       {

           try

           {

                Test test = new Test("张三");

           }

           catch (Exception ex)

           {

                Console.WriteLine(ex);

           }

           finally

           {

                Console.ReadLine();

           }

       }

    }

}

 

 

 

用法三:C# this修饰符为原始类型扩展方法(暂时了解)

 

 

特点:1、静态类 2、静态方法 3、第一个参数前加this

 

 

例如:public static List<T> ToList<T>(this string Json),就是为this对应的string类型扩展类ToList()方法,调用方式strJson.ToList();

 

 

 

 

用法四:

 

         C#性能优化篇 - 基于索引器封装

 

2.通过索引器访问实例成员

    通过观察上面示例的代码,可以发现:该类的所有成员具有相同的类型float,它们其实可以像访问数组一样的方式访问,所以,我们可以为类提供另一种实例成员访问方式:索引器。下面的代码为上面的Course类声明加上了一个float类型的索引,并在Main方法中通过索引存取数据:

 1    class Course

2    {

3                        publicfloat  Chinese { set; get; }

4             public float Math { set; get;}

5             public float Englisth { set;get; }

6

7        // 声明一个公开的float类型的索引器

8        public float this[int index]

9        {

10             // set访问器:赋值

11             set

12             {

13                 switch (index)

14                 {

15                     case 0:

16                         this.Chinese = value;

17                         break;

18                     case 1:

19                         this.Math = value;

20                         break;

21                     case 2:

22                         this.Englisth = value;

23                         break;

24                     default:

25                         // 索引越界时抛出异常

26                         throw newArgumentOutOfRangeException();

27                 }  

28             }

29             // get访问器:取值

30             get

31             {

32                 switch (index)

33                 {

34                     case 0:

35                         return this.Chinese;

36                     case 1:

37                         return this.Math;

38                     case 2:

39                         return this.Englisth;

40                     default:

41                         throw newArgumentOutOfRangeException();

42                 }

43             }

44        }

45    }

46

47    class Program

48    {

49        static void Main(string[] args)

50        {

51             // 声明一个Course类的实例

52             var course = new Course();

53

54             // 使用索引器访问实例成员

55             // 赋值

56             course[0] = 95;

57             course[1] = 100;

58             course[2] = 80;

59             // 取值

60             Console.WriteLine("语文:{0},数学:{1},英语:{2}",course[0], course[1], course[2]);

61             Console.ReadKey();

62        }

63    }

 

 

 

 索引器和属性的比较

1.相同点

1).索引和属性都不用分配内存位置来存储。

2).索引和属性都是为类的其它成员提供访问控制的。

3).索引和属性都有get访问器和set访问器,它们可以同时声明两个访问器,也可以只声明其中一个。

2.不同点

1).属性通常表示单独的数据成员,而索引表示多个数据成员。

2).属性既可以声明为实例属性,也可以声明为静态属性,而索引不能声明为静态的。 

3).属性有简洁的自动实现属性,而索引必须声明完整。

4).get访问器:属性的 get 访问器没有参数,索引器的 get 访问器具有与索引器相同的形参表。 

5).set访问器:属性的 set 访问器包含隐式 value 参数。除了值参数外,索引器的 set 访问器还具有与索引器相同的形参表。

 

多访问、非静态、有额外参数

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值