码迷,mamicode.com
首页 > Windows程序 > 详细

记c#中构造函数中this的用法

时间:2015-09-09 16:46:41      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

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

    在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

记c#中构造函数中this的用法

标签:

原文地址:http://www.cnblogs.com/annabook/p/4794958.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!