复杂数据类型之结构体

关于结构体

一.基本概念

结构体是一种自定义变量类型,类似枚举需要自己定义,它是数据和函数的集合。

在结构体中,可以申明各种变量和方法。

作用:用来表现存在关系的数据集合,比如用结构体表现学生,动物,人类等等。

二.基本语法

结构体一般写在namespace语句块中,结构体关键字struct。

(和枚举enum一样)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Lesson1
{
//在这里声明结构体
struct 自定义结构体名
{
//第一部分 变量
//第二部分 构造函数
//第三部分 函数方法
}
internal class Program
{
static void Main(string[] args)
{
}
}
}

注意:结构体名字我们的规范是帕斯卡命名法。(所有单词首字母大写)

三.实例

表现学生数据的结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace Lesson1
{
//在这里声明结构体
struct Student
{
//在结构体中申明的变量,不能直接初始化!!!
//在结构体里面的变量类型,可以写任意类型,包括结构体,但是不能是自己的结构体(会导致死循环)
//第一步变量
int age;
bool sex;
int number
string name;
//先略过第二步
//第三步函数方法
//表现这个数据结构的行为
//注意:在结构体中的方法,目前不需要加static关键字
void Speak(){
Console.WriteLine("我的名字是{0},我今年{1}岁,",name,age);
}
//函数是可以根据需求写无数个函数的
}
internal class Program
{
static void Main(string[] args)
{
}
}
}

四.结构体的使用

使用要在函数里面使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace Lesson1
{
//在这里声明结构体
struct Student
{
//在结构体中申明的变量,不能直接初始化!!!
//在结构体里面的变量类型,可以写任意类型,包括结构体,但是不能是自己的结构体(会导致死循环)
//第一步变量
public int age;
public bool sex;
public int number
public string name;
//先略过第二步
//第三步函数方法
//表现这个数据结构的行为
//注意:在结构体中的方法,目前不需要加static关键字
public void Speak(){
Console.WriteLine("我的名字是{0},我今年{1}岁,",name,age);
}
//函数是可以根据需求写无数个函数的
}
internal class Program
{
static void Main(string[] args)
{
//因为声明变量的过程为变量类型+变量名
//而我们的结构体是自定义的变量类型
Student s1;
//声明一个为Student结构体类型的变量s1.
s1.age=10;
//之后要用到访问修饰符,如果是私有类型,在主函数中对s1是无法进行调用的。
//age是public类型,可以被外部访问,因此可以在外部(即主函数处)进行初始化。
//除了构造函数外,这也是一种赋值方法。
s1.sex=false;//(代表男的)
s1.number =1;
s1.name="大帅哥";
s1.Speak();
//调用之后,会正常输出了。
}
}
}

五.访问修饰符

修饰结构体中的变量和方法,是否能够被外部使用

public 公共的,可以被外部访问

private 私有的,只能在内容中使用

默认不写,则为private

六.结构体的构造函数

基本概念

1.没有返回值

2.函数名必须和结构体名相同

3.必须有参数(和类不同之处)

4.如果申明了构造函数,那么必须在其中对所有变量数据初始化。(结构体中的所有)

5.构造函数,一般是用于在外部方便初始化的,帮助我们快速初始化结构体对象的。

6.构造函数也是可以重载的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace Lesson1
{
struct Student
{
public int age;
public bool sex;
public int number
public string name;
public int akt;
public void Speak(){
Console.WriteLine("我的名字是{0},我今年{1}岁,",name,age)
public Student(int age,bool sex,int number,string name,int id){ //必须要有参数
//新的关键字 this 代表结构体中的变量 如果变量名字有冲突,用来区分外部和内部的同一变量名字
this.age=age;
this.sex=sex;
this.number=number;
this.name=name;
akt=10;
//不一定要把所有结构体的变量都要通过接受主函数来赋值,它也可以直接赋值。
//但是一定要所有变量都赋值完毕,构造函数才可以使用
}
public void Speak(){
Console.WriteLine("。。。。。");
}
//构造函数方法进行打印,省时省力。
}
}
internal class Program
{
static void Main(string[] args)
{
Student s2=new Student(18,true,2,"小红");
//通过调用构造函数的方法来初始化对象
s2.Speak();
//调用函数,进行打印。
}
}
}

Ps:之后在学习面向对象和类时,还会对构造函数进行深入讲解。

注意:1.在结构体申明的变量,不能初始化,只能在外部或者构造函数中进行赋值(初始化)。

2.在结构体中申明的函数,不用加static

3.感觉自己还不是很清楚三.函数方法和二.构造函数的区别,上知乎看了看,一言以蔽之,构造函数用于初始化对象,而方法则用于执行特定的功能,因此,当你要给一个对象赋值时,要构造函数,而当你要让它做什么事情时,就要用到函数方法了。

4.关于在主函数中的调用,(默认使用上面的Student结构体)

1
2
3
4
5
6
//主函数框架
Student.s1=new Student();
//如果这么做,当你使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。
s1.Student(12,true,2,"xiaohuang",3);
//使用构造函数进行初始化。
//如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。(见上面)

5.结构体是值类型,想要在函数内部改变值类型信息,外部受影响,一定记住用ref或者out。

(例如:将一个结构体的信息传到另一个结构体之中,对结构体内部的信息进行修改)

1
2
3
4
5
6
7
8
9
10
11
12
//举一个粗糙的例子
struct OutMan{
public string name;
public void Atk(ref Boss monster){
//在这个位置,属于另一个结构体Boss结构体,变量名字为monster的信息就被传进来了,用ref才能实现从内部到外部的修改。
}
}
struct Boss{
public string name;
public void Atk(ref OutMan Man );
//道理同上
}

复杂数据类型之结构体
https://gaster44.github.io/2023/11/25/复杂数据类型之结构体/
作者
huangjinhong
发布于
2023年11月25日
许可协议