目录

1.类的概述

1.1 类的定义

1.2 程序和类

2.声明类(类定义)

2.1 分部类和分布类型

3.类成员

3.1 字段

3.1.1 字段的语法

3.1.2 显示字段和隐式字段的初始化

3.1.3 字段的修饰符:readonly关键字&const关键字

3.1.4 静态字段

3.2 常量

3.2.1 使用readonly关键字&const关键字来修饰字段的区别

3.3 属性

3.3.1 属性的组成

3.3.2 静态属性

3.4 构造函数

3.4.1 实例构造函数

3.4.2 静态构造函数

3.5 析构函数

3.6 索引器

3.6.1 this关键字

3.6.2 索引器的语法

4.类的实例

4.1实例化

4.1.1 实例对象

4.1.2 对象初始化语句


C#是一种面向对象的语言,这点与C语言不同,C语言是一种面向过程的语言。除此之外,面向对象的语言还有C++、Java等。而面向对象语言的一个基本特征是它们都有类,类是C#中比较复杂的数据类型。

   本章将先讲明 什么是类,并说明类由什么组成,组成类的函数成员和数据成员怎么用,接着讲如何实例一个类。


1.类的概述

就像第五章数据类型里对类型的解释一样。

带到现实中来看,大象这个物种就是一个类。大象这个物种的共同的特性(比如 年龄、分布区域、归属群落、性别,体型等)和行为(吃草、繁衍、行走、潜水等)就是类的公共属性和行为类的实例就是大象这个物种中的一头大象。

1.1 类的定义

        类是一个能存储数据并执行代码的数据结构。

        类包含数据成员和函数成员。(一个C#类可以有任意数目的数据成员和函数成员)

  • 数据成员:存储 与类或类的实例 相关的数据。数据成员通常模拟和该类所表示的现实世界事务的特性。
  • 函数成员:它执行代码。通常会模拟类所表示的现实世界的功能和操作

1.2 程序和类

一个运行中的C#程序是一组相互作用的类型对象,它们中大部分都是类的实例。


2.声明类(类定义)

类的声明定义类的特征和成员。

声明一个类并不创建类的实例,而是用于创建实例的模板。

声明类的语法:

class 大象(类的名称)     //声明类

{

string sex;                //数据成员声明(类的成员)

...

void swim(){...}      //函数成员声明(类的成员)

...

声明类必须包含:

  • 类的名称
  • 类的成员
  • 类的特征(封装、继承、多态,第十四章会讲)

2.1 分部类和分布类型

类声明可以分割为几个分布类的声明

  • 每个分布类的声明都含有一些类成员的声明。
  • 类的分布类声明可以在同一个文件中、也可以在不同文件中。

分布类的使用要求: 

  • 类声明必须加类型修饰符 partical
  • 类名称相同
  • 组成类的所有分布类声明必须在一起编译
//示例:
partical class A //类名称相同
{int a;
}partical class A
{int b;
}

3.类成员

(注意:本章主讲实例成员,静态成员放在十三章讲)

在类声明中定义的类成员有9种成员类型。

其中字段和方法是最重要的类成员类型。(本章不会介绍事件)

3.1 类成员的类型

类声明相当于蓝图,通过蓝图可以创建多个类的实例。

        通过类创建的实例,其中的类成员分为两种:实例成员和类成员。

  • 实例成员:每个类的实例都是不同的个体,它们有自己独有的一组类成员。且因为这些数据成员都和类的实例相关,所以称为实例成员。
  • 静态成员:实例成员是默认类型,但也可以声明与类而不是实例相关的成员,也就是静态成员。

3.1 字段

字段是在类或结构中直接声明的任意类型的变量。

3.1.1 字段的语法

声明字段的语法:

                                数据类型  字段名;

例如:

                                int a;

3.1.2 显示字段和隐式字段的初始化

隐式字段初始化:若字段被声明且没有被赋值,则为隐式初始化。

不同类型隐式初始化的默认值: 

  • 值类型为0
  • bool类型为false
  • 引用类型为null

3.1.3 字段的修饰符:readonly关键字&const关键字

被readonly和const修饰的字段一旦赋值便不能再被修改。

readonly关键字&const的区别:

  • 若使用readonly来修饰字段,则不需要在定义时初始化,可以在类的构造函数完成初始化。
  • 若使用const来修饰字段,如果没有在定义时初始化,就会发生编译错误。

语法:

        访问修饰符 const 数据类型 变量名=值;

        访问修饰符 readonly 数据类型 变量名;

3.1.4 静态字段

若使用static关键字修饰字段,则字段为静态字段。

静态字段被类的所有实例所共享,所有实例都访问同一内存位置。

        静态字段必须通过类来访问,不能像实例字段一样通过类的对象的实例来访问字段。

语法:

        访问修饰符 static 数据类型 变量名;        //静态字段定义

        访问修饰符 数据类型 变量名;                 //实例字段定义

实例1:

class People
{//声明静态字段public static string Name; //声明实例字段public int Age;
}class Program
{static void Main(string[] args){//实例字段通过实例对象访问People one=new People();one.Age=18;//静态字段只能通过类名访问People.Name="人类";}
}

实例2:

3.2 常量

常量就是被const修饰的字段。

常量的特点:

  • 类成员常量类似于局部变量。区别在于常量在类声明中,而局部变量在方法中。
  • 常量在堆中没有自己的存储位置,它在编译时被编译器替换。(类似C、C++中的#define)
  • 常量可以用类名直接访问。
  • 常量本质上就是静态的。

3.3 属性

        属性是对字段的扩展。

        根据面向对象语言的封装思想(见第十章),字段最好设置为private。这样能防止客户端直接对字段进行篡改,从而保证了内部成员的完整性的同时,也可以更好的为程序员提供编写的便利。而属性的作用就是为了访问类中的私有字段。

属性的语法:

        访问修饰符  数据类型  字段名{get{return 字段名;}set{字段名=value;}}

3.3.1 属性的组成

        属性由set访问器和get访问器组成。

        属性可以只包含set或get,当只包含一个访问器时,另一个可以省略、或者在前面加访问修饰符private。

属性除了开头的语法,还有三种写法:

  • 只包含get访问器,为只读属性。
  • 只包含set访问器,为只写属性。
  •  只声明属性(自动实现属性)
属性的示例:设置一个人的年龄字段,将赋值范围设置在0-150之间
public class People{//私有字段声明private int age;private string name;private string sex;private string high;//公有属性:属性类型必须和字段属性一致public  string  Age{//get访问器:负责对字段值进行读取(返回字段)get{return age;}//set访问器:负责对字段值进行赋值(把用户传入的值赋给字段)//set访问器里有隐式参数valueset{//设置年龄范围在0-150之间if(value<0 || value>150){//抛出异常代码throw(new ArgumentOutOfRangeException("AgeIntProPery"),value,"年龄必须在0-150之间"));}//value是隐式参数:表示用户传入的值age=value;}}//只读属性public string Sex{get{return sex;}}//只写属性public string Name{private get{return name;}set{name=value;}}//自动实现属性public string High{get;set;}
}

属性字段命名规范:

  • 对于私有字段,为Camle写法,即age、name这种。
  • 对于属性名,为Pascal写法,即Age、Name这种。

3.3.2 静态属性

静态属性与静态字段类似。 若用static来修饰属性,则属性为静态属性。

静态属性有以下特点:

  • 态属性属于类级别,无法通过实例对象访问。
  • 也不能访问类的实例成员,但能被实例成员访问。
  • 在类的内部,可以仅使用名称来引用静态属性
  • 在类的外部,可以通过类名或者using static结构来引用静态属性

实例:

public class People
{//静态字段public static string Name;//静态属性public static string Name{get{return Name;}set{Name = value;}}
}

3.4 构造函数

        构造函数主要用于初始化类的实例状态。当我们用构造函数创建一个对象时,构造函数会为对象分配空间,并初始化类的成员。

使用构造函数的要求:

  • 如果希望从类的外部创建类的实例,需要将构造函数声明为public
  • 构造函数名和类名相同
  • 构造函数不能有返回值

        

构造函数分为两种:实例构造函数、静态构造函数。

3.4.1 实例构造函数

实例构造函数用于创建和初始化类的实例。

其中使用new运算符创建对象的过程,其实是在调用实例构造函数来初始化类中所有实例成员。

实例构造函数的特点:

  • 构造函数可以有参数。
  • 构造函数可以进行方法重载。
  • 如果没有为类显示地定义一个构造函数,则C#编译器会自动生成一个函数体为空的默认无参的实例构造函数。如果有至少一个显示构造函数,则C#编译器不会自动生成多的构造函数。
  • 可以为构造函数添加访问修饰符。

使用实例构造函数的条件:

  • 构造函数必须和类同名。
  • 构造函数不允许有返回类型。
//实例构造函数示例:
class People
{private string name;//只读属性public string Name{get{return name;}}//实例构造函数//被public关键字修饰的构造函数,称为公共构造函数//被private关键字修饰的构造函数,称为私有构造函数public People(){name="憨憨一号";}public people(string name){//this关键字指代当前类的实例,可以理解为当前实例对象的引用。this.name=name;}
}class Program
{static void Main(string[] args){People one=new People();People two=new People("憨憨二号");Console.Writeline(one.Name);    //打印“憨憨一号”Console.Writeline(two.Name);    //打印“憨憨二号”}
}

注意:如果一个类只定义了一个或多个私有构造函数,而没有其他公共构造函数,则其他类就不能通过调用该类的私有构造函数来创建类的实例。

        私有构造函数最典型的应用是设计模式中单例模式的实现。

        单例模式C#中的一种设计模式,他是指在设计一个类时,需要保证整个程序在运行期间只存在一个实例对象。

//设计模式中单例模式的实现:
class People
{//声明私有字段private string name;//声明一个公开的、静态的、类类型的变量public static People people;//声明属性public string Name{get{return name;}}//私有构造函数,只能在类的内部调用//也就是说用私有构造函数只能在类定义时被实例化private People(){Console.Writeline("私有函数被调用");this.name="Learning Hard";}//静态方法,用于返回类的实例public static People GetInstance(){//将实例对象的引用赋值给变量people=new People();return people;}
}
class Program
{static void Main(string[] args){//通过调用GetInstance()静态方法返回一个Person的实例//此时不能使用new运算符来创建实例,即不能使用People one=new People()来创建实例People one=People.GetInstance();Console.Writeline("类实例的Name属性为{0}",one.Name);}
}

3.4.2 静态构造函数

        静态构造函数用于初始化类中的静态成员。

        在创建第一个实例或引用任何静态成员之前,CLR(公共语言运行时)都将自动调用静态构造函数。

class People
{private static string name;//声明属性public static string Name{get{return name;}}static People(){Console.WriteLine("静态函数被调用");name="Learning Hard";}}
class Program
{static void Main(string[] args){Console.WriteLine(People.Name);Console.WriteLine(People.Name);}
}

结果如下:

 从上述代码我们可知静态构造函数有以下特点:

  • 静态构造函数只会执行一次
  • 静态构造函数不能使用任何访问修饰符,也不能带任何参数
  • 不能直接调用静态构造函数
  • 在程序中,我们无法控制执行静态构造函数的时机

3.5 析构函数

        析构函数用于类销毁之前释放类实例所使用的托管和非托管资源。

析构函数的作用:

        对于C#应用程序所创建的大多数对象,都可以使用.NET框架的垃圾回收器(GC)来隐式地执行内存管理任务,但如创建了一个封装非托管资源的对象,在应用程序使用完这些非托管资源之后,垃圾回收器就需要运行对象的析构函数(即Finalize方法)来释放这些资源。

使用析构函数的要求:

  • 只能在类中使用析构函数。
  • 一个类只能有一个析构函数。
  • 无法继承或重载析构函数。
  • 无法显示地调用析构函数,由垃圾回收器自动调用。
  • 析构函数没有参数和修饰符。

代码示例:

class People
{//析构函数~People(){Console.WriteLine("析构函数被调用");}
}
//该析构函数隐式调用了基类Object的Finalize方法,上面代码中的析构函数将被隐式转化为以下代码//
//override
protectd override void Finalize()
{try{Console.WriteLine("析构函数被调用");}finally{//调用基类方法base.Finalize();}
}

3.6 索引器

        当一个类包含数组成员时,使用索引器可以大大地简化类中数组的访问。

3.6.1 this关键字

        this关键字在类中使用,是对当前实例的引用。

this关键字的使用要求:

  • 它只能出现在以下类成员的代码块中

    • 实例构造函数
    • 实例方法
    • 属性和索引器的实例访问器
  • 静态成员不是实例的一部分,所以不能在任何静态函数成员的代码中使用this关键字

this关键字的用途:

  • 用于区分类的成员和局部变量或参数
  • 作为调用方法的实参
//实例:创建一个方法,将一个恒定值与输入的值作比较,返回最大值
class Program
{private int a;//this.a为恒定值,而a为输入的形参(形参名与变量名相同是不推荐的哦)public int Add(int a){return a>this.a?a:this.a;}
}

3.6.2 索引器的语法

        索引器的定义类似属性,也具有get访问器和set访问器。

索引器的语法格式:

访问修饰符   数据类型  this[索引类型 index]

{

        get{//返回类中某个元素}

        set{//对类中数组元素赋值}

}

//其中数据类型指的是要存取的数组的类型

//索引类型表示该索引器使用哪一个类型的索引来存取数组元素(可以为整形或字符串型)

示例:索引器也是一种针对私有字段进行访问的方式

class People
{//可容纳10个整数的整数数组private int[] intarray = new int[10];//索引器的定义//this表示所操作的是类对象的数组成员(可以简单理解为索引器的名称,注意索引器不能自定义名称)public int this[int index]{get{return intarray[index];}set{intarray[index] = value;}}
}class Program
{static void Main(string[] args){People one=new People();one[0]=1;one[1]=2;one[2]=3;one[3]=4;}
}

4.类的实例

        类的声明只是用于创建类的实例的蓝图。一旦类被声明,就可以创建类的实例。

4.1实例化

        前面介绍了类中可以创建的类成员,但想要访问这些实例成员,必须通过类的实例对象来完成。而要得到一个类的实例对象,就必须先声明一个该类类型的变量,然后使用new运算符后跟类的实例构造函数来完成实例化。

4.1.1 实例对象

实例对象由变量和对象创建表达式组成。

  • 创建变量

    • 类是引用类型,其变量为数据引用和实际数据都申请了内存。
    • 此变量所分配内存是用来保存引用的。
  • 对象创建表达式
    • 对象创建表达式由关键字new后面跟一个类构造函数及其参数列表组成。
    • new运算符为任意指定类型的实例分配并初始化内存。它依据类成员类型的不同从栈和堆里分配内存。

类的实例语法: 类类型 变量 = new 类类型();

//类类型 变量                   创建变量

//new 类类型();        对象创建表达式

4.1.2 对象初始化语句

对象初始化语句扩展了创建语法,在表达式尾部放置一组成员初始化语句。

利用对象初始化语句,可以创建新的对象实例,设置字段和属性的值。

两种语法:

        new TypeName         {变量名=初始值,变量名=初始值,...}

        new TypeName(参数){变量名=初始值,变量名=初始值,...}

注意:

  • 初始化发生在构造方法执行之后,因此要注意构造方法中初始化的值可能会在之后对象初始化中重置。

 

【C#基础学习】第十一章、类相关推荐

  1. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  2. Java基础学习——第十章 枚举类注解

    Java基础学习--第十章 枚举类&注解 一.枚举类(enum) 1. 枚举类的概念 枚举类:类的对象只有有限个,确定的 线程状态:创建.就绪.运行.阻塞.死亡 当需要定义一组常量时,强烈建议 ...

  3. 鸟哥的Linux私房菜(基础篇)- 第十一章、认识与学习 BASH

    第十一章.认识与学习 BASH 最近升级日期:2009/08/25 在 Linux 的环境下,如果你不懂 bash 是什么,那么其他的东西就不用学了!因为前面几章我们使用终端机下达命令的方式,就是透过 ...

  4. Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. 网工学习 第十一章 网络管理 网络管理基础 网络管理协议五大标准 SNMP协议 RMON

    目录 第十一章 网络管理 网络管理基础 网络管理协议五大标准 SNMP协议 SNMP协议的操作 SNMPv1 SNMPv2 SNMPv3 管理数据库MIB-2 被管理 对象标识符OID RMON 第十 ...

  6. 前端基础 CSS 第十一章 使用CSS样式表 ----暑假学习第七、八天

    第十一章 使用CSS样式表 通过CSS样式定义,可以将网页制作得更加绚丽多彩.采用CSS技术,可以有效地对页面的布局.字体.颜色.背景和其他效果实现更加精确地控制.用CSS不仅可以做出令浏览者赏心悦目 ...

  7. 前端基础 CSS 第十一章 使用CSS样式表 特效属性部分 ----暑假学习第九天

    第十一章 使用CSS样式表 11.8 定位属性 使用定位属性可以控制元素的位置,包括相对定位和绝对定位两种方式.相对定位指允许元素在相对于文档布局的原始位置上进行偏移,而绝对定位是指允许元素与原始文档 ...

  8. 鸟哥的Linux私房菜(基础篇)- 第二十一章、系统配置工具(网络与打印机)与硬件侦测

    第二十一章.系统配置工具(网络与打印机)与硬件侦测 最近升级日期:2009/09/15 除了手动配置之外,其实系统提供了一个名为 setup 的命令给系统管理员使用喔!这个命令还能够配置网络呢.此外, ...

  9. Python3 基础学习笔记 C08 【类】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  10. Java语言程序设计(基础篇) 第十一章 继承和多态

    第十一章 继承和多态 11.1 引言 面向对象的编程允许你从已经存在的类中定义新的类,这称为继承. 11.2 父类和子类 1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类( ...

最新文章

  1. Create and Manage Cases
  2. 在Linux下安装配置Oracle11g R2
  3. java自己实现ioc_springioc原理、springmvc项目分析、自己实现IOC
  4. java保留二位小数_java使double保留两位小数的多方法 java保留两位小数
  5. K-Means原理及代码实现
  6. eclipse 配置maven tomcat 环境
  7. windows恶意软件删除工具 MRT.EXE
  8. win7硬盘检测工具HD tune使用
  9. LiveData原理解析
  10. VUE+WebPack游戏设计:欲望都市,构建类RPG游戏的开发
  11. Android 拍摄照片后返回缩略图的两种方法详解
  12. python数字转换成中文大写_python初学者笔记(2):阿拉伯数字转换成中文大写
  13. 潘多拉无线打印服务器设置,潘多拉(PandoraBox)系统的路由设置
  14. 企业中系统间的几种对接方式
  15. 陈一舟、开心网和域名事件
  16. 天津大学计算机网络专业排名,2019计算机考研天津大学先进网络技术与应用重点实验室简介...
  17. 木马超过病毒成为互联网安全最大隐患
  18. 交换两变量的值,不使用中间变量
  19. Tensorflow2.0 U-Net医学图像分割(胸部X光图像分割)
  20. 发送缓冲区sk_wmem_queued

热门文章

  1. rand()函数100000随机数_Excel之数学函数SQRT/MOD/EXP/LN/RAND
  2. 学习笔记之Android调用系统相册选择图片
  3. 组件化开发与资源管理
  4. xf-admin 项目简述
  5. Linux + JDK/TOMCAT/Dia(Planner)/eclipse
  6. 根据不同按钮显现不同的表格(表格为多个)
  7. 四川山海蓝图抖音是一款什么样的软件
  8. python3.7 《我们仨》摘抄写入 9 个txt
  9. C语言 char *的截取 和拼接
  10. haxe 第一期 入门骗 (谷歌翻译+转载)