首页 > C#教程 阅读:19351

C# struct:结构体

C# 中,结构体也被称为结构类型(“structure type”或“struct type”),它是一种可封装数据和相关功能的值类型,在语法上结构体与类(class)非常相似,它们都可以用来封装数据,并且都可以包含成员属性和成员方法。

1、定义结构体

要定义一个结构体需要使用 struct 关键字,每个结构体都可以被看作是一种新的数据类型,其中可以包含多个成员(成员属性和成员方法),例如下面声明的 Books 结构体:

struct Books {
public string title;
public string author;
public string subject;
public int book_id;
};

在设计结构体时有以下几点需要注意:
  • 不能为结构体声明无参数的构造函数,因为每个结构体中都已经默认创建了一个隐式的、无参数的构造函数;
  • 不能在声明成员属性时对它们进行初始化,静态属性和常量除外;
  • 结构体的构造函数必须初始化该结构体中的所有成员属性;
  • 结构体不能从其他类或结构体中继承,也不能作为类的基础类型,但是结构类型可以实现接口;
  • 不能在结构体中声明析构函数。

下面通过一个示例来演示结构体的使用:
using System;
namespace c.biancheng.net
{
 struct Books {
 public string title;
 public string author;
 public string subject;
 public int book_id;
 }
 class Demo
 {
 static void Main(string[] args) 
 { 
 Books book1; // 声明 Books 类型的 book1
 Books book2; // 声明 Books 类型的 book2
 // 定义 book1 的属性
 book1.title = "C#教程";
 book1.author = "C语言中文网";
 book1.subject = "C#编程教程";
 book1.book_id = 123456;
 // 定义 book2 的属性
 book2.title = "HTTP教程";
 book2.author = "C语言中文网";
 book2.subject = "HTTP协议教程";
 book2.book_id = 123455;
 // 输出 book1 的属性信息
 Console.WriteLine("book1 title : {0}", book1.title);
 Console.WriteLine("book1 author : {0}", book1.author);
 Console.WriteLine("book1 subject : {0}", book1.subject);
 Console.WriteLine("book1 book_id :{0}", book1.book_id);
 // 输出 book2 的属性信息
 Console.WriteLine("book2 title : {0}", book2.title);
 Console.WriteLine("book2 author : {0}", book2.author);
 Console.WriteLine("book2 subject : {0}", book2.subject);
 Console.WriteLine("book2 book_id :{0}", book2.book_id);
 Console.ReadKey();
 }
 }
}
运行结果如下:

book1 title : C#教程
book1 author : C语言中文网
book1 subject : C#编程教程
book1 book_id :123456
book2 title : HTTP教程
book2 author : C语言中文网
book2 subject : HTTP协议教程
book2 book_id :123455

2、结构体的特征

C# 中的结构体与 C/C++ 中的结构体有很大的不同,在 C# 中结构体具有以下功能:
  • 结构体中可以具有方法、字段、索引、属性、运算符方法和事件;
  • 结构体中可以定义构造函数,但不能定义析构函数,需要注意的是,定义的构造函数不能没有参数,因为没有参数的构造函数是 C# 默认自动定义的,而且不能更改;
  • 与类不同,结构体不能继承其他结构体或类;
  • 结构体不能用作其他结构体或类的基础结构;
  • 一种结构体可以实现一个或多个接口;
  • 结构体成员不能被设定为 abstract、virtual 或 protected;
  • 与类不同,结构体可以不用 New 操作符来实例化,当使用 New 操作符来实例化结构体时会自动调用结构体中的构造函数;
  • 如果不使用 New 操作符来实例化结构体,结构体对象中的字段将保持未分配状态,并且在所有字段初始化之前无法使用该结构体实例。

3、类与结构体

类和结构体的主要区别如下所示:
  • 类是引用类型,结构体是值类型;
  • 结构体不支持继承,但可以实现接口;
  • 结构体中不能声明默认的构造函数。

根据以上特征,让我们来完善一下前面的示例:
using System;
namespace c.biancheng.net
{
 struct Books {
 public string title;
 public string author;
 public string subject;
 public int book_id;
 public void getValue(string t, string a, string s, int id){
 title = t;
 author = a;
 subject = s;
 book_id = id;
 }
 public void disPlay(){
 Console.WriteLine("Title:{0}", title);
 Console.WriteLine("Author:{0}", author);
 Console.WriteLine("Subject:{0}", subject);
 Console.WriteLine("Book_id:{0}", book_id);
 }
 }
 class Demo
 {
 static void Main(string[] args) 
 { 
 Books book1 = new Books(); // 实例化 Books 结构体
 Books book2 = new Books(); // 实例化 Books 结构体
 // 定义 book1 的属性
 book1.getValue("C#教程","C语言中文网","C#编程教程",123456);
 // 定义 book2 的属性
 book2.getValue("HTTP教程","C语言中文网","HTTP协议教程",123455);
 // 输出 book1 的属性信息
 book1.disPlay();
 // 输出 book2 的属性信息
 book2.disPlay();
 Console.ReadKey();
 }
 }
}
运行结果如下:

Title:C#教程
Author:C语言中文网
Subject:C#编程教程
Book_id:123456
Title:HTTP教程
Author:C语言中文网
Subject:HTTP协议教程
Book_id:123455

AltStyle によって変換されたページ (->オリジナル) /