转自
http://www.cnblogs.com/gsk99/archive/2011/05/20/1904552.html
class和struct最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别。
什么是class?
class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。在.NET中,所有的类都最终继承自System.Object类,因此是一种引用类型,也就是说,new一个类的实例时,在堆栈(stack)上存放该实例在托管堆(managed heap)中的地址,而实例的值保存在托管堆(managed heap)中。
什么是struct?
struct(结构)是一种值类型,用于将一组相关的变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例在创建时分配在线程的堆栈(stack)上,它本身存储了值。所以在使用struct时,我们可以将其当作int、char这样的基本类型类对待。
1,class 是引用类型,structs是值类型
既然class是引用类型,class可以设为null。但是我们不能将struct设为null,因为它是值类型。
namespace Ax
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
structA x = null; //错误 :无法将 Null 转换成“structA”,因为它是一种不可以为 null 值的类型
classA y = null;
}
}
}
public struct structA
{
public int A;
}
public class classA
{
public int A;
}
2,当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上
3,你使用的是一个对class实例的引用。而你使用的不是对一个struct的引用。(而是直接使用它们)
4,当我们将class作为参数传给一个方法,我们传递的是一个引用。struct传递的是值而非引用。
5,structs 不可以有初始化器,class可以有初始化器。
public struct structA
{
//public int A = 90; //错误:“structA.A”: 结构中不能有实例字段初始值
public int A;
}
public class classA
{
public int A = 90;
}
6,Classes 可以有明显的无参数构造器,但是Struct不可以
public struct structA
{
//public int A = 90; //错误:“structA.A”: 结构中不能有实例字段初始值
public int A;
//public structA() //错误:结构不能包含显式的无参数构造函数
//{
// this.A = 0;
//}
public structA(int paraA) //ok
{
this.A = paraA;
}
}
public class classA
{
public int A = 90;
public classA()
{
this.A = 90;
}
}
7,类使用前必须new关键字实例化,Struct不需要
public Form3()
{
InitializeComponent();
//structA x = null; //错误 :无法将 Null 转换成“structA”,因为它是一种不可以为 null 值的类型
structA x;
x.A = 8;
structA x2 = new structA();
x2.A = 32;
classA y = null;
classA y1 = new classA();
y1.A = 4;
classA y2;
//y2.A = 5;//错误:使用了未赋值的局部变量“y2”
}
8,class支持继承和多态,Struct不支持. 注意:但是Struct 可以和类一样实现接口
9,既然Struct不支持继承,其成员不能以protected 或Protected Internal 修饰
10,Class的构造器不需要初始化全部字段,Struct的构造器必须初始化所有字段
public struct structA
{
public int A;
public int B;
public structA(int paraA, int paraB) //ok
{
this.A = paraA;
this.B = paraB;
}
//public structA(int paraA) //ok
//{
// this.A = paraA;
// this.B = paraA;
//}
//public structA(int paraA, int paraB) //错误:在控制返回调用方之前,字段“structA.B”必须被完全赋值
//{
// this.A = paraA;
//}
}
public class classA
{
public int A = 90;
public int B;
public classA()
{
this.A = 90;
}
}
11,Class可以定义析构器,但是Struct不可以
12,Class比较适合大的和复杂的数据,Struct适用于作为经常使用的一些数据组合成的新类型。
适用场合:Struct有性能优势,Class有面向对象的扩展优势。
用于底层数据存储的类型设计为Struct类型,将用于定义应用程序行为的类型设计为Class。如果对类型将来的应用情况不能确定,应该使用Class。
分享到:
相关推荐
Struct 、Class、Interface、Abstract各个的特性、应用场景等对比
在C#编程语言中,结构(struct)是一种值类型,与类(class)不同,它在内存中的存储方式和行为有所区别。本文将深入探讨结构的两种初始化方式:部分初始化和完全初始化,并通过实例分析其特点和注意事项。 首先,...
翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。 结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型...
总结一下,C++和C#在struct数据传递上的关键区别在于: 1. **值类型**:两者都使用struct作为值类型,意味着默认情况下,传递的是struct的副本。 2. **拷贝性能**:在C#中,对于大struct,值拷贝可能引起性能问题,...
与类(class)不同,struct是栈分配的,而类是堆分配的。在某些场景下,比如处理大量小对象或者需要高效内存操作时,使用struct会更加合适。本主题将深入探讨如何在C#中将字符串(String)复制到结构体(struct)中...
C++的struct与class主要区别在于默认访问权限,但在C#中,struct和class有本质的内存管理差异。 6. 语法差异:包括数组声明、switch语句、运算符重载、构造函数、异常处理等方面,C#都具有更为严谨和安全的规则,...
7. 枚举与结构:文档中提到了C#的枚举(enum)类型和Java中的等效概念,以及C#的结构(struct)类型和Java中的类(class)。 8. 控制流语句:涉及到Java的“switch”语句和C#的相似之处,以及“if”和“try”语句的...
C#中的结构体(Struct)是一种值类型,它们在内存中的布局与类(Class)有所不同。内存布局对程序性能有着直接影响,特别是在处理大量数据或低级别优化时。本篇文章将详细探讨C# Struct的内存布局问题。 首先,C#...
23. **结构(Struct)与类(Class)**: 结构是值类型,存储在栈中,而类是引用类型,存储在堆中。C#的结构与Java的类在内存管理和继承规则上有显著区别。 理解这些差异可以帮助开发者根据项目需求选择合适的语言...
这两种类型的差异在程序设计与优化中扮演着关键角色,了解它们的区别对于提高代码质量和性能至关重要。 ### 引用类型 引用类型在C#中主要包括类(class)、接口(interface)、数组、委托(delegate)以及字符串...
与类(class)不同,结构体是存储在栈中或者是内联存储在包含它的对象中,这使得结构体在内存分配和销毁时具有更高的效率。 1. 结构体的定义与初始化: 结构体可以通过`public struct`关键字进行定义,与类相似,...
C#的结构体与类(class)的区别在于内存管理:结构体是值类型,而类是引用类型。以下为C#的结构体示例: ```csharp public struct MyStruct { public int Value1; public string Value2; } ``` 在比较这三种语言...
结构体(struct)和类(class)在C#中都是用来定义自定义类型的方式之一,但它们之间有重要区别: - **结构体**:主要用于表示小的、简单的数据结构,如坐标点、颜色等,它是值类型,因此每次赋值都会复制整个...
在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和操作方式上有着显著的差异。了解这些差异对于编写高效、安全的代码至关重要,尤其是在处理大量数据或复杂对象时。 首先,让我们来探讨值...
3. struct和class的区别 struct和class都是用于定义数据结构的,但是它们有着不同的特点。struct是值类型,class是引用类型。struct不能继承自类,但是可以实现接口。class可以继承自抽象类和实现接口。 4. try-...
class a{}; struct a{}; 结构体也可以在名字前面加入控制访问符. public struct student{}; internal struct student{}; 如果结构体student没有publice或者internal的声明 类program就无法使用student结构定义 obj...