使用结构(C# 编程指南)

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# 中,类与结构在语义上是不同的。 结构是值类型,而类是引用类型。 有关更多信息,请参见值类型

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

示例 1

说明

下面的示例演示使用默认构造函数和参数化构造函数的 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 */

示例 2

说明

下面举例说明了结构特有的一种功能。 它在不使用 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# 编程指南),布布扣,bubuko.com

时间: 2024-10-29 08:19:01

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

索引器(C# 编程指南)

索引器(C# 编程指南) Visual Studio 2015 其他版本 索引器允许类或结构的实例就像数组一样进行索引. 索引器类似于属性,不同之处在于它们的取值函数采用参数. 在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 取值函数方法(作为分配和检索值的方法). Program 类创建了此类的一个实例,用于存储字符串. C# class SampleCollection<T> { // Declare an array to store the data elem

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

当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何你想要它完成的任务.因为它们处于相同的进程空间,所以一个独立应用程序里面的所有线程共享相同的虚拟内存空间,并且具有和进程相同的访问权限. 一.线程成本 多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源.每个线程都需要分配一定的内核内存和应用程序内存空间的内存.管理你的线程和协调其调度所需

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

OC运行时编程指南

一.介绍 OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时.它会尽可能的动态的处理事情.这意味这个语言不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码.这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行. 这个教程将探究NSObject这个类以及OC这个语言和运行时系统是如何进行交互的.特别是如何在运行时动态的根据类的范式加载类,并且传递给其他对象.同时这个教程还将告诉你如何在你的程序运行过程中找到你的对象的运行信息. OC运行时编程指南描述了OC运行时

转:KVC/KVO原理详解及编程指南

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NS

CoreAnimation编程指南

转自http://www.cocoachina.com/bbs/read.php?tid=124478 第一章      核心动画概念核心动画是一套包含图形绘制,投影,动画的Objective–C类集合.它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流畅的动画.动态的动画接口很难创建,但是核心动画通过提供如下接口使这些创建起来变得更加简单:简单易用的高性能混合编程模型.类似视图一样,你可以通过使用图层来创建复杂的接口.轻量级的数

Posix线程编程指南(1)

Posix线程编程指南(1) 作者:杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/ 线程创建与取消 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第一篇将向您讲述线程的创建与取消. 1 线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有

Posix线程编程指南(5)

Posix线程编程指南(5) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part5/ 杂项 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第五篇将向您讲述pthread_self().pthread_equal()和pthread_once()等杂项函数. 在Posix线程规范中还有几个辅助函数难以归类,暂且称其为杂项函数,主要包

Posix线程编程指南(4)

Posix线程编程指南(4) 杨沙洲 原文地址:http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part4/ 线程终止 这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第四篇将向您讲述线程中止. 线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退