C#整理8——结构体

结构体:相当于是我们自己定义的一种复杂的类型。
int... double float bool char string DateTime 数组类型
生活中大部份的对象都是复合型的对象。

如何定义结构体类型?
一般来说结构体的定义要放在class的外面或class的里面,尽量不放在Main的里面。
struct 自定义类型名
{
public 变量类型 变量名;
......;
......;
......;

}
例如:
struct YuanGong //自定义的数据类型。用来描述员工的信息。
{
public string NO;
public string Name;
public int Age;
public string Nation;
public bool Sex;
}

如何用自定义的类型来定义变量?
自定义类型名 变量 = new 自定义类型名();

如何使用自定义类型的变量?
变量.子变量 = "xxxx";
Console.WriteLine(变量名.子变量);
例如:
//定义自定义类型的变量
YuanGong zhangsan = new YuanGong();
//给变量赋值
zhangsan.NO = "Y001";
zhangsan.Name = "张三";
zhangsan.Age = 22;
zhangsan.Sex = true;
zhangsan.Nation = "汉族";
//对变量取值
Console.WriteLine(zhangsan.NO+"\t"+zhangsan.Name+"\t"+zhangsan.Age);
Console.WriteLine(zhangsan.Nation+"\t"+(zhangsan.Sex?"男":"女"));

********************************************************************************************************

1> 结构和类特别相似,在结构中可以定义字段,方法,属性,构造函数。(因为结构是在C中传承下来的,而C是面向过程的)

2> 结构体也需要创建对象来对结构中的成员进行调用,与类的区别是结构体可以通过new关键字来创建,也可以不通过new关键字来创建,声明一个结构类型的变量就可以了,

这个变量就是一个对象(结构只是与类非常相似并不是一样,还是有语法区别的)。通过对象名点成员来调用。

3> 声明语法:

[访问修饰符] struct 结构名称

{

结构成员;
               }

4> 结构和类的区别:

a. 类是class声明 结构体是struct声明

b. 结构体中虽然可以声明字段,但是声明字段的同时不能给字段赋值.否则报错。

c. 结构体中虽然可以定义构造函数,但是你不能写1个无参数的构造函数. 因为无论如何 编译器多会为结构体生成1个无参数的构造函数.

d. 在结构体的构造函数中,必须要为这个结构体对象的每一个字段赋值.

e. 在创建结构体对象的时候. 可以使用new关键字来创建. 但是我也可以不使用new关键字. 使用new关键字来创建对象: 结构体中所有的字段就已经有值了.可以直接使用. 不使用new关键创建对象:

结构体中的字段没有值,所以在使用字段的值之前 必须要为字段赋值. 原因在于: 使用new关键字创建对象 调用了构造函数,而结构体的构造函数要求必须为所有的字段赋值, 哪怕是它自己生成的无

参数的构造函数(为所有的字段赋默认值). 所以使用new关键字创建结构体对象 这个结构体对象的所有的字段都已经有值了. 如果直接声明1个结构体变量而不使用new关键字,没有调用构造函数,

所以字段也就没有值.

f. 在构造函数中为属性赋值,编译器不认为是在对字段赋值,因为属性不一定是在操作字段。

g. 结构体是1个值类型.类是1个引用类型.

5> 结构体是一个值类型. 在创建结构体对象的时候,结构体对象直接存储在变量中. 结构体变量之间相互赋值的时候,是逐个拷贝字段的值.

********************************************************************************************************

对战游戏

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace ConsoleApplication1
 7 {
 8     struct Ren
 9     {
10         public string Name;
11         public int Blood;
12         public int Attack;
13         public int Defend;
14
15
16     }
17     class Program
18     {
19         static void Main(string[] args)
20         {
21             Ren r1 = new Ren();
22             Ren r2 = new Ren();
23             Console.Write("请第一个高手出场:");
24             r1.Name = Console.ReadLine();
25             Console.Write("请第二个高手出场:");
26             r2.Name = Console.ReadLine();
27             //生成血量
28             Random rand = new Random();
29             r1.Blood = rand.Next(1000) + 1000;
30             r2.Blood = rand.Next(1000) + 1000;
31             //攻防
32             r1.Attack = rand.Next(50) + 50;
33             r2.Attack = rand.Next(50) + 50;
34             r1.Defend = rand.Next(50) + 50;
35             r2.Defend = rand.Next(50) + 50;
36             Console.WriteLine("大侠" + r1.Name + "\t,生命力" + r1.Blood);
37             Console.WriteLine("大侠" + r2.Name + "\t,生命力" + r2.Blood);
38             Console.WriteLine("在一个月黑风高的夜晚狭路相逢!");
39             while (true)
40             {
41                 //跳出循环
42                 if (r1.Blood <= 0 && r2.Blood <= 0)
43                 {
44                     Console.WriteLine(r1.Name + "与" + r2.Name + "皆倾尽全力,共赴黄泉");
45                     break;
46                 }
47                 if (r1.Blood <= 0)
48                 {
49                     Console.WriteLine(r2.Name + "用了一记猴子捞月,结束了" + r1.Name + "的生命");
50                     break;
51                 }
52                 if (r2.Blood <= 0)
53                 {
54                     Console.WriteLine(r1.Name + "用了一记黑虎掏心,结束了" + r2.Name + "的生命");
55                     break;
56                 }
57                 //对战
58                 int b1 = rand.Next(200);//r1掉的血
59                 r1.Blood -= b1;
60                 if (r1.Blood < 0)
61                 {
62                     r1.Blood = 0;
63                 }
64                 System.Threading.Thread.Sleep(1000);
65                 Console.ForegroundColor = ConsoleColor.Red;
66                 Console.WriteLine(r2.Name + "抡起拳头打了" + r1.Name + b1 + "点血");
67                 Console.ResetColor();
68                 Console.WriteLine();
69                 //稍等一下
70                 System.Threading.Thread.Sleep(1500);
71                 int b2 = rand.Next(200);//r2掉的血
72
73
74                 r2.Blood -= b2;
75                 if (r2.Blood < 0)
76                 {
77                     r2.Blood = 0;
78                 }
79                 Console.ForegroundColor = ConsoleColor.DarkCyan;
80                 Console.WriteLine(r1.Name + "抡起拳头打了" + r2.Name + b2 + "点血");
81                 Console.ResetColor();
82
83
84                 Console.ForegroundColor = ConsoleColor.Yellow;
85                 Console.WriteLine("大侠" + r1.Name + "还有" + r1.Blood + "生命力!");
86                 Console.Write("大侠" + r2.Name + "还有" + r2.Blood + "生命力!");
87                 Console.ResetColor();
88                 Console.WriteLine();
89                 Console.WriteLine();
90
91             }
92
93         }
94     }
95 }

时间: 2024-08-29 16:36:44

C#整理8——结构体的相关文章

12、C#基础整理(结构体)

结构体 1.概念: 结构体是写在main函数外的数据结构,由不同类型的数据组合成一个整体,这些组合在一个整体中的数据是互相联系的 2.声明方式: struct 结构体名 { 成员变量(由类型名+成员名组成) } 例: public struct student//public是修饰符,可以不加,作用范围为整个命名空间 { public int Code;//定义变量,每一个变量叫做结构体的属性 public string Name; public string Sex; public int A

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础.结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type).在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样.因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位. 如何定义一个结构体 type Coordinate struct {

C#与C++数据类型比较及结构体转换(搜集整理二)

原文网址:http://www.blogjava.net/heting/archive/2010/03/20/315998.html C++ C# ===================================== WORD ushort DWORD uint UCHAR int/byte 大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte UCHAR* string/IntPtr unsigned char* [MarshalAs(UnmanagedType

C#与C++数据类型比较及结构体转换[整理]

//c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)                     ----    c#:System.Byte//c++:SHORT(short)                              ----   c#:System.Int16//c++:WORD(unsigned   short)          

82599网卡驱动rx descriptor结构体分析

82599 datasheet: 7.1.6  节    大概位于314页 对驱动的理解关键是对数据结构的理解. The 82599 posts receive packets into data buffers in system memory. The following controls are provided for the data buffers: ? The SRRCTL[n].BSIZEPACKET field defines the data buffer size. See

【STL学习】sort函数之自定义结构体数组

最近经常用到结构体数组排序,所以把用sort对结构体数组排序整理一下. #include<iostream> #include<algorithm>//需要加该头文件 using namespace std; struct define{ int a; int b; }d[10]; bool compare(const define &x,const define &y); int main() { for(int i=0;i<10;i++){ cin>

深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条“句柄”中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想干什么. 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 1.windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的

c#中关于结构体和字节数组转化

最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace FileSendClient { [StructL

【C#】结构体与类的比较

C#的类与结构体是初学者很容易混淆的两个概念,本文以表格的方式整理了两者的相同点和不同点. 博文首发地址:http://bbs.lanou3g.com/forum.php?mod=viewthread&tid=5151&extra=page%3D1 大分类 小分类 结构体 类 特点 变量类型 值类型 引用类型 创建方式 new / 直接声明 new 内存位置 堆栈或内敛 托管堆 优点 小巧.轻便.高性能 功能强大 数据成员 字段 可以有,但不能赋值 可以有,可以赋值 常量 有 有 事件 有