惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Hacker News
The Hacker News
Martin Fowler
Martin Fowler
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
F
Full Disclosure
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
阮一峰的网络日志
阮一峰的网络日志
T
Threatpost
P
Privacy International News Feed
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
I
Intezer
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Privacy & Cybersecurity Law Blog
A
Arctic Wolf
博客园 - 聂微东
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
H
Help Net Security
S
Schneier on Security
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
T
Tor Project blog
月光博客
月光博客
NISL@THU
NISL@THU
A
About on SuperTechFans
Spread Privacy
Spread Privacy
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
G
Google Developers Blog
W
WeLiveSecurity
P
Palo Alto Networks Blog
The Last Watchdog
The Last Watchdog
K
Kaspersky official blog
博客园 - 司徒正美
L
LINUX DO - 热门话题
小众软件
小众软件

博客园 - On the road....

c# -- 对象销毁和垃圾回收 C#集合 -- Equality和Order插件 C#集合--Dictionary C#集合 -- 自定义集合与代理 C#集合 -- Lists,Queues, Stacks 和 Sets C#集合--ICollection接口和IList接口 C#集合--数组 C#集合-列举(Enumeration) C#排序比较 Customer IEnuramble Extension C#相等性比较 c#列举和迭代器 C#记录对象的变化 C#按需序列化对象为Json字符串 c#如何区分静态只读变量和常量 C#代理那点事儿 Pro ASP.NET MVC –第五章 使用Razor Pro ASP.NET MVC –第六章 MVC的基本工具 Pro ASP.NET MVC –第四章 语言特性精华
C#如何更好地理解引用类型和值类型
On the road.... · 2014-02-19 · via 博客园 - On the road....

说道值类型和引用类型,在C#中,官方的说法就是:

值类型直接指向数据;一般包括C#自带的所有数字类型,字符类型,bool类型,当然还有自定义的结构类型和枚举类型

而引用类型则是指向数据存储的地址。一般指所有类,数组,代理和接口类型。请注意还包括字符类型

值类型与引用类型的根本区别就是它们在内存中处理的方式:

值类型的内容仅仅就是对类型的值;为一个值类型实例赋值总是赋值这个值的实例。比如 int a=1; int b=a;那么为b赋值的时候,就是把a的值复制一份,在内存中心创建一块区域保存b的值。a和b的存储是独立的。

而引用类型比值类型复杂,引用类型包括两部分:对象和指向对象的引用。引用类型变量是指向包含值的对象的引用。比如class a=new class(); class b=a;那么为b赋值的时候,仅仅把a的引用地址复制给b。这样a和b就指向内存中的同一个地址。a和b是关联的。

下面我们来举一个例,来说明值类型和引用类型在内存中的差别:

public class Staff
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
}

public struct Employee
{
    public string FirstName{get;set;}
     public string LastName { get; set; }
    public int Salary { get; set; }
}

...
private static void Demo()
{

    Staff s1 = new Staff { FirstName = "123" };
    Staff s2 = s1;
    s2.FirstName = "abc";

    Employee e1 = new Employee { FirstName = "123" };
    Employee e2 = e1;
    e2.FirstName = "abc";

    Console.WriteLine("s1="+s1.FirstName+", e1=" + e1.FirstName)
}

Difference between val and ref type

输出结果为:s1=abc, e1=123
注意s1为引用类型,e1为结构类型(值类型)