类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
2013-03-20 12:03
766 查看
前篇中也是老赵面试题的第一题,这篇继续,希望通过这些面试题来找到我们学习的重点,而不是背这些东西,希望以这些个点来系统的去学习.net.
类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
先看MSDN上的C# 语言规范上的定义:
类和结构是 .NET Framework 中的常规类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等.
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为 Person 的类或结构,则 Person 为类型名称。如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种“引用类型”。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
结构与类共享大多数相同的语法,但结构比类受到的限制更多
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构在赋值时进行复制。
将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如
Dictionary<string, myStruct>)时,请务必记住这一点。
结构是值类型,而类是引用类型。
与类不同,结构的实例化可以不使用 new 运算符。
结构可以声明带参数的构造函数。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
所有结构都直接继承自 System.ValueType,后者继承自 System.Object。(其实就是值类型与引用类型的区别)
结构可以实现接口。
结构可用作可以为 null 的类型,因而可向其赋 null 值。
.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?
BCL(Base
Class Library)是Dot Net Framework下所有语言使用的类库(有哪些类和结构,你就随便说吧,System名字空间的有多少啊~需要注意的是DateTime这玩意其实是一个结构体。)为什么他们不是结构(类)呢?这道题和下面的小问题其实是一个问题那就是什么时候定义结构什么时候定义类,下面一起回答
在自定义类型时,您如何选择是类还是结构?
struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个
1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。因为
.NET Framework 包含一个名为 Point 的对象,所以本示例中的结构命名为“CoOrds”。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。
除非满足一下所有条件,否则不要定义成值类型(结构体)
第一,类型具有基元类型的行为。类型简单,其中没有成员会修改类型的任何实例字段。
第二,类型不需要从其他任何类型继承。
第三,类型不会派生出其他任何类型。
除了满足以上全部条件,还必须满足以下条件中的一个。
第一,类型的实例较小(约是16字节或者更小)。
第二,类型实例较大,但不作为方法的实参传递,也不通过方法返回。
类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
先看MSDN上的C# 语言规范上的定义:
类和结构是 .NET Framework 中的常规类型系统的两种基本构造。两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含各自的方法、属性和事件等.
类或结构的声明类似于蓝图,用于在运行时创建实例或对象。如果定义一个名为 Person 的类或结构,则 Person 为类型名称。如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例。可以创建同一 Person 类型的多个实例,每个实例在其属性和字段中具有不同的值。
类是一种“引用类型”。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。
类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
结构与类共享大多数相同的语法,但结构比类受到的限制更多
在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构在赋值时进行复制。
将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。在使用值类型的集合(如
Dictionary<string, myStruct>)时,请务必记住这一点。
结构是值类型,而类是引用类型。
与类不同,结构的实例化可以不使用 new 运算符。
结构可以声明带参数的构造函数。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
所有结构都直接继承自 System.ValueType,后者继承自 System.Object。(其实就是值类型与引用类型的区别)
结构可以实现接口。
结构可用作可以为 null 的类型,因而可向其赋 null 值。
.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?
BCL(Base
Class Library)是Dot Net Framework下所有语言使用的类库(有哪些类和结构,你就随便说吧,System名字空间的有多少啊~需要注意的是DateTime这玩意其实是一个结构体。)为什么他们不是结构(类)呢?这道题和下面的小问题其实是一个问题那就是什么时候定义结构什么时候定义类,下面一起回答
在自定义类型时,您如何选择是类还是结构?
struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个
1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。因为
.NET Framework 包含一个名为 Point 的对象,所以本示例中的结构命名为“CoOrds”。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。
除非满足一下所有条件,否则不要定义成值类型(结构体)
第一,类型具有基元类型的行为。类型简单,其中没有成员会修改类型的任何实例字段。
第二,类型不需要从其他任何类型继承。
第三,类型不会派生出其他任何类型。
除了满足以上全部条件,还必须满足以下条件中的一个。
第一,类型的实例较小(约是16字节或者更小)。
第二,类型实例较大,但不作为方法的实参传递,也不通过方法返回。
相关文章推荐
- (转)类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
- (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
- 在.NET客户端程序中应用多线程目录类与结构的实例比较类与结构的差别如何选择结构还是类一
- 1.为什么需要继承?如何继承?继承到什么? 2.方法的重载与重写的区别 3.类型的自动转换和强制转换 4.子类特有的方法的调用规则 5.子类重写的方法的调用规则 6.多态的理解 7.面向对象的三大特征
- csharp类、引用类型(class)与结构、值类型(struct)的区别
- .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
- 要修改自定义结构的值,应该用Class而不是Struct
- 有哪些类加载器?解释什么是双亲委派模型,为什么使用双亲委派模型,如何自定义类加载器?什么时候应该自定义类加载器?
- C++中可以用struct和class来定义类型,这两种类型有什么区别
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
- C#中结构(struct)与类(class)的区别
- 【转载】class和struct的区别 类的内存结构
- 如何在.net开发的代码中遍历所有的图形对象,并判断是什么类型的对象!
- 关于为什么在有继承关系的类结构中,析构函数destructor要是virtual以及如果不是会发生什么
- sql如何查出某字段为空格或''但不是null的记录??还有 ‘ ’和'' 和 null 有什么区别吗??
- C++中struct与class结构的区别
- .NET中struct与class的区别
- ·C++中struct与class结构的区别
- 牛客网Java刷题知识点之什么是HTTP协议、什么是HTTP隧道、HTTP响应的结构是怎么样的、HTTP报头包含哪些、HTTP中GET与POST方法有什么区别