Programming C#.Structs

结构体是一种简单的用户自定义类型,也是类的一种轻量级的替代品。

相似之处:他们都有构造函数、属性、方法、字段、操作符、嵌套类型和索引器

差异之处:类是一种引用类型,而结构体是一种值类型。因此结构体一般用于表示无须引用语义的对象。

struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。 尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。 例如,如果声明一个 1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。但是结构体集合的效率就不行了,因为集合的元素应该是引用类型的,所以结构体必须进行装箱处理,装箱和拆箱是有开销的,所以类在大的结合中更有效率。

 1 using System;
 2
 3 namespace CreatingAStruct
 4 {
 5     public struct Location
 6     {
 7         private int xValue;
 8         private int yValue;
 9         //结构体的构造函数,new操作符要调用Location的构造函数
10         public Location(int xCoordinate, int yCoordinate)
11         {
12             xValue = xCoordinate;
13             yValue = yCoordinate;
14         }
15         //结构体的属性
16         public int x
17         {
18             get
19             {
20                 return xValue;
21             }
22             set
23             {
24                 xValue = value;
25             }
26         }
27         public int y
28         {
29             get
30             {
31                 return yValue;
32             }
33             set
34             {
35                 yValue = value;
36             }
37         }
38         //结构隐式地从基类 Object 继承,所以结构可实现接口,其方式同类完全一样
39         public override string ToString()
40         {
41             return (String.Format("{0},{1}", xValue, yValue));
42         }
43     }
44
45     public class Tester
46     {
47         //这里参数loc是一个值传递
48         public void MyFunc(Location loc)
49         {
50             loc.x = 150;
51             loc.y = 200;
52             Console.WriteLine("In MyFunc loc:{0}", loc);
53         }
54
55         static void Main()
56         {
57             Location loc = new Location(200,300);
58
59             //WriteLine()的参数是一个对象,Location却是一个结构体(一种值类型)
60             //编译器自动将结构体装箱,(就像所有的值类型一样)而且传递给WriteLine()的正是装箱得到的对象
61             Console.WriteLine("Local location: {0}", loc);
62
63             //结构是作为一个值对象专递的,MyFunc()中只是一个副本,如果把结构声明为类就是引用类型
64             Tester t = new Tester();
65             t.MyFunc(loc);
66
67             Console.WriteLine("Local location: {0}", loc);
68
69             Console.ReadKey();
70         }
71     }
72 }

为结构定义默认(无参数)构造函数是错误的。 在结构体中初始化实例字段也是错误的

只能通过两种方式初始化结构成员:一是使用参数化构造函数,二是在声明结构后分别访问成员。 对于任何私有成员或以其他方式设置为不可访问的成员,只能在构造函数中进行初始化。

如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。

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

当结构包含引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。

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

无法使用 struct 关键字声明类。 在 C# 中,类与结构在语义上是不同的。 结构是值类型,也就是说生成的对象是在栈中创建的,而类是引用类型。

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

结构体不能初始化,没有结构函数,没有自定义默认构造函数。如果我们不提供构造方法,CLR将初始化结构体,将所有的数据成员置零。如果提供了非默认的构造方法,就不会发生CLR初始化,因此必须显式初始化结构体中的所有字段。

 1 using System;
 2
 3 public struct CoOrds
 4 {
 5     public int x, y;
 6
 7     public CoOrds(int p1, int p2)
 8     {
 9         x = p1;
10         y = p2;
11     }
12 }
13
14 // Declare and initialize struct objects.
15 class TestCoOrds
16 {
17     static void Main()
18     {
19         // Initialize:
20         CoOrds coords1 = new CoOrds();
21         CoOrds coords2 = new CoOrds(10, 10);
22
23         // Display results:
24         Console.Write("CoOrds 1: ");
25         Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
26
27         Console.Write("CoOrds 2: ");
28         Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
29
30         //Declare an object without the call of the constructor function
31         CoOrds coords3;
32         //Initialize
33         //所有的结构字段都必须初始化,不然这个结构对象就不能被使用
34         coords3.x = 120;
35         coords3.y = 150;
36         // Display results:
37         Console.Write("CoOrds 3: ");
38         Console.WriteLine("x = {0}, y = {1}", coords3.x, coords3.y);
39
40         // Keep the console window open in debug mode.
41         Console.WriteLine("Press any key to exit.");
42         Console.ReadKey();
43     }
44 }

时间: 2024-10-14 21:08:54

Programming C#.Structs的相关文章

The Swift Programming Language IOS8 快捷编程语言

This is a preliminary document for an API or technology in development. Apple is supplying this information to help you plan for the adoption of the technologies and programming interfaces described herein for use on Apple-branded products. This info

Introduction to C Memory Management and C++ Object-Oriented Programming

C is used when at least one of the following matters: Speed Memory Low-level features(moving the stack pointer, etc.). Level of abstraction Languages Directly manipulate memory Assembly(x86,MIPS) Access to memory C,C++ Memory managed Java,C#,Scheme/L

C Programming vs. Java Programming

Thing C Java type of language function oriented object oriented basic programming unit function class = ADT portability of source code possible with discipline yes portability of compiled code no, recompile for each architecture yes, bytecode is "wri

Functional Programming.

I have been seeing Redux for sometime, but recently I come to realize that , it's part of so called functional programming. The basic idea for functional programming is so simple, Declare all dependency as function input, no hidden input ( we should

Go语言自述(The Go Programming Language README)

声明:本文为笔者为练习英语所做的翻译练习,原文所属者与笔者没有任何关系,翻译结果不代表原文所属者的观点.笔者不保证翻译的正确性,任何人以任何形式的对本文的引用,都是不负责任和荒谬的行为,造成的后果笔者不予负责. 原文链接所属:golang/go Go is an open source programming language that makes it easy to build simple,reliable, and efficient software. Go是一门开源的编程语言,用它可

Algorithm Part I:Programming Assignment(2)

问题描述: Programming Assignment 2: Randomized Queues and Deques Write a generic data type for a deque and a randomized queue. The goal of this assignment is to implement elementary data structures using arrays and linked lists, and to introduce you to g

Java Object Oriented Programming concepts

Introduction This tutorial will help you to understand about Java OOP'S concepts with examples. Let's discuss about what are the features of Object Oriented Programming. Writing object-oriented programs involves creating classes, creating objects fro

How To: Perl TCP / UDP Socket Programming using IO::Socket::INET

http://www.thegeekstuff.com/2010/07/perl-tcp-udp-socket-programming/ In this article, let us discuss how to write Perl socket programming using the inbuilt socket modules in Perl. Perl socket modules provides an object interface that makes it easier

Unity基于响应式编程(Reactive programming)入门

系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率 背景 前有慕容小匹夫的一篇<解构C#游戏框架uFrame兼谈游戏架构设计&