ylbtech- .NET-Basic:C# 中的结构类型(struct type)

C# 中的结构类型(struct type)

1.A,相关概念返回顶部
 
  像类一样,结构(struct)是能够包含数据成员和函数成员的数据结构,但是与类不同,结构是值类型,不需要堆分配。结构类型不支持用户指定的继承,并且所有的结构类型都隐式地从类型 object 继承。
  结构是使用 struct 关键字定义的,通常用来封装小类型相关变量组,例如,矩形的坐标或商品的特征。下面的示例显示了一个简单的结构类型。
public struct Book
{
public decimal price;
public string title;
public string author;
}

  结构对于具有值语义的小型的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构类型的典型示例。对小型数据结构而言,使用结构而不是用类会大大节省应用程序分配的量。例如,下面的程序创建并初始化一个含有 100 个点的数组。对于作为类实现的 Piont,出现了 101 个实例对象,其中,数组需要一个,它的 100 个元素每一个都需要一个,具体情况看下例:

        //使用类进行“键-值”对的应用
using System;
namespace Test
{
class Piont
{
public int x, y;
public Piont(int x, int y)
{
this.x = x;
this.y = y;
}
}
class PiontClass
{
static void Main()
{
Piont[] pionts = new Piont[];
for (int i = ; i < ; i++)
pionts[i] = new Piont(i, i); }
}
}

  一种替代办法是将 Piont 定义为结构。

struct Piont
{
public int x, y;
public Piont(int x, int y)
{
this.x = x;
this.y = y;
}
}

  替换后,示例如下:

        //使用 struct 后的示例
using System;
namespace Test
{
struct Piont
{
public int x, y;
public Piont(int x, int y)
{
this.x = x;
this.y = y;
}
}
class PiontClass
{
static void Main()
{
Piont[] pionts = new Piont[];
for (int i = ; i < ; i++)
pionts[i] = new Piont(i, i); }
}
}

  现在,只有一个对象被实例化(即用于数组的那个对象),而 Piont 实例以值的形式直接内联存储在数组中。

  结构构造函数也是使用 new 运算调用,但是这并不意味着会分配内存。与动态分配对象并返回对它的引用不同,结构构造函数直接返回构造值本身(通常是堆栈上的一个临时位置),然后根据需要复制该结构值。

  对于类,两个变量可能引用同一对象,因此对一个变量进行操作可能影响另一个变量所引用的对象。对于结构,每个变量都有自己的数据副本,对一个变量操作不可能影响另一个变量。下面的代码段产生的输出取决于 Piont 是类还是构造。

  Piont a = new Piont(10,10);

  Piont b= a;

  a.x = 20;

  Console.WriteLine(b.x);

  如果 Piont 是类,将输出是 20,因为 a 和 b 引用同一对象。如果 Piont 是结构,输出将是 10,因为将 a 对 b 的赋值创建了该值的一个副本,因此接下来对 a.x 的赋值不会影响 b 这一副本。

  前一示例突出了结构的两个限制。首先,赋值整个结构常数不如复制对象引用的效率高,因此结构类型的赋值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用,这样限制了结构的应用范围。

  结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。

  结构可是实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。

作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

C# 中的结构类型(struct type)的更多相关文章

  1. C# 中的结构类型(struct)

    原文 C# 中的结构类型(struct) 简介 有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算.这种情况下,更好的做法是使用结构(struct)类型.由于 struct 是值类型,是 ...

  2. C# 8中的范围类型(Range Type)

    C# 8.0中加入了一个新的范围类型(Range Type). 这里我们首先展示一些代码,并一步一步为代码添加一些不同的东西, 为大家展示一下范围类型的功能和用法. 我们最原始的代码如下: stati ...

  3. Go语言中的结构体 (struct)

    Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...

  4. Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. C语言小结之结构类型

    C语言小结之结构类型 @刁钻的游戏 (1)枚举型类型enum COLOR {BLACK,RED,BLUE};//声明一种新的数据类型,其值分别为0,1,2但是用BLACK/RED/BLUE代表也可以这 ...

  6. C++中的结构体的认识

    C++中的结构体的认识 1. typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间. 实例像:typedef ...

  7. C结构体struct用法小结

    结构体和int,float等类型一样是一种常用的类型,它是由各种基本数据类型构成,通常包含有struct关键字,结构体名,结构体成员,结构体变量. 一.结构体定义 通常有3种定义方式,以例子方式表示: ...

  8. C语言入门-结构类型

    一.声明结构类型 #include <stdio.h> int main(int argc, char const *argv[]) { // 声明结构类型 struct date { i ...

  9. PHP处理上传文件信息数组中的文件类型 正确获取

    PHP处理上传文件信息数组中的文件类型$_FILES['type']由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠 如果是一般文件则通过 mime_con ...

随机推荐

  1. CSU-2049 象棋

    CSU-2049 象棋 Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多 ...

  2. 实战小项目之RTMP流媒体演示系统

    项目简介 windows下使用基于Qt对之前的RtmpApp进行封装与应用,单独功能使用线程执行,主要包括以下几个功能: 视频下载 推送文件 推送摄像头数据或者桌面 基于libvlc的播放器 视频下载 ...

  3. [oldboy-django][1初始django]模态对话框 + 动态加载gif (多对多数据库表)

    ajax+对话框(多对多) - 遮罩层,动态加载gif层,对话框层, a.一点击添加,绑定事件: - 出现遮罩层和动态gif层 - ajax向后台发送请求获取所有班级数据 - success,隐藏动态 ...

  4. js判断时间是否过期

    var myDate=new Date(); myDate.setFullYear(2014,2,1); //2014年3月1日 //注意:表示月份的参数介于 0 到 11 之间.也就是说,如果希望把 ...

  5. php开启子进程处理

    $pageNum = ceil($totalNum/$pageSize); for($page=1;$page<=$pageNum;$page++){ $this->o_pcntl-> ...

  6. linux 相关知识

    在mac 终端中可以直接访问ssh 命令:ssh root@127.0.0.*  批量删除文件: 当前目录下所有 *.html文件,除了index.html             [root@whr ...

  7. Codeforces #990E Post Lamp

    题目大意 今欲用若干条长为 $k$($1\le k\le m, k\in \mathbb{Z}$) 的线段覆盖数轴上 $[0,n]$ 这一段.线段的起点(左端点)必须为 $[0, n-1]$ 中的某个 ...

  8. [LOJ#2330]「清华集训 2017」榕树之心

    [LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...

  9. [JSOI2012][bzoj4332] 分零食 [FFT]

    题面 传送门 思路 首先,这个数据如果没有这么大,我们还是可以做朋友的...... 设$dp\left[i\right]\left[j\right]$代表前j个零食分给了前i个人的方案数 那么dp方程 ...

  10. BZOJ 4460 [Jsoi2013]广告计划 ——Bitset 后缀自动机

    发现n比较小,直接枚举答案,然后发现连续的一段是确定的,然后我们只需要判断每个位置是否有这个连续的一段就好了 发现起点不同,最后的位置可能会有差距,所以DP一下就好了 然后用0表示未折返,1表示从最下 ...