`

C#中Struct与Class的区别

    博客分类:
  • C#
 
阅读更多
转自
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区别与关系

    Struct 、Class、Interface、Abstract各个的特性、应用场景等对比

    C#中结构(struct)的部分初始化和完全初始化实例分析

    在C#编程语言中,结构(struct)是一种值类型,与类(class)不同,它在内存中的存储方式和行为有所区别。本文将深入探讨结构的两种初始化方式:部分初始化和完全初始化,并通过实例分析其特点和注意事项。 首先,...

    区分C# 中的 Struct 和 Class

    翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。 结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型...

    2.1.3 C++和C#数据传递 -struct类型传递

    总结一下,C++和C#在struct数据传递上的关键区别在于: 1. **值类型**:两者都使用struct作为值类型,意味着默认情况下,传递的是struct的副本。 2. **拷贝性能**:在C#中,对于大struct,值拷贝可能引起性能问题,...

    使用C#拷贝String到struct.rar_struct

    与类(class)不同,struct是栈分配的,而类是堆分配的。在某些场景下,比如处理大量小对象或者需要高效内存操作时,使用struct会更加合适。本主题将深入探讨如何在C#中将字符串(String)复制到结构体(struct)中...

    C++和C#的却别与各自的用法

    C++的struct与class主要区别在于默认访问权限,但在C#中,struct和class有本质的内存管理差异。 6. 语法差异:包括数组声明、switch语句、运算符重载、构造函数、异常处理等方面,C#都具有更为严谨和安全的规则,...

    JAVA与C#相同与区别.pdf

    7. 枚举与结构:文档中提到了C#的枚举(enum)类型和Java中的等效概念,以及C#的结构(struct)类型和Java中的类(class)。 8. 控制流语句:涉及到Java的“switch”语句和C#的相似之处,以及“if”和“try”语句的...

    C# Struct的内存布局问题解答

    C#中的结构体(Struct)是一种值类型,它们在内存中的布局与类(Class)有所不同。内存布局对程序性能有着直接影响,特别是在处理大量数据或低级别优化时。本篇文章将详细探讨C# Struct的内存布局问题。 首先,C#...

    C#与Java的区别

    23. **结构(Struct)与类(Class)**: 结构是值类型,存储在栈中,而类是引用类型,存储在堆中。C#的结构与Java的类在内存管理和继承规则上有显著区别。 理解这些差异可以帮助开发者根据项目需求选择合适的语言...

    C#中引用类型和值类型的区别

    这两种类型的差异在程序设计与优化中扮演着关键角色,了解它们的区别对于提高代码质量和性能至关重要。 ### 引用类型 引用类型在C#中主要包括类(class)、接口(interface)、数组、委托(delegate)以及字符串...

    浅析C# 结构体struct

    与类(class)不同,结构体是存储在栈中或者是内联存储在包含它的对象中,这使得结构体在内存分配和销毁时具有更高的效率。 1. 结构体的定义与初始化: 结构体可以通过`public struct`关键字进行定义,与类相似,...

    VB C/C++ C#中自定义数据结构源码

    C#的结构体与类(class)的区别在于内存管理:结构体是值类型,而类是引用类型。以下为C#的结构体示例: ```csharp public struct MyStruct { public int Value1; public string Value2; } ``` 在比较这三种语言...

    c#中常见的问题

    结构体(struct)和类(class)在C#中都是用来定义自定义类型的方式之一,但它们之间有重要区别: - **结构体**:主要用于表示小的、简单的数据结构,如坐标点、颜色等,它是值类型,因此每次赋值都会复制整个...

    C#值类型与引用类型区别

    在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和操作方式上有着显著的差异。了解这些差异对于编写高效、安全的代码至关重要,尤其是在处理大量数据或复杂对象时。 首先,让我们来探讨值...

    c#面试题集锦

    3. struct和class的区别 struct和class都是用于定义数据结构的,但是它们有着不同的特点。struct是值类型,class是引用类型。struct不能继承自类,但是可以实现接口。class可以继承自抽象类和实现接口。 4. try-...

    C#结构体特性及与类的区别

    class a{}; struct a{}; 结构体也可以在名字前面加入控制访问符. public struct student{}; internal struct student{}; 如果结构体student没有publice或者internal的声明 类program就无法使用student结构定义 obj...

Global site tag (gtag.js) - Google Analytics