跳到主要内容

C# 结构体

提示
  1. 结构体的定义和使用:结构体(struct)是值类型,用于存储数据。在 C# 中,结构体可包含字段、方法和属性,可用于存储多个数据项,如人的姓名和年龄。
  2. 声明和访问结构体变量:结构体变量通过结构体名称声明,并使用点运算符访问其成员。例如,可以声明一个 Employee 结构体并访问其 id 成员。
  3. 结构体和类的区别:与类(引用类型)不同,结构体(值类型)在赋值时会复制其内容,而不是引用同一对象。结构体不支持继承,而类支持。

结构体(struct)在 C# 中类似于类,用于存储数据。然而,与类不同的是,结构体是值类型。

假设我们想存储一个人的姓名和年龄。我们可以创建两个变量:nameage 来存储值。

然而,如果我们想存储多个人的同样信息。

在这种情况下,为每个个体创建变量可能是一项繁琐的任务。为了解决这个问题,我们可以创建一个存储 nameage 的结构体。现在,这个结构体可以用于每个人。

在 C# 中定义结构体

在 C# 中,我们使用 struct 关键字来定义结构体。例如,

struct Employee  {
public int id;
}

这里,id 是结构体内的一个字段。结构体也可以包括方法、索引器等。

声明结构体变量

在我们使用结构体之前,我们首先需要创建一个结构体变量。我们使用结构体名称和变量来声明一个结构体变量。例如,

struct Employee {
public int id;
}
...

// 声明结构体 Employee 的 emp 变量
Employee emp;

在上面的例子中,我们创建了一个名为 Employee 的结构体。这里,我们声明了结构体 Employee 的变量 emp

访问 C# 结构体

我们使用结构体变量和 . 运算符来访问结构体的成员。例如,

struct Employee {
public int id;
}
...
// 声明结构体 Employee 的 emp 变量
Employee emp;

// 访问结构体成员
emp.id = 1;

这里,我们使用了结构体 Employee 的变量 emp. 运算符来访问 Employee 的成员。

emp.id = 1;

这访问了结构体 Employeeid 字段。

注意:像 intboolfloat 这样的原始数据类型在 C# 中是预定义的结构体。

示例:C# 结构体

using System;
namespace CsharpStruct {

// 定义结构体
struct Employee {
public int id;

public void getId(int id) {
Console.WriteLine("员工 ID: " + id);
}
}

class Program {
static void Main(string[] args) {

// 声明结构体 Employee 的 emp 变量
Employee emp;

// 访问并设置结构体字段
emp.id = 1;

// 访问结构体方法
emp.getId(emp.id);

Console.ReadLine();
}
}
}

输出

员工 ID: 1

在上述程序中,我们创建了一个名为 Employee 的结构体。它包含一个字段 id 和一个方法 getId()

Program 类内部,我们声明了结构体 Employee 的变量 emp。然后我们使用 emp 变量来访问类的字段和方法。

注意:我们也可以使用 new 关键字实例化一个结构体。例如,

Employee emp = new Employee();

这里,这行代码调用了结构体的无参构造函数,并用默认值初始化了所有成员。

C# 结构体中的构造函数

在 C# 中,结构体也可以包含构造函数。例如,

struct Employee {

public int id;

// 构造函数
public Employee(int employeeId) {
id = employeeId;
}
}

这里,我们创建了一个带参数 employeeId 的参数化构造函数 Employee()

注意:在 C# 9.0 或更低版本中,我们不能创建无参构造函数。

示例:C# 结构体中的构造函数

using System;
namespace CsharpStruct {

// 定义结构体
struct Employee {
public int id;

public string name;

// 参数化构造函数
public Employee(int employeeId, string employeeName) {

id = employeeId;
name = employeeName;
}
}

class Program {
static void Main(string[] args) {

// 调用结构体的构造函数
Employee emp = new Employee(1, "Brian");

Console.WriteLine("员工姓名: " + emp.name);
Console.WriteLine("员工编号: " + emp.id);

Console.ReadLine();
}
}
}

输出

员工姓名: Brian
员工编号: 1

在上面的示例中,我们在 Employee 结构体内创建了一个参数化构造函数。在构造函数内,我们为字段 idname 分配了值。

注意这行代码,

Employee emp = new Employee(1, "Brian");

像在 C# 类中一样,我们使用 new 关键字来调用构造函数。这里,1"Brian" 是传递给构造函数的参数,分别被分配给 employeeIDemployeeName

注意:我们必须在参数化构造函数内为结构体的每个字段分配值。例如,

// 错误代码
public Employee(int employeeID, employeeName) {
id = employeeID;
}

在这里,我们没有为 name 字段分配值。因此代码将产生错误。

C# 结构体中的属性

我们也可以在 C# 结构体中使用属性。例如,

using System;
namespace CsharpStruct {

// 定义结构体
struct Employee {
public int id;

// 创建属性
public int Id {

// 返回 id 字段
get {
return id;
}

// 设置 id 字段
set {
id = value;
}
}
}

class Program {
static void Main(string[] args) {

// 调用结构体的构造函数
Employee emp = new Employee();

emp.Id = 1;
Console.WriteLine("员工编号: " + emp.Id);

Console.ReadLine();

}
}
}

输出

员工 ID: 1

在上面的示例中,我们在 Employee 结构体内有 Id 属性。

get 方法返回 id 字段,而 set 方法将值赋给 id 字段。

C# 中类和结构体的区别

在 C# 中,类和结构体看起来相似。然而,它们之间存在一些差异。

类是引用类型,而结构体是值类型。例如,

using System;
namespace CsharpStruct {

// 定义类
class Employee {
public string name;

}

class Program {
static void Main(string[] args) {

Employee emp1 = new Employee();
emp1.name = "John";

// 将 emp1 赋给 emp2
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Employee1 的名字: " + emp1.name);

Console.ReadLine();
}
}
}

输出

Employee1 的名字: Ed

在上面的示例中,我们将 emp1 的值赋给了 emp2emp2 对象引用与 emp1 相同的对象。因此,emp2 中的更新会自动更新 emp1 的值。

这就是为什么类是引用类型

与类相反,当我们将一个结构体变量赋给另一个时,结构体的值被复制到被赋值的变量中。所以更新一个结构体变量不会影响另一个。例如,

using System;
namespace CsharpStruct {

// 定义结构体
struct Employee {
public string name;

}

class Program {
static void Main(string[] args) {

Employee emp1 = new Employee();
emp1.name = "John";

// 将 emp1 赋给 emp2
Employee emp2 = emp1;
emp2.name = "Ed";
Console.WriteLine("Employee1 的名字: " + emp1.name);

Console.ReadLine();
}
}
}

输出

Employee1 的名字: John

当我们将 emp1 的值赋给 emp2 时,创建了一个新的值 emp2。这里,emp1 的值被复制到 emp2。因此,emp2 中的更改不会影响 emp1

这就是为什么结构体是值类型

此外,继承 在结构体中是不可能的,而它是 C# 类的一个重要特性。