【C#】第3章学习要点(二)自定义类和结构
分类:C#、VS2015
创建日期:2016-06-19
使用教材:(十二五国家级规划教材)《C#程序设计及应用教程》(第3版)
一、要点概述
别人提供的类都是为了简化你的工作量用的,可是实际处理的事情千差万别,要通过写代码做实际的事,你还得自己定义类。因此,先把如何自定义类及其涉及的相关概念和要点掌握住,是写程序绕不过去的第一关。
二、类和成员的基本概念
1、基本格式
[访问修饰符] [static] class 类名 [: 基类 [,接口序列]]
{
[类成员]
}
要点:
(1)基类最多只能有一个。如果不定义基类,默认继承自System类。
(2)类成员包括字段、属性、构造函数、方法、事件、运算符、索引器、析构函数等。
(3)绝大多数情况下都不需要定义析构函数。只有在自己定义需要回收的资源而不是靠垃圾回收来自动对其进行清理时才需要定义析构函数。
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Person
{
private static int n = 1;
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public Person()
{
Console.WriteLine($"第{n++}次调用");
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person() { Name = "张三", Age = 20 };
Console.WriteLine($"姓名:{p1.Name},年龄:{p1.Age}");
Person p2 = new Person() { Name = "李四", Age = 22 };
Console.WriteLine($"姓名:{p2.Name},年龄:{p2.Age}"); Console.ReadLine();
}
}
}
2、访问修饰符
(1)基本访问修饰符
public:类的内部和外部代码都可以访问。
private:类的内部可访问,类的外部无法访问。如果省略类成员的访问修饰符,默认为private。
internal:同一个程序集中的代码都可以访问,程序集外的其他代码无法访问。如果省略类的访问修饰符,默认为internal。
protected:类的内部或者从该类继承的子类可以访问。
protected internal:从该类继承的子类或者从另一个程序集中继承的类都可以访问。
(2)特殊访问修饰符
当将同一个类用多个不同的文件来分别描述时,还可以在基本访问修饰符的后面同时加上partial修饰符。比如多人同时写同一个类时就可以这样用。
编译器编译源程序时,会自动将其合并到同一个类中。
3、构造函数
要点:
(1)构造函数是创建对象时自动调用的函数。一般在构造函数中做一些初始化工作,或者做一些仅需执行一次的特定操作。
(2)构造函数没有返回类型,并且它的名称与其所属的类的名称相同。
(3)构造函数可重载。
(4)在扩充类的构造函数中调用基类提供的方法时,用“base.方法名”实现。
4、静态类和静态方法
要点:
(1)可以在方法名的前面加上static表明这是一个静态方法。
(2)可以在class的前面加上static表明所定义的类是一个静态类。在这种情况下,该类中的所有成员都必须是静态的(都必须带有static修饰符)。
(3)在C#语言中,通过“类名.方法名”来调用静态方法,通过“实例名.方法名”来调用实例方法。
(4)静态方法可以被重载但不能被重写。
注意:
(1)声明为static的成员在内存中只有一份。
(2)首次调用时加载到内存,所有成员都不再调用时从内存中移除,这些工作都是由垃圾回收器自动完成的。
5、属性
要点:
(1)属性(property)是字段的扩展,用于提供对字段读写的手段。
(2)属性和字段的区别是属性不表示存储位置,而是通过get访问器和set访问器指定读写字段的值时需要执行的语句。根据使用情况不同,可以只提供get访问器或者只提供set访问器,也可以两者同时提供。
(3)基本用法示例:
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public int Grade { get; private set; }
6、方法
要点:
(1)定义方法时,在参数名的前面可以使用的关键字有:
ref、out、params
(2)如果定义方法时不在参数名的前面添加关键字,一定要注意默认情况下值类型和引用类型的调用区别。
(3)方法重载
指具有相同的方法名,但“参数类型”或“参数个数”不完全相同的多个方法可以同时出现在同一个类中。在项目开发过程中,很多方法都需要使用方法重载来实现。
7、事件
事件是靠委托来实现的。由于项目中会大量使用委托和事件完成各种功能,因此后面用单独的一章介绍它。
8、类的封装、继承和多态性
属于高级用法,与编程经验关系很大,是初学者的难点但也是项目中最能体现核心技术的优势和差别的地方。
(1)封装
抽象类:用abstract关键字声明。抽象就是把公用的东西抽取出来放到一个单独的类中,这样既可以要求扩充类必须实现某些在抽象类中仅有声明没有实现的方法,也可以在抽象类中直接实现某些大家公用的方法。
密封类:用sealed关键字声明。在类的定义中使用该关键字表明该类不能被继承,在方法的定义中使用该关键字表明该方法不能被重写。
(2)继承
继承的目的是为了避免重复写相同的代码。如果用不太严谨的说法来描述它,可将其理解为对要处理的事情分层管理。
要注意继承中构造函数的处理。
(3)多态
注意下列关键字的用法:
virtual、override:基类的方法定义中用virtual表示该方法可以被扩充类重写,扩充类中用override表示该方法重写的是基类中同名的方法。
new:基类的方法定义中没有用virtual声明(即:不允许被重写),但是你仍然需要重写它,此时可以用这个关键字。
三、自定义结构
要点:
(1)自定义结构时,用struct关键字。从定义形式上看,它和类的区别仅有一个单词不一样(结构用struct关键字声明,而类用class关键字声明),其他都一样。
(2)结构不能被继承。
(3)结构和类的区别在于执行时的性能:结构的变量值都是在栈中保存的(速度快),而类的变量值都是在堆中保存的(慢一点)。
(4)凡是自定义的结构,都可以用自定义的类来实现。如果搞不清用结构好还是用类好,那就暂不考虑性能,全部都用类来实现就行了。随着开发经验的增加,你以后自然会理解哪些情况下应该用结构来实现。
【C#】第3章学习要点(二)自定义类和结构的更多相关文章
- 【C#】第3章学习要点(一)--整体把握
分类:C#.VS2015 创建日期:2016-06-18 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.使用别人已经设计好的类简化你的代码编写工作量 当让你去 ...
- 【C#】1.1 第1章学习要点
分类:C#.VS2015 创建日期:2016-06-14 教材:十二五国家级规划教材<C#程序设计及应用教程>(第3版) 一.配套源程序(VS2015版)的运行截图 VS2015版的配套源 ...
- UML学习(二)-----类图
UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...
- ExtJS学习(一)Ext自定义类实现
工作中项目需要extjs,所以学习一下,做个笔记防止遗忘了.以后回忆起来也方便. 首先下载extjs官网地址:http://extjs.org.cn/ 下载以后的目录结构: 先写一个入门的程序吧自定义 ...
- Java学习笔记day06_自定义类_ArrayList
1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...
- [翻译] 编写高性能 .NET 代码--第五章 通用编码与对象设计 -- 类 vs 结构体
本章介绍了本书其它部分未涉及到的一些编码和设计原则.包含了一些.NET的应用场景,有些不会造成太大危害,有些则会造成明显的问题.剩下的则根据你的使用方法会产生不同的效果.如果要对本章节出现的原则做一个 ...
- 【C#】第2章学习要点
分类:C#.VS2015 创建日期:2016-06-15 教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.本章要点 C#数据类型分两大类:值类型.引用类型. 值类型 ...
- 【C#】第3章学习要点(三)--常用类和结构的用法
分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.DateTime结构和TimeSpan结构 DateT ...
- Android 学习笔记二 自定义按钮形状 颜色 点击渐变
问题:自定义按钮的颜色 形状弧度 渐变效果 1.新建自定义属性button_login.xml (借鉴某大神) <?xml version="1.0" encoding=& ...
随机推荐
- 自制C#版3DS文件的解析器并用SharpGL显示3DS模型
自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...
- 解决方法of未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
在开发的一个报表转换功能涉及到Excel97-2003(.xls)文件的导入.使用oledb来读取excel数据.代码为: public static DataSet LoadDataFromExce ...
- Redis总结笔记(二):C#连接Redis简单例子
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/113.html?1455860686 注:C#在调用Redis是不要使用S ...
- Java线程:线程状态的转换
Java线程:线程状态的转换 一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已 ...
- js的基本语句和语法
字符串赋值:把字符串用双引号或单引号引起来,在(js.php)中:二.类型转换;parseint():转整数.parsefloat转小数:强制转换三.运算符表达式1数序运算:加减乘除 %取余:2逻 ...
- salesforce 零基础开发入门学习(十四)salesforce中工厂模式的运用
提到工厂模式,想必大家都很熟悉,工厂模式作为一种设计模式,同样在salesforce中适用. 举一个例子,笔作为基类,可以有钢笔,铅笔,圆珠笔等等.有一个笔的工厂,当你向它要钢笔,它就会生产一支钢笔; ...
- hdu1962Corporative Network带权回路
/* 有N个企业,每个企业想要实现通信,要用线路来连接,线路的长度为abs(a-b)%1000; 如果企业a 链接到了企业b 那么b就是the center of the serving! 然后有两种 ...
- asp.net mvc笔记一,最小的MVC工程
Asp.net MVC项目默认会引用很多第三方插件,特别是现在的5.0,默认示例项目就几十M,搞得都不知道那些才是MVC必须的,是重点,那些是可有可无的. 今天我们就来试验一下,看看一个最小的MVC工 ...
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- 面试准备 - 最大堆的Csharp实现
面试中最常见的问题之一...在N个数中间寻找前K大个元素 最常见的解法就是最大堆 时间复杂度O(N*log(K)) 空间复杂度O(k) 实现了一个最简单的最大堆,每次有元素进来都和堆顶元素比较一下,如 ...