目录
一、结构体的定义
C#中结构体的定义使用struct
struct Books
{
//如果不使用public修饰的话,外界是无法直接访问到的
public string title;
public string author;
public string subject;
public int book_id;
};
二、结构体和类的区别
需要用到的结构体和类
public class Book
{
//使用public修饰,外界可以访问
public int id;
public string name;
public Book(int ID,string NAME)
{
id = ID;
name = NAME;
}
}
public struct student
{
public int Id;
public string Name;
public student(int id,string name)
{
Id = id;
Name = name;
}
}
(1)
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
简单来说就是结构体可以不使用new来进行实例化,但是类却要new进行实例化,如下:
Book b1 = new Book(1, "书籍1"); Book b2 = new Book(2, "书籍2"); student b3; b3.Id = 1; b3.Name = "909";
(2)
结构体是值类型,它们是在栈上分配,因为是在栈上分配,所以它们一般是比类更轻量,适用于简单的数据表示。
类是引用类型,它们是在堆上分配内存,因为是在堆上分配内存,所以说可能会涉及更多的内存开销和管理
简单来说,结构体是值类型,就是说如果将另一个变量复制给这个变量,那么复制的是整个结构,你也可以理解成是一个新的变量,修改新变量并不会影响原来的变量。
但是类是引用类型,所以它在赋值的时候其实存储的是引用,也就是说修改新变量是会影响到原来的变量的!
static void Main(string[] args)
{
//类,修改新对象会影响原来的对象
Book b1 = new Book(1, "书籍1");
Book b2 = new Book(2, "书籍2");
b1 = b2;
b1.id = 100;
//本来修改b1的id应该只有b1的ID是一百才对,但是都变成了一百
Console.WriteLine(b1.id+" "+b1.name);
Console.WriteLine(b2.id+" "+b2.name);
//结构体,修改新对象不会影响原来的对象
student s1 = new student(1, "学生1");
student s2 = new student(2, "学生2");
s1 = s2;
s1.Id = 100;
//修改s1的id并没有影响s2
Console.WriteLine(s1.Id + " " + s1.Name);
Console.WriteLine(s2.Id + " " + s2.Name);
}
(3)
结构体不能有无参数的构造函数,并且结构体是不能继承其他的结构或者是类。结构体是不能直接设置为null的
类的话是可以有无参数的构造函数,如果没有提供构造函数,系统会默认提供无参数构造函数,并且类是支持继承的!类的实例默认是可以是null,因为它们是引用类型
using System;
// 结构声明
struct MyStruct
{
public int X;
public int Y;
// 结构不能有无参数的构造函数
// public MyStruct()
// {
// }
// 有参数的构造函数
public MyStruct(int x, int y)
{
X = x;
Y = y;
}
// 结构不能继承
// struct MyDerivedStruct : MyBaseStruct
// {
// }
}
// 类声明
class MyClass
{
public int X;
public int Y;
// 类可以有无参数的构造函数
public MyClass()
{
}
// 有参数的构造函数
public MyClass(int x, int y)
{
X = x;
Y = y;
}
// 类支持继承
// class MyDerivedClass : MyBaseClass
// {
// }
}
class Program
{
static void Main()
{
// 结构是值类型,分配在栈上
MyStruct structInstance1 = new MyStruct(1, 2);
MyStruct structInstance2 = structInstance1; // 复制整个结构
// 类是引用类型,分配在堆上
MyClass classInstance1 = new MyClass(3, 4);
MyClass classInstance2 = classInstance1; // 复制引用,指向同一个对象
// 修改结构实例不影响其他实例
structInstance1.X = 5;
Console.WriteLine($"Struct: {structInstance1.X}, {structInstance2.X}");
// 修改类实例会影响其他实例
classInstance1.X = 6;
Console.WriteLine($"Class: {classInstance1.X}, {classInstance2.X}");
}
}