详解C# 结构体
在C#中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct关键字用于创建结构体。
结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:
- Title
- Author
- Subject
- BookID
定义结构体
为了定义一个结构体,您必须使用struct语句。struct语句为程序定义了一个带有多个成员的新的数据类型。
例如,您可以按照如下的方式声明Book结构:
structBooks { publicstringtitle; publicstringauthor; publicstringsubject; publicintbook_id; };
下面的程序演示了结构的用法:
实例
usingSystem; usingSystem.Text; structBooks { publicstringtitle; publicstringauthor; publicstringsubject; publicintbook_id; }; publicclasstestStructure { publicstaticvoidMain(string[]args) { BooksBook1;/*声明Book1,类型为Book*/ BooksBook2;/*声明Book2,类型为Book*/ /*book1详述*/ Book1.title="CProgramming"; Book1.author="NuhaAli"; Book1.subject="CProgrammingTutorial"; Book1.book_id=6495407; /*book2详述*/ Book2.title="TelecomBilling"; Book2.author="ZaraAli"; Book2.subject="TelecomBillingTutorial"; Book2.book_id=6495700; /*打印Book1信息*/ Console.WriteLine("Book1title:{0}",Book1.title); Console.WriteLine("Book1author:{0}",Book1.author); Console.WriteLine("Book1subject:{0}",Book1.subject); Console.WriteLine("Book1book_id:{0}",Book1.book_id); /*打印Book2信息*/ Console.WriteLine("Book2title:{0}",Book2.title); Console.WriteLine("Book2author:{0}",Book2.author); Console.WriteLine("Book2subject:{0}",Book2.subject); Console.WriteLine("Book2book_id:{0}",Book2.book_id); Console.ReadKey(); } }
当上面的代码被编译和执行时,它会产生下列结果:
Book1title:CProgramming
Book1author:NuhaAli
Book1subject:CProgrammingTutorial
Book1book_id:6495407
Book2title:TelecomBilling
Book2author:ZaraAli
Book2subject:TelecomBillingTutorial
Book2book_id:6495700
C#结构的特点
您已经用了一个简单的名为Books的结构。在C#中的结构与传统的C或C++中的结构不同。C#中的结构有以下特点:
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
- 与类不同,结构不能继承其他的结构或类。
- 结构不能作为其他结构或类的基础结构。
- 结构可实现一个或多个接口。
- 结构成员不能指定为abstract、virtual或protected。
- 当您使用New操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用New操作符即可被实例化。
- 如果不使用New操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
类vs结构
类和结构有以下几个基本的不同点:
- 类是引用类型,结构是值类型。
- 结构不支持继承。
- 结构不能声明默认的构造函数。
针对上述讨论,让我们重写前面的实例:
usingSystem; usingSystem.Text; structBooks { privatestringtitle; privatestringauthor; privatestringsubject; privateintbook_id; publicvoidgetValues(stringt,stringa,strings,intid) { title=t; author=a; subject=s; book_id=id; } publicvoiddisplay() { Console.WriteLine("Title:{0}",title); Console.WriteLine("Author:{0}",author); Console.WriteLine("Subject:{0}",subject); Console.WriteLine("Book_id:{0}",book_id); } }; publicclasstestStructure { publicstaticvoidMain(string[]args) { BooksBook1=newBooks();/*声明Book1,类型为Book*/ BooksBook2=newBooks();/*声明Book2,类型为Book*/ /*book1详述*/ Book1.getValues("CProgramming", "NuhaAli","CProgrammingTutorial",6495407); /*book2详述*/ Book2.getValues("TelecomBilling", "ZaraAli","TelecomBillingTutorial",6495700); /*打印Book1信息*/ Book1.display(); /*打印Book2信息*/ Book2.display(); Console.ReadKey(); } }
当上面的代码被编译和执行时,它会产生下列结果:
Title:CProgramming
Author:NuhaAli
Subject:CProgrammingTutorial
Book_id:6495407
Title:TelecomBilling
Author:ZaraAli
Subject:TelecomBillingTutorial
Book_id:6495700
补充:
类与结构体的区别
1、结构体中声明的字段无法赋予初值,类可以:
structtest001 { privateintaa=1; }
执行以上代码将出现“结构中不能实例属性或字段初始值设定”的报错,而类中无此限制,代码如下:
classtest002 { privateintaa=1; }
2、结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制:
类与结构的选择
首先明确,类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
以上就是详解C#结构体的详细内容,更多关于C#结构体的资料请关注毛票票其它相关文章!