结构

本文深入探讨了结构(struct)和类(class)在C#中的不同特性,包括数据类型、成员访问、赋值方式、构造与析构函数的使用,以及如何在代码中有效利用这些特性提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是结构

结构是程序员定义的数据类型,与类非常相似。有数据成员和函数成员。
区别:类是引用类型而结构是值类型;
结构是隐式密封的,这意味着它们不能被派生。
声明结构:struct关键字

struct StructName
{
MemberDeclarations
 }

例:

struct Point
{
    public int X;
    public int Y;
}
class Program
{
    static void Main(string[] args)
    {
        Point first, second, third;
        first.X = 10; first.Y = 10;
        second.X = 20; second.Y = 20;
        third.X = first.X + first.Y; third.Y = first.Y+second.Y;
        Console.WriteLine("first:{0},{1}", first.X, first.Y);
        Console.WriteLine("second:{0},{1}", second.X, second.Y);
        Console.WriteLine("thirdt:{0},{1}", third.X, third.Y);
        Console.ReadKey();
    }
}

结构是值类型

结构类型的变量不能为null;
两个结构变量不能引起同一对象。

   class CSimple
{
    public int X;
    public int Y;//存在栈中
}
struct Simple
    {
    public int X;
    public int Y;//存在堆中
}

对结构赋值

把一个结构值赋值给另一个结构,就将一个结构的值复制给另一个结构。
复制类变量时只是复制引用。

class CSimple
{
    public int X;
    public int Y;
}
struct Simple
{
    public int X;
    public int Y;
}
class Program
{
    static void Main(string[] args)
    {
        CSimple cs1 = new CSimple(), cs2 = null;//类实例
        Simple ss1=new Simple() ,ss2=new Simple() ;//结构实例
        cs1.X = ss1.X = 5;//将5赋值给ss1.X和cs1.X
        cs1.Y = ss1.Y = 10;//将10赋值给ss1.Y和cs1.Y
        cs2 = cs1;//赋值类实例
        ss2 = ss1;//赋值结构实例
        Console.ReadKey();
    }
} 
在类赋值之后,cs2和cs1指向堆中同一对象。
但在结构赋值之后,ss2的成员的值和ss1的相同。

构造函数和析构函数

结构可以有实例构造函数和静态构造函数,但不允许有析构函数。

实例构造函数

语言隐式地为每个结构提供一个无参数的构造函数。
值成员设置成他们的默认值。
引用成员设置成null。

struct Simple
{
    public int X;
    public int Y;
    public  Simple(int a,int b)
    {
         X=a;
         Y=b;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Simple s1 = new Simple();//调用隐式构造函数
        Simple s2 = new Simple(5,10);//调用构造函数
        Console .WriteLine ("{0},{1}",s1.X ,s1.Y );
        Console.WriteLine("{0},{1}", s2.X, s2.Y);
        Console.ReadKey();
    }
}
静态构造函数

与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构的静态构造函数遵从与类的静态构造函数一样的规则。
以下两种行为,将会调用静态构造函数:
调用显式声明的构造函数。
引用结构的静态成员。

字段初始化是不允许的

struct Simple
{
public int X=0;//不允许//编译错误
public int Y=10;//编译错误
}

结构的密封的

结构总是隐式密封的,因此,不能派生其他结构。
不能用于结构的修饰符:
protected;
abstract;
virtual;
结构本身派生自System.ValueType

装箱和拆箱

如果想将一个结构实例作为引用类型对象,必须创建装箱的副本。
装箱的过程就是制作值类型变量的英语类型副本。

结构作为返回值和参数

结构可以用作返回值和参数
返回值:当结构作为返回值时,将创建它的副本并从函数成员返回。
值参数:当结构被用作值参数时,将创建实参结构的副本。该副本用于方法的执行。
ref和out参数:传入的方法是该结构的一个引用,这样就可以修改其数据成员。

关于结构的其他信息

对结构进行分配比创建类的实例开销小,使用使用结构代替类有时可以提高性能,但要注意装箱和拆箱的高代价。
预定义简单类型实际上在.net中都实现为结构。
可以使用与声明分部类相同的方法声明分布结构。
结构和类一样,可以实现接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值