• 13
  • 13
分享
  • C#.Net中类与结构的区别——软件测试圈
  • 饭团🍙 2021-10-15 10:34:20 字数 1611 阅读 1031 收藏 13

一、类与结构的示例比较:

结构示例: 

public struct Person 
{ 
string Name; 
int height; 
int weight 
public bool overWeight() 
{ 
//implement something 
} 
}

类示例: 

public class TestTime 
{ 
int hours; 
int minutes; 
int seconds; 
public void passtime() 
{ 
//implementation of behavior 
} 
}

调用过程:

public class Test 
{ 
public static ovid Main 
{ 
Person Myperson=new Person //声明结构 
TestTime Mytime=New TestTime //声明类 
} 
}

从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢? 

二、类与结构的差别 

1. 值类型与引用类型 

结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型 

类是引用类型:引用类型在堆上分配地址 

堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 

因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 

注: 

  1. 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 

  2. 虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 

2.继承性 

结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed . 

类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承 

[NextPage]

注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样 

例如:结构实现接口?

interface IImage
{
void Paint();
}
struct Picture : IImage
{
public void Paint()
{
// painting code goes here
}
private int x, y, z; // other struct members
}

3.内部结构: 

结构: 

没有默认的构造函数,但是可以添加构造函数 

没有析构函数 

没有 abstract 和 sealed(因为不能继承) 

不能有protected 修饰符 

可以不使用new 初始化 

在结构中初始化实例字段是错误的 

类: 

有默认的构造函数 

有析构函数 

可以使用 abstract 和 sealed 

有protected 修饰符 

必须使用new 初始化 

三.如何选择结构还是类 

讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 

2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有1000 个点对象的数组,

[NextPage]

则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。 

3.在表现抽象和多级别的对象层次时,类是最好的选择

4.大多数情况下该类型只是一些数据时,结构时最佳的选择 


作者:佚名

来源:百度文库

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   据报道,为了省钱、增加收入,马斯克试图让员工购买Twitter办公室绿植。不愿透露姓名的Twitter工程师称,马斯克关注的重点主要是钱,为了省钱,马斯克已经炒掉了清洁和餐饮员工。  因为管理混乱,Twitter纽约办公室甚至出现蟑螂,马斯克无意与负责清洁卫生的员工续签合约,办公室甚至能闻到恶臭。  去年10月末马斯克收购Twitter,之后大刀阔斧改革,马斯克宣称改革是为了节省成本,防止公司破产。去年11月马斯克曾说Twitter每天亏损400多万美元。刚接管Twitter马斯克便裁员几千人,相当于员工总数的一半,而且公司不再提供免费食品。  因为一些账单未付Twitter被告上法庭,T...
            0 0 746
            分享
          • 正则表达式提取器作为jmeter中非常重要的组件,接口测试常用于上下接口的参数化,该提取器的一些高级使用会是我们的接口测试更加的高效和简洁。下面就介绍一下一些高级用法。三个实例说明Jmeter中正则表达式提取器的高级使用举例一:单模板单数据定义说明:引用名称:image表示变量名,不用多说正则表达式:这里的一对括号就是一个模板,两对括号就是两个模板,…..模板:这里要告诉Jmeter你要匹配哪个或哪些模板,$1$表示匹配第一个模板(就是正则表达式里的第一对括号)匹配数字:告诉Jmeter如果匹配到了多个符合要求的,你要哪一个?这里我填写-1,表示获取全部匹配的数据0表示随机-1表示全部1表示第...
            2 1 1555
            分享
          •   JMeter提供了不同种类的逻辑控制器,包括循环(Loop),简单(Simple),事务型(Transaction),模块(Module),随机(Random)等。对于刚接触JMeter不久的用户,甚至使用JMeter已有一段时间的朋友们来说,各类不同逻辑控制器自身的先后顺序,应用效果及其所控范围内取样器的执行顺序等都会造成你一定程度上的困惑不清。本次分享我们就JMeter中常见的逻辑控制器给大家来个大扫盲,驱散控制器的层层迷雾。  【逻辑控制器】  JMeter中的逻辑控制器可以让我们自定义线程中的处理请求顺序,可以控制“何时”将用户请求发送到Web服务器。例如,我们可以使用随机控制器将...
            7 8 2583
            分享
          •        近年来应用安全越来越受到企业的重视,安全测试的需求也随之激增。那么上手安全测试该了解哪些基础知识点呢?在这里我对常见的安全测试点进行了梳理,希望通过此文能够帮助大家普及安全测试中最常见的知识点!更希望此文能够起到抛砖引玉的作用,激发大家不断探索安全测试领域的热情!sql注入       威胁解读:Sql注入就是通过利用一些查询语句的漏洞,将sql语句传递到服务器解析并执行的一种攻击手段。当不可信的数据作为命令或查询语句的一部分被发送给解释器的时候,会发生注入漏洞,包括SQL、NoSQL、OS以及LDA...
            0 0 1463
            分享
          • 从整体的角度可以分为单元测试、集成测试、系统测试、确认测试。下面内容来自网络相关资料的整理:1、单元测试(1)定义:单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。(2)单元测试任务包括:模块接口测试;模块局部数据结构测试;模块边界条件测试;模块中所有独立执行通路测试;模块的各条错误处理通路测试。模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义...
            0 0 983
            分享
      • 51testing软件测试圈微信