记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语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
随机推荐
- B. Factory Repairs---cf627B(线段树)
题目链接:http://codeforces.com/problemset/problem/627/B 题意:有一个工厂生产零件,但是机器是不正常的,需要维修,维修时间是 k 天,在维修期间不能生产, ...
- python 面向对象 isinstance
查看某个对象是否 这个类实例 是返回True 否则返回False class Foo(object): pass obj = Foo() class Boo(object): pass print(i ...
- Java模板模式
模板类 package com.ietree.designpattern.template; /** * 模板类 * * @author Root */ public abstract class S ...
- sublime text 2windows下常用快捷键
Ctrl + X 删除行 Ctrl + L 选取行 Ctrl + Shift + M 选取括号内的所有东西 Ctrl + Shift + D 复制行 Ctrl + Enter 插入下一行 Ctrl + ...
- web前端几个小知识点笔记
1.css实现宽度是百分比的盒子为正方形 <div style="width:50%;padding-bottom:50%;height:0px;background:#ccc;&qu ...
- 337BRoutine Problem
/*给出你图片的长和宽的比例a:b 和摄像头的比例c:d,然后叫你求最后将图片放进摄像头 以后,剩余的面积比上摄像头的总面积,注意要化简为最简形式,而且摄像头要设置成至少一条边和图片相等 做法:先将两 ...
- 前端学习笔记之CSS网页布局
CSS网页布局 阅读目录 一 网页布局方式 二 标准流 三 浮动流 四 定位流 一 网页布局方式 #1.什么是网页布局方式 布局可以理解为排版,我们所熟知的文本编辑类工具都有自己的排版方式,比如w ...
- Python面试题目之列表取值超出范围
# 下面列表取值超出范围,会报错还是有返回值: L1 = [',]print(L1[10]) print(L1[10:]) 第一个打印会报错: 第二个打印会返回一个空列表
- Applet再学习
ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...
- Git-时光穿梭【转】
本文转载自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 时光穿梭机 我们已经成 ...