CS2L11——复杂数据类型—结构体

结构体

结构体是一种自定义变量类型 类似与枚举可以自定义
结构体是数据和函数的集合,在结构体中可以申明各种变量和方法

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

结构体声明语法

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

1
2
3
4
5
6
struct 自定义结构体名
{
第一部分 变量
第二部分 构造函数
第三部分 函数
}

注意!结构体名字 我们的规范 是 帕斯卡命名法

声明一个 Student​ 结构体,其中可以声明一系列变量、构造函数(方法)、函数(方法)
结构体内部的方法可以调用结构体内部声明的成员变量和成员方法

其中 public​ 是 访问修饰符,和结构体同名且不写返回值类型的方法 Student()​ 是构造函数(方法)

结构体内部的成员变量不能直接初始化!!!
变量类型可以写任意类型,包括其他结构体,但是不能是自己的结构体!

结构体内部的方法目前不加 static​ 关键字,这样才能通过结构体变量调用方法

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
namespace lesson12
{
struct Student
{
//结构体成员变量,其中public是访问修饰符
//注意 在结构体中申明的变量不能直接初始化!!!
//变量类型 可以写任意类型 包括结构体 但是不能是自己的结构体!
public int age;
public bool sex;
public int number;
public string name;

//构造函数
public Student(int age, bool sex, int number, string name)
{
//新的关键字 this
//代表结构体自己
this.age = age;
this.sex = sex;
this.number = number;
this.name = name;
}

//结构体成员函数,其中public是访问修饰符
//结构体的函数方法一般是表现这个数据结构的行为
//注意 在结构体的方法 目前不需要加static关键字!!!
public void Speak()
{
//在函数中可以直接用结构体内部申明的变量
Console.WriteLine("我的名字是{0},我今年{1}岁",name,age);
}
}
}

结构体的使用

声明了结构体后,就可以 以声明出来的结构体为变量类型,声明一个对应的变量,
通过这个变量,可以调用我们在结构体内部声明的成员变量和方法

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
42
43
namespace lesson12
{
struct Student
{
//结构体成员变量,其中public是访问修饰符
public int age;
public bool sex;
public int number;
public string name;

//构造函数
public Student(int age, bool sex, int number, string name)
{
//新的关键字 this
//代表结构体自己
this.age = age;
this.sex = sex;
this.number = number;
this.name = name;
}

//结构体成员函数,其中public是访问修饰符
public void Speak()
{
//在函数中可以直接用结构体内部申明的变量
Console.WriteLine("我的名字是{0},我今年{1}岁",name,age);
}
}
}

internal class Program
{
static void Main(string[] args)
{
//变量类型 变量名;
Student s1;
s1.age = 10;
s1.sex = false;
s1.number = 1;
s1.name = "MrTang";
s1.Speak();
}
}

输出:

1
我的名字是MrTang,我今年10

修饰结构体成员的访问修饰符

上例中的变量和方法前有 public​,这是访问修饰符,修饰结构体中变量和方法,它决定了变量或者方法是否能被外部使用

  • public​ 公共的 可以在结构体外部访问
  • private​ 私有的 只能在结构体内部使用

不写 就默认为 private

这里是修饰结构体的成员的访问修饰符,对于修饰结构体本身的访问修饰符详见 CS3L22——命名空间 的:((20240904193522-f3rq819 ‘internal’))

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
struct Test
{
public int testPublic;
bool testPrivate1;
private int testPrivate2;

public void TestPublicMethod()
{
//在结构体的函数中可以直接用结构体内部申明的变量或者方法。不管是public还说private的
Test();
Console.WriteLine("这是外部可以调用的方法,testPublic = {0},testPrivate2 = {1}", testPublic, testPrivate2);
}

private void Test()
{
Console.WriteLine("只能在结构体内部使用!");
}
}

internal class Program
{
static void Main(string[] args)
{
Test t;
t.testPublic = 10;
//t.testPrivate1 = false; //error, 私有变量只能在结构体内部使用
//t.testPrivate2 = 1; //error, 私有变量只能在结构体内部使用
//t.Test() //error, 私有方法只能在结构体内部使用
t.TestPublicMethod();
}
}

结构体的构造函数

没有返回值,必须有参数,函数名必须与结构体名相同!!!
如果申明了构造函数,那么必须在其中对结构体的所有变量数据初始化

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
struct Student
{
public int age;
public bool sex;
public int number;
public string name;

public Student(int age, bool sex, int number, string name)
{
//新的关键字 this
//代表结构体自己
this.age = age;
this.sex = sex;
this.number = number;
this.name = name;
}
}

internal class Program
{
static void Main(string[] args)
{
Student s2 = new Student(18, true, 2, "小红");//使用构造函数,直接完成了初始化
s2.speak();
}
}

输出:

1
我的名字是小红,我今年18