记c#中构造函数中this的用法
今天谈及这个话题,是因为在看别人代码,遇到的。本着知其然还要知其所以然的精神,在网上大肆查找了一遍。得到了一些答案。并在此做一个简单的笔记,以便自己和他人以后查找,与我一同成长进步。
在C#中this用来指代当前对象,用于当成员函数中的形参名跟成员变量名一致时,进行区分。
但this不仅仅只有这一作用,this还可以如下这样用:
class class1
{
private int i_a;
private string s_a; public class1()
{
i_a = ;
s_a = "default";
} public class1(int i_a)
{
if (i_a > && i_a < )
{
this.i_a = i_a;
}
s_a = "defalt";
} public class1(string s_a)
{
this.i_a = ;
this.s_a = s_a;
}
public class1(int i_a, string s_a)
{
if (i_a > && i_a < )
{
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(, "default") { } public Class1(string s_a) : this(, s_a) { } public Class1(int i_a, string s_a)
{
if (i_a > && i_a < )
{
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();
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() { } 没有显式写出来
扩展知识
参考:
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的用法的更多相关文章
- C#中构造函数和析构函数的用法
构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误.本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项.一 ...
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- .NET/C# 类构造函数中this的用法 (转)
在C#中this用来指代当前对象,用于当成员函数中的形参名跟成员变量名一致时,进行区分. 但this不仅仅只有这一作用,this还可以如下这样用: class class1 { private int ...
- 第22篇 js中的this指针的用法
前面把js的相关知识总结了下,今天把js中的上下文的this,对于强类型语言,this的用法非常的单一,因为他们没有js特有的动态绑定. 首先看下面代码: function funcA() { thi ...
- js中的this指针的用法
首先看下面代码: function funcA() { this.name = "hello"; console.log(this.name); this.show = funct ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- java中super的两种用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
- Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...
- java中 this 和super的用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
随机推荐
- NSString 属性为啥用copy 不用strong
copy不能修改,strong可以修改,防止字符串被意外修改.demo: ——————————————————code 你要的 demo—————————————————— @property (n ...
- 关于volatile 最完整的一篇文章
你真的了解volatile关键字吗? 一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每 ...
- (2.13)Mysql之SQL基础——触发器
(2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...
- 001-spring cache 简介
一.概述 参看地址: 自3.1版以来,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持.与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小. ...
- selenium3.0 远程模式
准备工作: 1. 安装chrome浏览器 2. 下载selnium-server-standalone-3.0.1.jar 步骤: 1. java -jar selnium-server-standa ...
- HDU2426:Interesting Housing Problem(还没过,貌似入门题)
#include <iostream> #include <queue> #include <stdio.h> #include <string.h> ...
- Swagger生成的接口需要权限验证的处理方法
通常开发API的时候需要对接口进行权限验证,而我们在使用Swagger生成接口文档界面的时候,直接调用需要权限验证的接口会提示"当前用户没有登陆" 为了解决此问题,我们需要更改一下 ...
- php \r \n 和 <br/> \t
利用\r \n 和 <br/> \t做了个实验,话不多说,看代码就很清楚的知道
- Java基础教程:网络编程
Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...
- 文件名含中文的JavaWeb文件下载
在javaweb项目中实现文件下载,当文件名中包含中文文字时,需要进行如下的处理,才能在浏览器端正常显示中文文件名: response.setContentType("octets/stre ...