C# 结构体学习研究

internal class TestStruct {
        /// <summary>
        /// 结构体
        /// </summary>
        struct StructEntity {
            public int ID { get; set; }
            public string Name { get; set; }
        }
        /// <summary>
        ////// </summary>
        class ClassEntity {
            /// <summary>
            /// 结构体作为类的成员会分配在类的堆中
            /// </summary>
            public StructEntity SE;
            public void ChangeSE() {
                SE.Name = "张九";
            }
            /// <summary>
            /// 通过返回值返回结构体
            /// </summary>
            /// <returns></returns>
            public StructEntity GetSE() {
                return SE;
            }
        }
        readonly ClassEntity CE = new ClassEntity();
        public void Test() {
            CE.SE = new StructEntity { //给结构赋值
                ID = 1,
                Name = "张三"
            };
            var se = CE.SE; //测试=赋值
            se.Name = "李四";
            Output(se);
            Test2(CE.SE); //测试参数传递
            var se1 = CE.GetSE(); //测试返回值
            se1.Name = "赵六";
            Output(se1);
            CE.ChangeSE(); //测试修改原数值
            Output(se1);
        }
        void Output(StructEntity se) {
            //传入的se也是个新的结构体
            Console.WriteLine(se.Name + " | 原始值:" + CE.SE.Name);
        }
        void Test2(StructEntity se) {
            se.Name = "王五";
            Output(se);
        }
    }

运行结果:

总结(只是个人的理解,可能有不正确的地方,如果有错误望指出):

1,结构体是值类型,每次赋值和传递都会创建一个新的结构体,修改新的结构体不会影响原数值,因此其具有不变性,感觉比较适合作为缓存的容器使用

2,使用结构体的时候可以将其理解成大号的int,因为int就是结构体

3,当结构体在方法中会存储在堆栈中,当作为引用类型的成员时会存在在该成员所在的堆中?(存疑)

4,当我们描述一个轻量级对象的时候,结构体可提高效率,成本更低,因此在存储大量小数据时可以使用结构体

5,结构体不能太大,因为结构体每次都要创建新的数据,太大的话得不偿失,反而用class更合适,因为class只传递一个引用,当类型定义大于16字节时不要选用struct

6,结构体作为参数传递和返回值时会创建新的,因此不要层层传递或返回结构体,复杂的结构体最好作为类的成员传递,尽量避免直接传递结构体本体

7,结构体不适合作为模型使用,比较适合作为小数据的容器使用

posted @ 2023-04-23 12:06  WmW  阅读(17)  评论(0编辑  收藏  举报