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

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - 杨连国

win10 IoT开发 Serial​Device 返回 null .NET Delegates: A C# Bedtime Story【转载】 C++ 和 C# 变量定义的一点区别 变量定义 接口(CLR via C# 读书笔记) 生成器模式(builder) 类型和成员基础(CLR via C#) 抽象工厂模式(abstract factory) 李建忠C#面向对象设计模式纵横谈 —— 单件模式 李建忠C#面向对象设计模式纵横谈 —— 面向对象设计模式与原则 程序设计和重构的目标 OO设计原则——读《你必须知道的.NET》 输入法灰掉bug解决 半角全角Bug解决 由迭代模式想到得——用设计模式理解 .NET ASCII 表设计之妙 调用VC封装的DLL时,两个类型匹配问题 调用非托管Dll Invoke 和 BeginInvoke 的区别
基本类型、引用类型、值类型——(CLR via C#)
杨连国 · 2008-06-26 · via 博客园 - 杨连国

大家都说,CLR via C# 翻译的不好,也就没买,看英文原版,一边看一边想写笔记,但是懒惰让自己一直懒于动笔,随便写写吧,总比不写强。

    每种语言都有其基本数据类型。
    C#也不例外,但是这里不同之处在于多出了个.net平台。
    所以,C#每个基本数据类型都对应一个FCL类。但不一定都兼容CLS。

    C#规范说要尽量用C#约定的基本类型表示符,Jeffrey不这么认为,他认为应该尽量使用FCL提供的具体类名,这样不会产生歧义。

    另外关于基本数据类型之间的转化,Jeffrey说,这个不能遵循类继承关系规则了,编译器知道该怎么办。(佩服老外就在于这种地方,这个事他会拿出来单独给你说说)

    转化规则不细说了,因为我自己用C#,有句话必须说“在小数转化为整数时,C#总是舍掉小数部分”    数据溢出检查不多说了,缺省不检查。

    引用类型、值类型:

    之前一直没有太过于留意FCL提供的类中,哪些是引用类型,哪些是数字类型,还一直以为除了基本类型和枚举类型意外都是引用类型,Jeffrey倒是给提了个醒,说一般称其为结构的是值类型,结构是值类型这我清楚,可是一直没留意“结构”这个词。

    内存分配的事就不多说了,比较清楚。

    这里说说自定义值类型,通常也就是结构了,Jeffrey说,如果定义结构,那么其内定义的字段在程序运行期间不会被修改,或则说不能对其修改。刚开始不理解这句话的用意,看到后来的装箱和拆箱才明白了,因为很多人意识不到拆装箱,或则说有时候有潜伏的拆装箱操作,如果对内存分配和拆装箱基本原理不很清楚,往往会有不正确的赋值预期。另外定义的结构,尽可能的要小,如果要大点也可以,但就不要当参数传递了,因为这会带来性能损失。
    老实说,什么时候应该将一个类定义为结构,自己也学习过,但是上两点说法倒是头回听说。

    拆箱、装箱:
   
    老话题了,看上一章的时候了解到引用类型,有两个特殊的变量,一个就是类型指针,另外一个就是同步索引,这里我想说的是同步索引,因为有同步索引的存在所以,引用类型可以用来做同步锁,而值类型不可以,原因就在于此。(似乎懂了)

    泛型的问题暂不多说了。

    关于明显的需要类型转换的地方,发生拆装箱子,是易于理解的。但是对值类型调用方式时发生的潜在拆装箱倒是没注意,例如 Point p;p.GetType();就会发生装箱行为,因为GetType方法直接继承于Object,而值类型重载的虚方法或自己的方法调用则不会发生装箱行为。

    对象Equal检查:

    object提供的Equal虚方法,用来识别两个对象是否是指向同一个对象,但是Jeffrey说,如果你真是这个目的最好不要用Equal虚方法,最好用静态的ReferenceEqual,为什么呢?因为虚方法是可以被覆写的,覆写后是否还是这样一层意思就不一定了。例如,你可以判断两个对象是否值相等,基本数据类型就是这么覆写的,字符串也是这么覆写的。所以是比较两个对象是否相等还是指向同一个对象,是要仔细计较一下的。

    object Hash Code

    对哈希表为什么叫哈希表一直不清楚,对object的GetHashCode方法,更是不知道怎么用。
    看过这一节之后,略有明白:

    Microsoft为了实现对不同对象的区分,以方便将其放在HashTable内,通过hashcode找对对应 键/值 对,所以为object设置了这样一个GetHashCode的方法,获取一个唯一的哈希码区分,object内部的算法不清楚,但是它提供的是虚方法,你自己可以覆写自己的区分方式,当然这要遵循一定的原则。另外,如果覆写Equal方法的话,就一定要覆写GetHashCode方法,原因是hashtable判断两个对象是否Equal需要用到该方法,这里的对象是指key对象。

    需要特别说明的是,这里获取的hash code 可以在某次应用中用于区分对象,但是不能将某次获取的hashcode作为永久标志应用,它是会变的(例如算法的重写)。

    如何写获取HashCode的方法,以及实现规则就不多说了。