[C#基语法]之C#类和结构你真的都懂了吗?
系列文章导航
[C#基语法]苏飞传奇版 http://www.sufeinet.com/thread-3091-1-1.html
释义
类和结构实际上都 是创建对象的一个模板,每一个对象都包含相同或者不同的数据,并且提供一系列处理这些数据的方法。类规定每个对象(实例)可以包含什么数据,什么功能。
例如,如果一个类表示一个学生,我们可以定义字段ClassID,ClassName,Name,Sex用于表示学生的信息。还可以定义处理存储 在这些字段中数据的功能,
然后就可以实例化类的对象,用于表示某个学生,并为实例设置这些字段的值 ,使用其功能。
如下代码[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace School
{
/// <summary>
/// 学生信息类
/// </summary>
public class Student
{
/// <summary>
/// 学生班级ID
/// </summary>
public int ClassID { get; set; }
/// <summary>
/// 班级名
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 学生名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 性别
/// </summary>
public string Sex { get; set; }
}
}
结构与类的本质区别在于它们在内存中的存储方式不同
类-存储 在堆(heap)上的引用类型,而结构是存储在堆栈(stack)上的值类型,关于值类型和引用类型我就不多说了,之前的文章中有提到,大家可以直接去看
大多数情况下类要比结构常用的多
类的成员
在一个类中我们把类的数据和函数称为类的成员。
我们先来说第一个成员“数据成员”
数据成员主要是指包含了类数据的字段、常量、事件,这个成员可以是静态数据,也可以是实例数据,通常,对于面向对象的语言,类成员总是实例成员,除非用static进行显式声明。
字段指的是与类相关的变量。
类的成员或者是静态成员 (static member),或者是实例成员 (instance member)。静态成员属于类,实例成员属于对象(类的实例)。 下表提供了类所能包含的成员种类的概述。
成员 | 说明 | 常量 | 与类关联的常数值 | 字段 | 类的变量 | 方法 | 类可执行的计算和操作 | 属性 | 与读写类的命名属性相关联的操作 | 索引器 | 与以数组方式索引类的实例相关联的操作 | 事件 | 可由类生成的通知 | 运算符 | 类所支持的转换和表达式运算符 | 构造函数 | 初始化类的实例或类本身所需的操作 | 析构函数 | 在永久丢弃类的实例之前执行的操作 | 类型 | 类所声明的嵌套类型 |
可访问性
类的每个成员都有关联的可访问性,它控制能够访问该成员的程序文本区域。有五种可能的可访问性形式。下表概述了这些可访问性。
可访问性 | 含义 | public | 访问不受限制 | protected | 访问仅限于此类和从此类派生的类 | internal | 访问仅限于此程序 | protected internal | 访问仅限于此程序和从此类派生的类 | private | 访问仅限于此类 |
成员函数和封装
类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。 成员变量是对象的属性(从设计角度),且它们保持私有来实现封装。这些变量只能使用公共成员函数来访问。 让我们使用上面的概念来设置和获取一个类中不同的类成员的值: [C#] 纯文本查看 复制代码 using System;
namespace BoxApplication
{
class Box
{
private double length; // 长度
private double breadth; // 宽度
private double height; // 高度
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
public double getVolume()
{
return length * breadth * height;
}
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 声明 Box1,类型为 Box
Box Box2 = new Box(); // 声明 Box2,类型为 Box
double volume; // 体积
// Box1 详述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 详述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1 的体积
volume = Box1.getVolume();
Console.WriteLine("Box1 的体积: {0}" ,volume);
// Box2 的体积
volume = Box2.getVolume();
Console.WriteLine("Box2 的体积: {0}", volume);
Console.ReadKey();
}
}
}
C# 中的析构函数
类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行。 析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。 析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。 下面的实例说明了析构函数的概念: [C#] 纯文本查看 复制代码 using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine("对象已创建");
}
~Line() //析构函数
{
Console.WriteLine("对象已删除");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度: {0}", line.getLength());
}
}
}
|