C#-Struct简单的用法

本文介绍了C#中结构体的基本概念,包括如何定义结构体、初始化结构体成员的方法及注意事项。文中还对比了结构体与类的区别,并强调了结构体作为值类型的特点。

 /*定义Point 里面就只有2个属性 但是我们实际上根本不需要类的全部功能 */


        class Point
        {
            public int x;
            public int y;
        }

这样写就方便多了

 struct Point
        {
            public int x;
            public int y;

            public int X
            {
                get
                {
                    return this.x;
                }
                set
                {
                    this.x = value;
                }
            }

            public Point(int x, int y)
            {   
                //必须把结构中的变量初始化
                this.x = x;
                this.y = y;
            }
        };


初始化结构体


            Point point1 = new Point(10,20);


            //第二种方式
            Point point2;
            point2.x = 10;
            point2.y = 20;

注意事项


               1.结构体没有无参数构造方法 必须得提供一个有参数的构造函数初始化字段
               2.使用new关键字创建结构对象,并且调用构造方法 但是结构也可以不使用new关键字
               如果不使用new关键字 则结构体的字段都是保持未初始化 初始值为0
               3.结构不能继承结构或继承类,所有结构继承System.ValueType[隐士继承]后者继承System.Object
               4.可以实现接口
               5.声明的时候不能初始化结构字段
               6.结构是值类型 不是引用类型 例如A复制B结构 只是复制数据 没有复制引用 
               如果当做参数传递最好前面加引用符号ref
             



<think>好的,我现在需要回答用户关于C#struct的使用指南的问题。首先,我要回忆一下struct的基本概念和用途。structC#中是值类型,通常用于轻量级对象,比如坐标、颜色等,这样可以提高性能,尤其是在处理大量数据时,减少内存分配的开销。 用户可能想知道如何定义struct,它的特点,以及与class的区别。根据提供的引用,引用[3]提到struct适合轻量对象,例如Point、Rectangle,使用struct可以节省内存。比如定义一个CoOrds结构体,包含x和y坐标。另外,引用[1]指出ref struct的特殊性,只能在栈上分配,不能被装箱,传递时是引用而不是副本,这可能在某些高性能场景下有用。但用户可能更关注普通struct的使用,所以需要先介绍基本用法,再提到ref struct作为高级部分。 然后,引用[2]提到C# 10引入了record struct,结合了结构体和记录的特性,可以用于不可变数据。这也是一个值得注意的新特性,应该包括在指南中。 接下来,用户可能需要知道何时使用struct,比如当对象较小、不可变、不需要继承时。同时,要注意struct的默认无参构造函数在C# 10之前不能显式定义,但C# 10允许了,这可能是一个变化点,需要确认正确性。 另外,结构体的初始化方式,比如是否需要使用new关键字,或者直接赋值。struct的实例在栈上分配,而class在堆上,这点对性能影响很大,尤其是在处理数组或集合时,如引用[3]中提到的1000个Point对象数组的例子,节省内存。 还要考虑结构体的方法、属性、实现接口的能力。struct可以包含方法、属性、字段、构造函数,但不能继承其他结构或类,但可以实现接口。 可能的陷阱包括结构体过大导致拷贝开销大,或者误用可变结构体引发的问题。应该建议结构体保持小巧和不可变。 最后,根据用户提供的引用,引用[4]展示了在粒子系统中使用struct的例子,存储位置、速度、生命值,这可能是一个实际应用案例,可以引用作为示例。 现在需要组织这些信息,结构清晰,分点说明,包括定义、特性、使用场景、与class的对比、record struct、注意事项等。同时,生成相关问题,如性能影响、与类的选择、record struct的用途等。 需要确保所有数学表达式用$...$,如无数学内容则无需使用。代码块用正确语法,如C#struct定义。引用标识要自然添加在相关段落末尾,例如引用[3]在讨论内存节省时提到数组的例子。</think>### C# struct 使用指南 #### 1. 结构体的定义与基本特性 结构体(struct)是C#中的**值类型**,适合表示轻量级数据对象。定义方式如下: ```csharp public struct CoOrds { public int X; public int Y; public CoOrds(int x, int y) { X = x; Y = y; } } ``` - **内存分配**:struct实例默认在栈上分配(除非作为引用类型成员),适合高频创建/销毁的场景[^3]。 - **传递方式**:赋值或传参时按值拷贝(除非使用`ref`关键字)。 #### 2. 结构体的核心优势 - **内存效率**:当需要创建大量小型对象时(如1000个坐标点),struct比class更节省内存。 - **性能优化**:栈分配减少垃圾回收压力,适合实时性要求高的场景(如游戏粒子系统)[^4]。 #### 3. 何时使用struct? ✅ **推荐场景**: 1. 对象大小小于16字节(拷贝开销小) 2. 需要不可变性(可通过`readonly struct`强化) 3. 无需继承或多态(struct不支持继承) ❌ **避免场景**: 1. 需要频繁装箱(会破坏性能优势) 2. 包含大尺寸字段(如数组、复杂对象) #### 4. 与class的关键区别 | 特性 | struct | class | |---------------------|-----------------|-----------------| | 内存分配 | 栈/内联 | 堆 | | 默认构造函数 | 自动生成无参构造| 允许自定义无参构造 | | 继承 | 不支持 | 支持 | | 可为null | 需用`Nullable<T>`| 原生支持 | #### 5. 高级用法 - **ref struct**:强制栈分配,禁止装箱(如`Span<T>`),用于零拷贝高性能场景[^1] ```csharp ref struct SensorData { public float Value; public void Process() { /*...*/ } } ``` - **record struct**(C# 10+):结合值类型与记录特性,支持不可变数据模型[^2] ```csharp public record struct Point(int X, int Y); // 自动生成Equals/ToString等方法 ``` #### 6. 注意事项 1. **避免过度使用**:结构体应保持简单,建议字段不超过3个 2. **慎用可变性**:修改值类型副本可能导致逻辑错误 ```csharp var point = new CoOrds(0, 0); Modify(point); // 传递的是拷贝 Console.WriteLine(point.X); // 输出0 void Modify(CoOrds p) => p.X = 10; ``` 3. **C# 10改进**:允许自定义无参构造函数 ```csharp public struct Measurement { public double Value; public Measurement() { Value = double.NaN; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值