类是引用类型,是保存在托管堆中的。通过定义类,我们可以在数据的生存期上得到很高的灵活性,但是也会让程序的性能有一定的损失。虽然这种损失很小,但当我们只需要定义一个很小的结构时,用类来定义就有些浪费,对于这样的问题,C#有相对应的方案来解决,那就是-结构(struct)。

结构(struct)是一种值类型。也就是说,结构实例是分配在线程堆栈上的,结构本身是包含有值的,而不是像类一样的引用类型,包含的是所指向堆当中的引用(指针)。也就是说,结构的生存周期与简单类型(int,double等)相同的。所以说我们在定义较小的类时,可以尽量使用结构。

结构与类的区别:

(1)结构是值类型,不是引用类型。

(2)结构可以继承接口,但是不可以继承类或结构。

(3)结构的构造方法的工作方式有所不同,只能声明带参数的构造方法,且不能声明析构方法。

(4)可以指定字段如何在内存中布局。

什么时候使用(struct)结构:

虽然我们可以用(class)类完全代替(struct)结构,但是为了程序的性能的提高,建议大家在实现一个用于存储数据或数据量较小的结构时来使用结构,因为结构是值类型,所以在性能的影响上,是能起到正面作用的。

MSDN中的定义:

A struct type is a value type that can contain constructors, constants, fields, methods, properties, indexers, operators, events, and nested types.

Example 1

This example demonstrates struct initialization using both default and parameterized constructors.

// keyword_struct.cs

// struct declaration and initialization

using System;

public struct Point

{

public int x, y;

public Point(int p1, int p2)

{

x = p1;

y = p2;

}

}

class MainClass

{

public static void Main()

{

// Initialize:

Point myPoint = new Point();

Point yourPoint = new Point(10,10);

// Display results:

Console.Write("My Point:   ");

Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y);

Console.Write("Your Point: ");

Console.WriteLine("x = {0}, y = {1}", yourPoint.x, yourPoint.y);

}

}

Output

My Point:   x = 0, y = 0

Your Point: x = 10, y = 10

Example 2

This example demonstrates a feature that is unique to structs. It creates a Point object without using the new operator. If you replace the word struct with the word class, the program won't compile.

// keyword_struct2.cs

// Declare a struct object without "new"

using System;

public struct Point

{

public int x, y;

public Point(int x, int y)

{

this.x = x;

this.y = y;

}

}

class MainClass

{

public static void Main()

{

// Declare an object:

Point myPoint;

// Initialize:

myPoint.x = 10;

myPoint.y = 20;

// Display results:

Console.WriteLine("My Point:");

Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y);

}

}

Output

My Point:

x = 10, y = 20

---------------------------------------------------------------------------------------------------------------------------------------------------------

区别:详见http://www.cnblogs.com/gsk99/archive/2010/12/13/1904552.html

1,class 是引用类型,structs是值类型

既然class是引用类型,class可以设为null。但是我们不能将struct设为null,因为它是值类型。

struct AStruct

{

int aField;

}

class AClass

{

int aField;

}

class MainClass

{

public static void Main()

{

AClass b = null; // No error.

AStruct s = null; // Error [ Cannot convert null to 'AStruct'because it is a value type ].

}

}

2,当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上

3,你使用的是一个对class实例的引用。而你使用的不是对一个struct的引用。(而是直接使用它们)

4,当我们将class作为参数传给一个方法,我们传递的是一个引用。struct传递的是值而非引用。

5,structs 不可以有初始化器,class可以有初始化器。

class MyClass

{

int myVar =10; // no syntax error.

public void MyFun( )

{ // statements }

}

struct MyStruct

{

int myVar = 10; // syntax error.

public void MyFun( )

{// statements }

}

6,Classes 可以有明显的无参数构造器,但是Struct不可以

class MyClass

{

int myVar = 10;

public MyClass( ) // no syntax error.

{

// statements

}

}

struct MyStruct

{

int myVar;

public MyStruct( ) // syntax error.

{

// statements

}

}

7,类使用前必须new关键字实例化,Struct不需要

MyClass aClassObj;     // MyClass aClassObj=new MyClass(); is the correct format.aClassObj.

myVar=100;//NullReferenceException(because aClassObj does not contain a reference to an object of type myClass).

MyStruct aStructObj;

aStructObj.myVar=100; // no exception.

8,class支持继承和多态,Struct不支持. 注意:但是Struct 可以和类一样实现接口

9,既然Struct不支持继承,其成员不能以protected 或Protected Internal 修饰

10,Class的构造器不需要初始化全部字段,Struct的构造器必须初始化所有字段

class MyClass    //No error( No matter whether the Field ' MyClass.myString ' is initialized or not ).

{

int myInt;

string myString;

public MyClass( int aInt )

{    myInt = aInt;    }

}

struct MyStruct    // Error ( Field ' MyStruct.myString ' must be fully assigned before it leaves the constructor ).

{

int myInt;

string myString;

public MyStruct( int aInt )

{

myInt = aInt;

}

}

11,Class可以定义析构器,但是Struct不可以

12,Class比较适合大的和复杂的数据,Struct适用于作为经常使用的一些数据组合成的新类型。

适用场合:Struct有性能优势,Class有面向对象的扩展优势。

用于底层数据存储的类型设计为Struct类型,将用于定义应用程序行为的类型设计为Class。如果对类型将来的应用情况不能确定,应该使用Class。

在什么情况下使用struct,struct与class的区别的更多相关文章

  1. FAQ:什么情况下使用 struct ?

    问: 什么情况下使用 struct ? 答: 使用 struct 有几个前提(必须全部满足): 容忍 struct 本身的限制,如:不能继承. 值语义. 足够小(<=16字节). 如果 stru ...

  2. c#中结构体(struct)和类(class)的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  3. av_interleaved_write_frame 网络不好的情况下返回较慢

    用libvlc做直播推流引擎在网络较差的情况下,需要关闭直播,并且重新开播.这个过程中,推流引擎重启,需要的是快速响应.实际上测试结果发现,经常会发生引擎关闭接口卡住.后来跟踪代码,定位到s_rtmp ...

  4. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  5. [httpd] httpd server 在低负载的情况下对SYN无响应

    如题: 两台client通过load balance访问httpd server.两个client交互访问.load balance处于fullnat模式. server在低负载情况下,常常对某一个c ...

  6. (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?

    转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...

  7. 无归档情况下使用BBED处理ORA-01113错误

    在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...

  8. mysql什么情况下会触发表锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  9. KVM虚拟机内无agent情况下的监控方法

    KVM虚拟机内无agent情况下的监控(ceilometer实现) 今天看到大家在群里讨论KVM虚拟机的监控问题,而且是要求VM内无agent情况下的监控.这方面确实没有深入研究,但尚有些openst ...

  10. C++对象模型——&quot;无继承&quot;情况下的对象构造(第五章)

    5.1 "无继承"情况下的对象构造 考虑以下这个程序片段: 1 Point global; 2 3 Point foobar() 4 { 5 Point local; 6 Poin ...

随机推荐

  1. [转] stat命令输出结果中, Access,Modify,Change的含义

    先建立一个空白文件a.txt 1 [emduser@emd tmp]$ touch a.txt 2   3 [emduser@emd tmp]$ ls -al a.txt 4   5 -rw-rw-r ...

  2. [转] GDB attach

    转:http://blog.csdn.net/wangeen/article/details/14230171 attach是GDB一种重要的debug模式,在MPI程序debug中发挥重要的作用. ...

  3. php递归json类实例代码

    这篇文章主要介绍了php递归json类的实现方法,可以实现对索引数组及数字数组的解析,进而实现递归数组返回json字符串的功能.具体实现代码如下: <?php /* * @ anthor:QD ...

  4. LSI MegaCli 命令使用4

    Dell服务器常用管理命令总结准备新版本的 MegaCli-1.01.24-0.i386.rpm 会把程序安装在/opt下,可以自定义安装目录,例如:rpm --relocate /opt/=/usr ...

  5. Android集成Mina NIO Socket

    Mina简介 Apache MINA(Multipurpose Infrastructure 多功能框架 for Network Applications) 是 Apache 组织一个较新的项目,它为 ...

  6. asp.net设置元素css的属性

    controls.style.Add("css名称","css值") 添加class规则 control.cssclass="str_cssname& ...

  7. UWP APP 开发日记

    最近需要使用C#开发UWP应用,以前学习过C,这回就是快速看了一下C#的一些特别之处,然后就进入到了实战练习当中. 1.按照MSDN的教程自己搭建了一个简单的“Hello, world”应用.是使用C ...

  8. webform初识

    webform是个bs结构的程序, winform 是个cs结构的程序: aspx 是由 网页和cs代码 构成的: aspx的网页控件是 有, 服务器控件和客户端控件组成的. 客户端控件,就是HTML ...

  9. MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题

    今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...

  10. HTML中常用的列表标签