说明(2017-7-21 10:29:44):

1. 关于构造函数里的this和base,在网上查了很多资料,但都没有讲的很清楚的,或者是能让我看懂的,感觉都是叽叽歪歪,罗里吧嗦,磨磨唧唧的,有的直接就写个题目,然后贴上一段代码完事。

2. 很多人写博客,变量名起的很专业,只要是类,就要命名成xxxClass,只要是函数,就是xxxFun,比如父类就一定是BaseClass,子类就一定是SubClass。代码规范是好事,但是举例能生活化一点么?本来我就是要学习base的用法的,你给我一堆变量起名base,你可能觉得便于关联,其实并没有,只会看了眼花。

3. 还有喜欢输出英文的,比如

Console.WriteLine("sub class no argument constructor,actually call base constructor !!!");

一个字都不想看好吗?

我是来学base的,不是来学英语的,虽然也能看懂,但是心累好吗?输出这一坨有什么意义吗?我要的是一眼看过去就能明白什么意思的!你这几十行输出贴在那里,鬼知道你哪句输出了啥!

4. 只是吐槽一下,别人写篇文章也不容易,希望写文章的时候还是能照顾一下初学者、英语不好的等等。

5. 最后还是看了之前传智基础班的视频,稍微整理了一下。

首先是this,注释说的很明白了:

Student.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _01_构造函数
{
public class Student
{
//一般的构造函数,里面是一堆参数,方便实例化的时候给参数赋值(俗称初始化)
public Student(string name, int age, string gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
//带this的构造函数,借“主构造函数”(参数最多的)的参数来用,不需要的参数用任意相同类型的值来补,目的就是为了避免大括号里面每个参数再赋值一遍,造成代码冗余
public Student(string name):this(name,,"a")
{ }
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public void SayHello()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生", this.Name, this.Age, this.Gender);
}
public void SayHello2()
{
Console.WriteLine("我叫{0}",this.Name);
}
}
}

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _01_构造函数
{
class Program
{
static void Main(string[] args)
{
Student s = new Student("张三", , "男");
//s.Name = "张三";
//s.Age = 18;
//s.Gender = "男";
s.SayHello(); Student s2 = new Student("李四");
s2.SayHello2(); Console.ReadKey(); } }
}

输出:

 然后是base,注释也很详细,为了方便把两个类写一起了:

Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _02_构造函数base
{
class Program
{
static void Main(string[] args)
{
Student s = new Student("李四", , "女");
s.SayHello();
Student s2 = new Student("王五", , "男", , );
s2.SayHello2();
Console.ReadKey();
}
//Person类,这里有个地方要注意,之前偷懒不爱写字段,只写个属性。其实这样不好,因为如果只有属性,并且属性设为只读,那就没法改了,构造函数也不行。
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return age; }
//set { age = value; }
}
private string gender;
public string Gender
{
get { return gender; }
//set { gender = value; }
} //父类构造函数,有name,age,gender三个参数
public Person(string name, int age, string gender)
{
//这里用this代表本类Person,用来区分参数name,不然重名了。
//在构造函数里将参数赋值给字段,这样就可以越过只读属性,直接修改字段了。
this.name = name;
this.age = age;
this.gender = gender;
}
}
//Student类,继承Person类。如果Person类内有自己写的有参构造方法,则Student类的构造方法必须要加:base继承这个构造方法!因为默认的Student:base(空)构造方法已经被干掉了!
public class Student : Person
{
public int Chinese { get; set; }
public int Math { get; set; } //如果不加:base会提示Person不包含0个参数的构造函数。
public Student(string name, int age, string gender)//蒋坤:构造方法的定义
: base(name, age, gender)//蒋坤:构造方法的调用//base里的参数,前面Student里面写什么,这里就写什么。
{ }
public void SayHello()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生", this.Name, this.Age, this.Gender);
} //子类构造函数有chinese,math两个,必须要加上父类的构造函数,参数如果没有值的话随便写
public Student(string name, int age, string gender, int chinese, int math)
: base(gender, age, name)//base里的参数,前面Student里面写什么,这里就写什么,前提是Person类有对应的这三个参数。因为这个Person类参数少,所以就写满三个就行,不然还要补空值。
{
this.Chinese = chinese;
this.Math = math;
} public void SayHello2()
{
Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,语文{3}分,数学{4}分。", this.Name, this.Age, this.Gender, this.Chinese, this.Math);
}
}
}
}

输出:

总结:

学一个新的用法,一定要明确一点,这个用法的作用是什么?我为什么要用它?用了它有什么好处?(好吧这三点其实是一点)

首先,构造函数的作用是,给对象成员进行初始化。

然后,构造函数this和base的作用就是:

1. this相当于继承了自己类的最完整的那个构造函数,目的就是省字数。

2. base相当于继承了父类的构造函数,目的也是省字数。

C#学习笔记(18)——C#构造函数中this和base的使用的更多相关文章

  1. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...

  2. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  3. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  4. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  5. cocos2d-x学习笔记(18)--游戏打包(windows平台)

    cocos2d-x学习笔记(18)--游戏打包(windows平台)           之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...

  6. [javase学习笔记]-7.5 构造函数须要注意的几个细节

    这一节我们简单的说几个在使用构造函数时须要注意的细节. 通过我们前几节的学习,我们对构造函数有了一个比較清楚的认识,当我们在创建对象时.我们会调用构造函数.那么我们在定义和调用构造函数时.须要注意哪些 ...

  7. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  9. Android(java)学习笔记110:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  10. tornado学习笔记18 _RequestDispatcher 请求分发器

    根据Application的配置,主要负责将客户端的请求分发到具体的RequestHandler.这个类实现了HTTPMessageDelegate接口. 18.1 构造函数 定义: def __in ...

随机推荐

  1. 一步一步掌握线程机制(三)---synchronized和volatile的使用

    现在开始进入线程编程中最重要的话题---数据同步,它是线程编程的核心,也是难点,就算我们理解了数据同步的基本原理,但是我们也无法保证能够写出正确的同步代码,但基本原理是必须掌握的. 要想理解数据同步的 ...

  2. 【转】给Java说句公道话

    有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java.” 他们很惊讶:“什么?Java!” 所以我现在来解释一下. Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,人们都 ...

  3. LIGHT OJ 1199 - Partitioning Game

    传送门 1199 - Partitioning Game    PDF (English) problem=1199" style="color:rgb(79,107,114)&q ...

  4. 通过Canvas及File API缩放并上传图片完整演示样例

    创建一个只管的用户界面,并同意你控制图片的大小.上传到server端的数据,并不须要处理enctype为 multi-part/form-data 的情况.只一个简单的POST表单处理程序就能够了. ...

  5. SIMULINK的模块库介绍

    SIMILINK模块库按功能进行分为以下8类子库:Continuous(连续模块)Discrete(离散模块)Function&Tables(函数和平台模块)Math(数学模块)Nonline ...

  6. Python MySQLdb 批量插入 封装

    def insert_data_many(dbName,list_data_dict): try: # 得到列表的第一个字典集合 data_dict = list_data_dict[0] # 得到( ...

  7. 搭建MVC及WEB API项目框架时碰到的问题集合

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  8. “TableDetails”中列“IsPrimaryKey”的值为DBNull. Mysql EntityFramework

                                                                                Entity Framework连接MySQL时 ...

  9. python 元类(metaclass)

    元类参见老师的博客 http://www.cnblogs.com/linhaifeng/articles/8029564.html

  10. Oozie-coordinator调度

    当有一个复杂的工作流job,希望每天定时执行,使用crontab方式调用需要编写大量的脚本,还要通过大量的判断来控制每个工作流job的执行顺序问题.Oozie中的Coordinator可以让每个工作流 ...