结构体 (*) 值类型

来源:互联网 发布:java thread destroy 编辑:程序博客网 时间:2024/05/16 05:13
一种值类型,不具有面向对象的特征,通常用来封装小型相关变结构体是一个值类型。(非常像类的量组 )
System.Drawing.Point、Size、Color
注意:
结构使用时可以new,也可以不new。如果不new,则使用前必须为结构成员赋值。(当结构中有属性,并且声明结构后需要使用到属性时,必须new.)
在结构中不能为变量直接赋初值,除非const、static
结构可以实现接口,但不能继承。
结构的使用方法与类很相似。什么时候使用类?什么时候使用结构?
1.是否需要使用面向对象的特性:封装、继承、多态。,如果需要在某些情况下被继承或者使用多态等特性则只能用类。
当类型中(类或结构)的成员比较多的时候,则考虑使用类。


==========================================================================
结构是使用 struct 关键字定义的,例如:
C# 
public struct PostalAddress { // Fields, properties, methods and events go here... }
结构与类共享大多数相同的语法,但结构比类受到的限制更多:
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构可以声明带参数的构造函数。
结构不能从类或其他结构继承。
结构在赋值时进行复制。将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。
结构是值类型,而类是引用类型。
与类不同,结构的实例化可以不使用 new 运算符。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
===============================================================
类和结构是 .NET Framework 中的通用类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等(本主题后面列出了这些内容)。
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为 Person 的类或结构,则 Person 为类型名称。如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种引用类型。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。

值类型:
基本数据类型 + 枚举、结构
引用类型:
类、接口、委托、string、数组
=============================结构、类的相同点与不同点===========================================================
类的优点在于它可以作为引用类型:与将结构变量与它的所有数据一起传递相比,传递引用更有效。但是,结构不要求在全局堆中分配内存。
因为不能从结构继承,结构只应当用于不需要扩展的对象。当希望创建的对象实例较小时使用结构,并要考虑类与结构之间性能特点的对比。
相同点
结构和类在以下方面相同:
两者都属于“容器”类型,这意味着它们包含其他以成员形式存在的类型。
两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序。但是,不要将这些成员与结构的声明“元素”混淆。
两者的成员可以分别有不同的访问级别。例如,一个成员可以声明为 Public,而另一个可以声明为 Private。
都可实现接口。
都有共享的构造函数,有或没有参数。
两者都可以公开“默认属性”,前提是该属性至少带有一个参数。
两者都可以声明和引发事件,而且两者都可以声明委托。
不同点
结构和类在以下方面有所不同:
结构是“值类型”,而类是“引用类型”。结构类型的变量包含此结构的数据,而不是像类类型那样包含对数据的引用。
结构使用堆栈分配,类使用堆分配。
所有的结构元素都默认为 Public;类变量和常数默认为 Private,而其他的类成员默认为 Public。类成员的这一行为提供与 Visual Basic 6.0 默认值系统的兼容。
结构必须至少具有一个非共享变量或非共享的非自定义事件元素;而类可以完全是空的。
结构元素不可声明为 Protected;类成员可以。
只有 Shared (Visual Basic)Sub 结构过程才能处理事件,并且只能使用 AddHandler 语句语句;而任何类过程都可以处理事件,并且可以使用 Handles 关键字或 AddHandler 语句。有关更多信息,请参见事件和事件处理程序。
结构变量声明不能指定初始值设定项或数组初始大小,而类变量声明可以。
结构从 System..::.ValueType 类隐式继承,不能从任何其他类型继承;而类可以从 System..::.ValueType 以外的其他任何类继承。
结构是不可继承的;而类可以继承。
结构从不终止,所以公共语言运行库 (CLR) 从不对任何结构调用 Finalize 方法;而类可由垃圾回收器 (GC) 终止,当检测到没有剩余的活动引用时,垃圾回收器将对类调用 Finalize。
结构不需要构造函数;而类需要。
结构仅当没有参数时可以有非共享的构造函数;类无论有没有参数都可以。
每一个结构都有不带参数的隐式公共构造函数。这个构造函数将结构的所有数据元素都初始化为默认值。不能重定义此行为。
实例和变量
由于结构是值类型,每个结构变量都永久地绑定到一个单独的结构实例。而类是引用类型,对象变量可在不同的时间引用各种类实例。此区别在下列方面影响结构和类的使用:
初始化。结构变量使用结构的无参数构造函数隐式包含元素的初始化。因此,Dim s As struct1 等效于 Dim s As struct1 = New struct1()。
给变量赋值。当将一个结构变量赋给另一个,或将结构实例传递给过程参数,所有变量元素的当前值都复制到新结构中。当将一个对象变量赋给另一个,或传递一个对象变量到过程,仅有引用指针被复制。
给 Nothing 赋值。您可以将值 Nothing (Visual Basic) 赋给结构变量,但实例继续保持与变量的关联。您仍可以调用变量的方法和访问它的数据元素,但赋值重新初始化了变量元素。
相比之下,如果将对象变量设为 Nothing,将其与任何类实例断开关联,在给它赋予另一个实例前,不能通过变量访问其他成员。
多个实例。一个对象变量可以有在不同时间赋给它的不同的类实例,多个对象变量可以同时引用同一个类实例。当通过指向同一实例的另一个变量访问时,更改的类成员的值会影响这些成员。
但是,结构元素独立存在于其自身实例中。更改其值不会在其他任何结构变量中反映出来,即使是在同一 Structure声明的其他实例中。
相等。两个结构的相等测试必须以逐个元素地进行测试的方式执行。可使用 Equals 方法比较两个对象变量。Equals 指示两个变量是否指向同一个实例。
0 0
原创粉丝点击