在Unity中很多已经定义为结构体的数据结构
  • Vector2, Vector3 和 Vector4
  • Rect
  • Color和Color32
  • Bounds
  • Touch
 

1.Class为引用类型,Struct为值类型

值类型与引用类型的区别这两篇文章讲得很好
 
虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型。

引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址。

 
  以下是值类型与引用类型的表:
  
    从这张图可以看出,class(类)实例化出来的对象,指向了内存堆中分配的空间
                         struct(结构)实例化出来的对象,是在内存栈中分配
 
   所以,值类型和引用类型的区别就是:
            1、它们存储的位置不一样
            2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变
当说到类的实例是传引用时,实际过程是,先获取一个指针,它指向对象在内存中的地址,然后传递这个指针。这很重要,因为一个类的实例,实际上可能很大,包含了很多域甚至其他对象。在这种情况下,赋值和传递整个实例可能非常影响性能,这就为什么要用传地址来替代。
说到传值时,实际过程是,对这个变量进行全克隆/拷贝,然后传递这个副本,原始值不变。结构体就是值类型,它是传值的。这意味着,结构体是理想的小型数据结构。
 
由于引用类型在托管堆上分配,它只会在调用垃圾回收时才被清理。
值类型实在内存栈上分配,这就说明他们很容易被回收,而且不受垃圾回收的影响。
 
数据类型分隔为值类型和引用类型。值类型要么是堆栈分配的,要么是在结构中以内联方式分配的。引用类型是堆分配的。引用类型和值类型都是从最终的基类 Object 派生出来的。当值类型需要充当对象时,就在堆上分配一个包装(该包装能使值类型看上去像引用对象一样),并且将该值类型的值复制给它。该包装被加上标记,以便系统知道它包含一个值类型。这个进程称为装箱,其反向进程称为取消装箱。装箱和取消装箱能够使任何类型像对象一样进行处理。
 

2.Class可以继承父类,Struct不可以

所有结构体都默认继承System.ValueType父类,所以不能继承别的父类,ValueType是值类型的基类,详见:https://msdn.microsoft.com/zh-cn/library/system.valuetype(VS.80).aspx
 
 
 

3.Struct必须在构造函数对所有变量赋值

结构体中所有变量都必须在构造函数中初始化
 

4.Struct没有默认构造函数

 
Struct不允许有参数为空的构造函数
 

5.Struct与class的性能上的优缺点

关于值类型与引用类型的内存可以看这篇文章:https://msdn.microsoft.com/zh-cn/dd365372
 
值类型的实例化之后在内存的大小就是其所有内容物大小,也就是内容物内存越大、占用内存越大,存放在栈中,但是取值更快,不需要GC回收
引用类型把值存放在堆中,引用存在栈中,实例化时要在堆中取值,所以更消耗时间,但是更省内存,因为只用引用指针的大小,需要GC回收
 
 
  值类型 引用类型
内存
耗时
GC
     
     
 
 

6.Struct类型变量默认不可为空

也就是说,不能写这个语句 struct != null,如果像这样做的话,一定要加上?,为它取值要加上Value,判断是否为空要用HasValue
Struct? struct = *****;
if(struct.HasValue)
     struct.Value.***** = ****;
值类型后面加问号表示可为空null(Nullable 结构)
Nullable是.NET 2.0中新提供的一种用于标明一个值类型是否可以为空的技术。
  对于一个类型,如果既可以给它分配一个值,也可以给它分配空引用null(表示没有任何值),我们就说这个类型是可空的。
  因此,可空类型可表示一个值,或表示不存在任何值。例如,类似 String 的引用类型就是可空类型,而类似 Int32 的值类型不是可空类型。Nullable 结构支持将值类型扩展为可以为null,但不支持在引用类型上使用,因为引用类型本身就是可空的。
因为值类型的容量只够表示适合于该类型的值,因此它不可为空;值类型没有表示空值所需的额外容量。
例:public int? age;

等同 Nullable<int>

 

7.其他

值类型还有一个特性就是一旦修改值,就会产生一个值类型的副本
引用类型修改值,不会产生副本,但所有有该引用的值都会被修改

by wolf96 2017/7/19
 

c#中Class和Struct使用与性能的区别的更多相关文章

  1. c#中结构体(struct)和类(class)的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...

  2. 使用有序GUID:提升其在各数据库中作为主键时的性能

    原文出处:https://www.codeproject.com/articles/388157/guids-as-fast-primary-keys-under-multiple-database  ...

  3. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

  4. sql中varchar(n),nvarchar(n) 长度性能及所占空间分析

    sql中varchar(n),nvarchar(n) 长度性能及所占空间分析 1.varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. ...

  5. [ASP.NET]ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  6. MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)

    这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下   show profile是由Jerem ...

  7. ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...

  8. 《挑战30天C++入门极限》C/C++中结构体(struct)知识点强化

        C/C++中结构体(struct)知识点强化 在上一个教程中我们已经简单的阐述了什么是结构体了,为了进一部的学习结构体这一重要的知识点,我们今天来学习一下链表结构. 结构体可以看做是一种自定义 ...

  9. golang 中 map 转 struct

    golang 中 map 转 struct package main import ( "fmt" "github.com/goinggo/mapstructure&qu ...

随机推荐

  1. Java集合源码分析之 LinkedList

    一.简介 LinkedList是一个常用的集合类,用于顺序存储元素.LinkedList经常和ArrayList一起被提及.大部分人应该都知道ArrayList内部采用数组保存元素,适合用于随机访问比 ...

  2. tcp/ip详解 卷1 -- 链路层

    以太网 以太网指数字设备公司,英特尔公司,Xeror公司在 1982年联合公布的一个标准, 是当前 TCP/IP 采用的主要局域网技术. 以太网采用 CSMA/CD 的媒体接入方法, 即 带冲突检测的 ...

  3. VMware安装CentOS 提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案

    安装虚拟机遇到错误: 在网上查了查资料,发现CPU支持VT技术的就能支持vmware中安装64位虚拟机. 以下是操作步骤: 1)到网上下载一个securable.exe,测试以下机器是否支持VT. l ...

  4. postgresql初体验

    docker pull orchardup/postgresql docker run -d -p 5432:5432 -e POSTGRESQL_USER=test -e POSTGRESQL_PA ...

  5. 1、AngularJS 验证

    1.formName.inputFieldName.property($pristine(未修改).$dirty(修改过的).$valid(合法).$invalid(非法).$error(当前表单所有 ...

  6. TCP/IP三次握手,四次断开

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: SYN: ...

  7. java底层学习---1

    JRE: Java Runtime EnvironmentJDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语 ...

  8. htm5

    htm5在html4.0. xhtm1.0的基础上增加了音频.视频.拖拽等功能,不过,htmL5,还在完善中,不过大部分浏览器都已经支持了部分功能. 兼容性: 最新版本的 Safari.Chrome. ...

  9. (转载)Sybase:bcp命令参考

    参考文档: http://blog.csdn.net/wwp1026/article/details/6900569

  10. springmvc+mybatis 做分页sql 语句

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-// ...