目录
结构体:
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
例:
//声明一个 Book 结构:
struct Books
{
public string title;
public string author;
};
//主函数的使用
public static void Main(string[] args)
{
Books Book1; /* 声明 Book1,类型为 Book */
/* book 1 详述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
/* 打印 Book1 信息 */
Console.WriteLine( "Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
}
——————————————————————————————————————————————
c#的结构体特点:
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
- 与类不同,结构不能继承其他的结构或类。
- 结构不能作为其他结构或类的基础结构【基类】【和上条联系】。
- 结构可实现一个或多个接口。
- 结构成员不能指定为 abstract、virtual 或 protected。
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
——————————————————————————————————————————————————
引入:c#的构造函数和析构函数:
构造函数是类的一种特殊方法【也称构造方法】,每次创建类的实例都会调用它。在创建一个类的实例时,构造函数就像一个方法一样被调用,但不返回值。
简单来说,构造函数就是仅在类实例化的时候自动运行的没有返回值的方法,构造函数的作用就是在类实例化(静态类初始化)的时候将类中的字段等通过直接设置或调用其它方法等手段来设置一个默认值。
特性:
(1)其名字必须与类名相同
(2)不能被直接调用,必须通过new运算符来调用。【注意上文的结构体可以不使用new来实例化,但是必须要所有字段初始化才能使用,这里仅作一个对比记忆,构造函数和结构体并非可以比较的概念】
(3)它可以重载(一个类中可以定义不同参数个数或不同类型的构造函数)。若系统无显示定义构造函数,系统会自己生成一个缺省的构造函数(不做任何事情)。
(4)可以通过This关键字调用同一个对象中的其他构造函数,用Base关键字调用基类的构造函数。【这里是基类而非基础结构,因为结构体不可以继承或者被继承】
(5)默认的构造函数没有任何参数。但是如果您需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。这种技术可以帮助您在创建对象的同时给对象赋初始值。
例如:
public class Taxi
{
public bool isInitialized;
public Taxi()
{
isInitialized = true;//当实例化这个类时会自动调用这个构造函数,并设置相关属性
}//构造函数没有返回值
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();//对类实例化,实际上是对构造函数进行了new调用
System.Console.WriteLine(t.isInitialized);
}
}
析构函数:
析构函数是用来执行清除操作的特殊方法,如同构造函数可以自动进行对象属性的初始化一样,C#也会自动调用一 个函数注销该对象并进行资源的释放与清理工作。
语法:~<类名>()
{
//析构函数主体
}
特性:
(1)与类名相同,前加一个“~”
(2)它是无类型,无参数的。因为它只需释放资源,不用返回任何调用结果。
(3)一个类只能有一个析构函数,不能重载【构造函数可以重载,也可以有多个,两者功能截然不同,一个赋予初值,一个资源释放】
————————————————————————————————————————————————————
类 vs 结构
类和结构有以下几个基本的不同点:
- 类是引用类型【传值时为对象的引用地址】,结构是值类型【传值时为对象的拷贝】。
- 结构不支持继承。
- 结构不能声明默认的构造函数【不能包含无参的构造函数,有参数构造函数必须为所有属性赋值】【系统已经帮你创造好了默认的构造函数????】。
- 结构内声明的字段无法赋予初值。
例如:
//结构体
struct test001
{
private int aa = 1;
}
//类
class test002
{
private int aa = 1;
}
其中结构体执行以上代码将出现“结构中不能实例属性或字段初始值设定”的报错,而类中无此限制
类与结构体的选择:
类的对象是存储在堆空间中,结构存储在栈中。
堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。
故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。
当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
简单的数据结构(bool、int等)都是结构类型的,因此当我们想要声明一个新的数据类型时,往往也选择结构的方式。
结构和类的适用场合分析:
- 1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
- 2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
- 3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
- 4、大多数情况下,目标类型只是含有一些数据,或者以数据为主,选择【结构】比较好【这里是个人猜测……网上全是半截……】