zoukankan      html  css  js  c++  java
  • 记c#中构造函数中this的用法

        今天谈及这个话题,是因为在看别人代码,遇到的。本着知其然还要知其所以然的精神,在网上大肆查找了一遍。得到了一些答案。并在此做一个简单的笔记,以便自己和他人以后查找,与我一同成长进步。

        在C#中this用来指代当前对象,用于当成员函数中的形参名跟成员变量名一致时,进行区分。

      但this不仅仅只有这一作用,this还可以如下这样用:

        

    class class1
        {
            private int i_a;
            private string s_a;
    
            public class1()
            {
                i_a = 0;
                s_a = "default";
            }
    
            public class1(int i_a)
            {
                if (i_a > 5 && i_a < 10)
                {
                    this.i_a = i_a;
                }
                s_a = "defalt";
            }
    
            public class1(string s_a)
            {
                this.i_a = 0;
                this.s_a = s_a;
            }
            public class1(int i_a, string s_a)
            {
                if (i_a > 5 && i_a < 10)
                {
                    this.i_a = i_a;
                }
                this.s_a = s_a;
            }
    
            public void print()
            {
                Console.WriteLine("i_a = {0}", i_a);
                Console.WriteLine("s_a = {0}", s_a);
            }
       }

    注意到,这个对成员变量i_a的值的鉴定操作在第2跟第4个构造函数中重复了两次,如果这个操作复杂一点,这样的变量多一点,那重复代码就大大增加,影响了代码的维护性,一旦这个操作规则变化了,改动起来就比较麻烦,所以好的方法当然是将这个鉴定操作提取出来,放到一个单独的函数中,然后统一调用,不过C#还提供了这样一种机制来,稍作修改如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace liuStream
    {
        public class Class1
        {
             private int i_a;
            private string s_a;
    
            public Class1()
            {
              //  i_a = 0;
               // s_a = "default";
            }
    
            public Class1(int i_a) : this(3, "default") { }
    
            public Class1(string s_a) : this(6, s_a) { }
    
            public Class1(int i_a, string s_a)
            {
                if (i_a > 5 && i_a < 10)
                {
                    this.i_a = i_a;
                }
                this.s_a = s_a;
            }
    
            public void print()
            {
                Console.WriteLine("i_a = {0}", i_a);
                Console.WriteLine("s_a = {0}", s_a);
            }
        }
    }

    调用:

     Class1 cl = new Class1("我是test");
                cl.print();
                Class1 c2 = new Class1(8);
                c2.print();
                Console.WriteLine("结束了");

    输出结果:

    另外,this还可以用在索引器中。

     另外的一种解释说法:

    首先,c#   里的   this   代表正在运行的当前实例,也就是这个类的一个实例(只不过系统是自己生成,不用我们显式声明和初始化) 

    第二,   c#类中的默认构造函数(也就是无形参,无实现体的)在代码中是可以缺省的,我们可以不用代码写出来。(如果缺省,程序在编译的时候,系统会为我们加上这个构造函数) 

    第三,对构造函数   Func(para):this()来说   ,表示的是Func构造函数可以调用   this()函数里的代码,而this()就是Func的无行参的重载函数。   必须这样写,而不能写成Func(para):Func() 

    最后,我们可以知道 
    public   IssueSubject(IContainer   Container)   :   this() 

    表示的是   IssuSubject(Container)   调用自己类中的另一个函数中的代码(而这个函数this()就是此类中的默认构造函数   IssueSubject()   ), 
    而恰好,这个默认构造函数   public   IssueSubject()   {   }   没有显式写出来

     扩展知识

    base(C# 参考)

    参考:

    http://www.cnblogs.com/csharp4/archive/2010/02/21/1670008.html

    http://www.cnblogs.com/promise-7/archive/2012/01/11/2318933.html

    http://blog.csdn.net/ershouyage/article/details/7637456

  • 相关阅读:
    vue系列---identify(生成图片验证码)插件
    vue中的锚链接跳转问题
    vue中怎样实现 路由拦截器
    Vue生命周期和考点
    Vue如何使用vue-area-linkage实现地址三级联动效果
    JS的Key-Val(键值对)设置Key为动态的方法
    web开发——在网页中引用字体包(.ttf),即嵌入特殊字体
    spring boot 实现多个 interceptor 并指定顺序
    BigDecimal加减乘除计算
    乐观锁解决并发问题
  • 原文地址:https://www.cnblogs.com/annabook/p/4794958.html
Copyright © 2011-2022 走看看