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 }