当前位置:网站首页>二 分析C#中的结构
二 分析C#中的结构
2022-08-08 23:50:00 【我不配拥有55kg的你】
一 为什么要使用结构?
在开发过程中,我们经常使用到类,因为它足够灵活,但是又因为它存储在托管堆上,在我们需要一个较小的数据结构时,难免会造成性能上的一些浪费。例如我们建立一个桌子类,属性只有长,宽,高三个属性时,多多少少有点大材小用,这个时候,就推荐使用结构。
二 什么是结构?
结构与类很相似,也有很多不同的地方。申明结构时,使用 struct 关键字代替 class 即可。
1.结构是值类型
我们都知道类是引用类型,且存储在托管堆上。
但是结构时值类型,存储在栈中,这也是结构和类最大的区别
2.结构无法继承
结构不是为继承设计的,这意味着,它不能从一个结构中继承。唯一的例外是对应的结构最终派生于System.Object类。因此,结构也可以访问Object类中的方法,甚至可以重写。例如重写ToString()方法。
三 结构中的构造方法
1.结构与类一样,提供了默认的无参构造方法,但是,在最新版的C#中(基于VS2019),显式的实现结构的无参构造方法时,系统会给出错误提示:结构不能包含显式的无参构造函数。
这意味着,结构的无参构造函数无法显式实现。
2.我们为结构显式实现一个有参构造函数,为部分字段赋值。编译器依旧给出一个错误提示:在控制器返回调用方之前,字段必须完全赋值。
这说明,我们在为结构显式实现了一个有参构造函数之后,必须初始化该结构中的全部字段。
那么如果我们使用自动封装的属性会发生什么呢?
3.自动封装的属性在结构中的使用
我们看到。编译器依旧给出错误提示。
这说明,使用自动封装的属性时,同样要为全部初始化自动封装的属性。
四 结构的使用
结构在使用时,与类相同,使用 new 关键字实例化结构对象,使用“.”调用结构中的属性即可
public struct SimpleStruct
{
public SimpleStruct(int id)
{
ID = id;
Name = "Shawn";
}
public int ID {
get; set; }
public string Name {
get; set; }
//public string Name { get; set; }
//public decimal Money { get; set; }
}
结构中也可以定义方法,但是前边已经说过,如果数据结构复杂时,为了拥有更多的灵活性,还是建议使用类。
五 值传递和引用传递
我们都知道类是引用类型,所以它的传递方式是也是引用传递。
而结构是值类型,传递方式自然也是值传递。
例如:我们定义一个Work 结构,并定义几个基础属性。
public static void Struct_Test()
{
Work work = new Work();
work.Salary = 12500;
work.Position = ".NET软件工程师";
Work work2;
work2 = work;
work2.Salary = 7500;
//改变work2的值并不会影响work的值,说明结构是值类型,存储在栈上
Console.WriteLine(work.Salary); //输出12500
Console.WriteLine(work2.Salary); //输出7500
}
可以看到,修改第二个对象的值并不会影响第一个对象的值。
但是有些时候,我们使用结构时需要前边的值跟着一起变化,那么有没有办法呢?
答案是肯定的。
我们只需要在定义相关方法时,在需要引用传值的参数前添加 ref 关键字即可。
string Name="";
public void updateName(ref string name)
{
name=name+“——Shawna”
Name=name;
}
此时,我们调用方法时传回的参数值 name 也与属性Name的值一样了,因为添加了 ref 关键字,name参数也变成引用传递了。
边栏推荐
- 【深度学习】TensorFlow学习之路一:TensorFlow简介及线性回归、逻辑回归实现
- OSPF综合实验
- HCIP2---第一天实验
- [PP-YOLOv2] Training a custom dataset
- 10 Spark on RDD Cache
- RIP 实验
- [Deep Learning] TensorFlow Learning Road One: Introduction to TensorFlow and Implementation of Linear Regression and Logistic Regression
- HCIP2--RIP实验
- 浏览器插件:插件推荐
- Get the current time before/after one day's date
猜你喜欢
随机推荐
php convert timestamp to just, minutes ago, hours ago, days ago format
PHP闭包函数 bingTo的使用
12 Spark on RDD 分区器
启牛商学院靠不靠谱呢?证券账户开了安全吗
BGP实验
最常用正则表达式
测试计划包括哪些内容?目的和意义是什么?
并发专题第一篇,多线程快速入门和简单介绍
[Pytorch] Study Notes (1)
pytorch常用代码
mysql 高级知识【order by 排序优化】
机器学习建模高级用法!构建企业级AI建模流水线
TCP三次握手、四次断开
抽象内部类
可以在易方达基金上买基金吗,安全吗
MySql 删除数据表
postgresql源码学习(35)—— 检查点⑤-检查点中的XLog清理机制
OSPF综合实验
[YOLOv5] 6.0 environment construction (updated from time to time)
HCIP2---第一天实验