struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。 尽管使用自动实现的属性将一个点表示为同样方便,但在某些情况下使用结构更加有效。 例如,如果声明一个 1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。 因为 .NET Framework 包含一个名为 Point 的对象,所以本示例中的结构命名为“CoOrds”。

 1 public struct CoOrds
2 {
3 public int x, y;
4
5 public CoOrds(int p1, int p2)
6 {
7 x = p1;
8 y = p2;
9 }
10 }

为结构定义默认(无参数)构造函数是错误的。 在结构体中初始化实例字段也是错误的。 只能通过两种方式初始化结构成员:一是使用参数化构造函数,二是在声明结构后分别访问成员。 对于任何私有成员或以其他方式设置为不可访问的成员,只能在构造函数中进行初始化。

如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。 与类不同,结构的实例化可以不使用 new 运算符。 在此情况下不存在构造函数调用,因而可以提高分配效率。 但是,在初始化所有字段之前,字段将保持未赋值状态且对象不可用。

当结构包含引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。 (这将导致编译器错误 CS0171。)

对于结构,不像类那样存在继承。 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。 但是,结构从基类 Object 继承。 结构可实现接口,其方式同类完全一样。

无法使用 struct 关键字声明类。 在 C# 中,类与结构在语义上是不同的。 结构是值类型,而类是引用类型。 有关更多信息,请参见值类型

除非需要引用类型语义,将较小的类声明为结构,可以提高系统的处理效率。

说明

下面的示例演示使用默认构造函数和参数化构造函数的 struct 初始化。

代码

 1 public struct CoOrds
2 {
3 public int x, y;
4
5 public CoOrds(int p1, int p2)
6 {
7 x = p1;
8 y = p2;
9 }
10 }
 1 // Declare and initialize struct objects.
2 class TestCoOrds
3 {
4 static void Main()
5 {
6 // Initialize:
7 CoOrds coords1 = new CoOrds();
8 CoOrds coords2 = new CoOrds(10, 10);
9
10 // Display results:
11 Console.Write("CoOrds 1: ");
12 Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
13
14 Console.Write("CoOrds 2: ");
15 Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
16
17 // Keep the console window open in debug mode.
18 Console.WriteLine("Press any key to exit.");
19 Console.ReadKey();
20 }
21 }
22 /* Output:
23 CoOrds 1: x = 0, y = 0
24 CoOrds 2: x = 10, y = 10
25 */

说明

下面举例说明了结构特有的一种功能。 它在不使用 new 运算符的情况下创建 CoOrds 对象。 如果将 struct 换成 class,程序将不会编译。

代码

 1 public struct CoOrds
2 {
3 public int x, y;
4
5 public CoOrds(int p1, int p2)
6 {
7 x = p1;
8 y = p2;
9 }
10 }
 1 // Declare a struct object without "new."
2 class TestCoOrdsNoNew
3 {
4 static void Main()
5 {
6 // Declare an object:
7 CoOrds coords1;
8
9 // Initialize:
10 coords1.x = 10;
11 coords1.y = 20;
12
13 // Display results:
14 Console.Write("CoOrds 1: ");
15 Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
16
17 // Keep the console window open in debug mode.
18 Console.WriteLine("Press any key to exit.");
19 Console.ReadKey();
20 }
21 }
22 // Output: CoOrds 1: x = 10, y = 20

转子MSDN,详见http://msdn.microsoft.com/zh-cn/library/0taef578(v=vs.100).aspx

使用结构(C# 编程指南)的更多相关文章

  1. Structured Streaming Programming Guide结构化流编程指南

    目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...

  2. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  3. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  4. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  5. iOS多线程编程指南(二)线程管理

    当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何 ...

  6. Core Animation编程指南

    本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...

  7. 指针类型(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx 在不安全的上下文中,类型可以是指针类型.值类型或引用类型. 指针类型声明采用下列 ...

  8. 索引器(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/6x16t2tx(VS.80).aspx 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于 ...

  9. 匿名类型(C# 编程指南)

    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用.  每个属性的类型由编译器推断. 可通过使用 new 运算 ...

  10. 学习笔记之高质量C++/C编程指南

    高质量C++/C编程指南 http://man.lupaworld.com/content/develop/c&c++/c/c.htm 高质量C++/C编程指南(附录 C :C++/C 试题的 ...

随机推荐

  1. List the Books

    描述 Jim is fond of reading books, and he has so many books that sometimes it's hard for him to manage ...

  2. static_cast, dynamic_cast, reinterpret_cast, const_cast的区别

    static_cast最像C风格的强制转换,很多时候都需要程序员自身去判断转换是否安全.但是相对C风格的强制转换,在无关类的类指针之间转换上,有安全性的提升. dynamic_cast是运行时的转换吧 ...

  3. Unity中Invoke 和 InvokeRepeating的区别

    Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("Test", 5);   它的意思是:5 秒之后调用 Test() 方法: 使用 Invoke() ...

  4. 解决eclipse中java代码注释变成乱码的问题

    Eclipse JAVA文件注释乱码将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码 ...

  5. 开源轻量级即时通讯技术 MobileIMSDK 的常见问题解答

    本帖最后由 茜茜asa 于 2015-12-14 17:50 编辑 申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用 ...

  6. 利用json2html将json数据填充到html模板

    1.下载json2html>> 2.制作好模板.准备好json数据.启动 <!DOCTYPE html> <html> <head> <meta ...

  7. JDK文件夹结构及文件解释

    bin:一些命令行工具,包括Java编译器的启动命令. lib:开发工具使用的文件,一些类库 jre:java程序运行环境所需文件

  8. pyqt5生成的APP制作DMG

    http://blog.csdn.net/wudj810818/article/details/70557284 1.环境 Mac OS Python3.5 PyQt5 2.所需工具 Pyinstal ...

  9. ylbtech-LanguageSamples-OfficeSample(COM 互操作)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-OfficeSample(COM 互操作) 1.A,示例(Sample) 返回顶部 本示 ...

  10. unity color space 选取

    https://unity3d.com/cn/learn/tutorials/topics/graphics/choosing-color-space https://docs.unity3d.com ...