之值类型和引用类型,读书笔记

997755.com澳门葡京 1

 

枚举就是给1组值定义一种档次,成效是项目安全地使用这几个值。C语言中的枚举,会暗许分配从0拉长。Swift中,能够有原始值,也能够未有。类型能够为字符串,字符,数值。除了原始值,还有关联值,关联值类型能够为随机档次。枚举还援救计算属性,实例方法,构造函数,协议语法:

C# 之值类型和引用类型,

本文目的在于巩固基础知识,并不是对其进展深远解析,还望明白。
本文是对此项文化的整理文,有个别剧情出自互联网,其余为博主原创,所以难免会有1些小得瑕疵,敬请谅解。
具有示例均是博主测试过的,如有转发请标明出处,多谢。

值类型与引用类型是很基础的文化,也有很多对此的牵线,假使想深刻摸底,张老师的博客讲解的很好,链接如下:

之值类型和引用类型,读书笔记。本身在此地只是浅浅的介绍一下下:
从概念上看,值类型直接存款和储蓄其值,而引用类型存款和储蓄对其值的引用。值类型正是现金,要用直接用;引用类型是存折,要用还得先去银行取现。

作者们知晓,C#中的每一种档次可能是值类型,要么是援引类型。所以每种对象要么是值类型的实例,要么是援引类型的实例。
值类型和引用类型的基类
引用类型和值类型都继承自System.Object类。分歧的是,差不离全数的引用类型都直接从System.Object继承,而值类型则持续其子类,即直接接轨System.ValueType。
作为拥有类别的基类,System.Object提供了一组方法,这个主意在颇具品类中都能找到,在那之中包含toString方法及clone等措施。
System.ValueType直接接轨System.Object,即System.ValueType自己是一个类类型,而不是值类型;System.ValueType未有添加其余成员,但覆盖了所继承的片段格局,使其更符合于值类型。例如,ValueType重写了Equals()方法,从而对值类型根据实例的值来比较,而不是援引地址来比较。

struct Program
    {
        static void Main(string[] args)
        {
            Program testType = new Program();

            if (testType.GetType().IsValueType)
            {
                Console.WriteLine("{0} is value type.", testType.ToString());
            }
            Console.ReadLine();
        }
    }

值类型
值类型的特色:
1.C#的拥有值类型均隐式派生自System.ValueType。
逐一值类型及其基类:
结构体:struct(直接派生于System.ValueType);
数值类型:
整型:
short(System.Int16),ushort(System.UInt16),int(System.Int32),uint(System.UInt32),
long(System.Int64),ulong(System.UInt64),
sbyte(System.SByte的别名),byte(System.Byte),
字符型:char(System.Char);
浮点型:float(System.Single),double(System.Double);
用以财务总计的高精度decimal型:decimal(System.Decimal)。
bool型:bool(System.Boolean的别名);
枚举:enum(派生于System.Enum);
可空类型(派生于System.Nullable泛型结构体,语法 T? 是
System.Nullable<T> 的简写,此处的 T 为值类型。)
二.各样值类型均有3个隐式的暗中同意构造函数来开端化该项指标暗许值。
例如:
int i = new int();
等价于:
Int32 i = new Int32();
等价于:
int i = 0;
等价于:
Int32 i = 0;
选择new运算符时,将调用特定项目标暗中认可构造函数并对变量赋以默许值。在上例中,暗许构造函数将值0赋给了i。
叁.装有的值类型都是密封(seal)的,所以不能派生出新的值类型。
四.值类型的实例经常是在线程栈上分红的(静态分配),不过在壹些景况下得以储存在堆中。

引用类型
引用类型的特色:
1.C#的兼具引用类型均隐式派生自System.object。
**
次第引用类型及其基类: 数组:(派生于System.Array)数组的成分,不管是援引类型恐怕值类型,都存款和储蓄在托管堆上; 类:class(派生于System.Object); 接口:interface(接口不是二个“东西”,所以不设有派生于哪个地方的标题。); 委托:delegate(派生于System.Delegate); object:(System.Object的别名); 字符串:string(System.String的别名)。 2.引用类型能够派生出新的体系。
3.引用类型能够蕴含null值。
四.引用类型变量的赋值只复制对指标的引用,而不复制对象自我。
伍.引用类型的目的总是在进程堆中分红(动态分配)。 值类型和引用类型的差异
具有继续System.Value的品种都是值类型,其余品种都是引用类型。
引用类型可以派生出新的种类,而值类型无法;
引用类型存款和储蓄在堆中,而值类型既能够储存在堆中也足以储存在栈中。
引用类型能够涵盖null值,值类型不能够(可空类型作用允许将 null 赋给值类型);
引用类型变量的赋值只复制对目的的引用,而不复制对象自作者。而将三个值类型变量赋给另叁个值类型变量时,将复制包含的值。
当比较多少个值类型时,举行的是内容相比;而相比五个引用类型时,进行的是援引比较。
值类型在内部存储器管理方面具有更加好的功效,并且不协助多态,适合当作存款和储蓄数据的载体;引用类型支持多态,适合用来定义应用程序的作为。
Int[]是引用类型可能值类型
**数组类型是引用类型,它们都持续System.Array,而System.Array继承自System.Object。所以具有的数组类型都是引用类型

之值类型和引用类型,
本文目的在于巩固基础知识,并不是对其展开深远解析,还望掌握。
本文是对此项文化的整理文,有个别内容来自网…

把int类型的值修改为varchar类型的值

上一篇:ECMA-335(CLI)标准 读书笔记(第贰部:概念和架构第九章) 

enum Type { case type1 case type2 case type3}

 

type1type2type3不会被私下认可赋值0,1,2仍是可以写成

8.       Common Type System

连串描述了值并点名了该项目标全体值应该帮忙的契约(见8.陆章)。因为CTS既帮衬面向对象编制程序(OOP)语言,也支撑函数式和进度式编制程序语言,所以它涉及到二种实体:对象和值。值是不难的位格局,如整型和浮点型;每一种值都有个种类来叙述它所占有的存款和储蓄空间和其显示中位的意思,也能描述在表现上所能做的操作。值用于代表诸如C编制程序语言中相应的简约类型,也要代表如C

  • +和Java™语言中国和北美洲目的的东西。

对象比值能够做更加多。各种对象都以自描述类型的,相当于说,它的品类是总之保存在其呈现里的。它有分别于其余具有目的的性状,并有岗位存款和储蓄其它的实体(那恐怕是指标可能值)。当个中地点上的始末被改动时,对象的特性不会变。

有三种对象和值,如下图资料展现。

   

 

997755.com澳门葡京 2

注:托管指针可以针对堆中。

 

泛型特征允许用一种格局来定义一整套的档次和格局,当中包罗叫做泛型参数的占位符。这么些泛型参数须要经过一定项目被替换,实例化为该家族成员的实际要求。泛型的统一筹划适合下列指标:

  • 相关性:泛型类型能够出现在任何CLI类型存在的地点。
  • 语言独立:不对源语言做出任何假若。可是,CLI的泛型试图帮助尽或然多语言的现有类中的泛型功用。别的,设计允许对眼下不够泛型的言语进行新扩大。
  • 完结独立:三个CLI的贯彻被允许专门逐一落到实处显示和代码,或大概由此装箱和拆箱值来共享全数的显示和代码。
  • 贯彻作用:泛型的属性并不如用对象仿真泛型的功用要差。3个好的贯彻要做得越来越好,就要制止在引用类型的实例化方面含糊不清,要对值类型的实例化产生专门的代码。
  • 对定义做静态检查:泛型定义能被单独于贯彻来证实核实。那样,泛型类型被静态验证,它的主意对持有有效的实例化而言向JIT编写翻译提供了保全。
  • 设想泛型参数的集合营为:总的来说,参数化的类型和泛型方法的表以往富有项目标实例化上是“相同的”。

别的,CLI帮助协变和逆变泛型参数,带有下列特征:

  • 项目安全(基于纯静态检查)
  • 简不难单:特殊境况下的,不雷同仅同意存在于泛型接口和泛型代理上(非类或值类型)
  • 不期望帮忙差距的言语能够忽略那几个特征,并将具有的泛型类型都看作同壹的。
  • 可知落到实处有个别语言中更复杂的搭档方案,如Eiffel。

八.一   面向对象编制程序的涉及

术语类型(Type)平时被用于面向值编制程序的天地里来表示数据的展现。在面向对象领域里时常指行为而不是显示。在CTS中,类型被用来表达那二种意思:当且仅当四个实体有同盟的显示和极度的一言一动时,它们才有十二分的档次。那样,在CTS中,一个体系派生自二个基类型,那么派生类型的实例能被基类型的实例替代,因为两者的表现和行事是十分的。

与部分OOP语言分歧,在CTS中,三个具有从根本上分歧展现的目的有两样的连串。壹些OOP语言用了2个类型上的两样定义。它们认为要是多个对象以同一的方式响应同壹套新闻,那么它们就有一致的项目。这些定义在CTS中被那种说法取代了,即对象完结均等的接口。

平等的,一些OOP语言(如Smalltalk)认为消息传递是计量的基本方式。在CTS中,这一定于调用虚方法(见八.四.四章),这里虚方法的署名扮演着新闻的剧中人物。

CTS自己并不行使“无类型编制程序”的定义。也便是说,未有主意在不掌握对象类型的情事下调用非静态的章程。即便如此,无项目编制程序还是能在依照达成了反光的包(见第四部)提供的工具的底蕴上落到实处。

八.二   值和类型

品种描述值。任何被项目描述的值都是项指标三个实例。任何值的利用——存款和储蓄它,作为参数字传送递它,操作它——都务求3个类型。那越发利用于具有的变量、参数、栈单元的赋值和章程结果上。类型定义了容许值和被项指标值接济的可能的操作。全部的操作符和函数应该有着种种可访问或选拔的值的品类。

各类值都有八个适用的值来全体描述它的花色属性。

各类值是它的至极品种的一个实例,也能是其他类型的一个实例。特别是,假使八个值是3个派生自别的门类的1个品类的实例,那么它也是此外那多少个类型的实例。

八.二.一          值类型和引用类型

有三种档次:值类型和引用类型。

  • 值类型——被八个值类型描述的值是自包涵的(种种值都能在不引用别的值的意况下被精晓)。
  • 引用类型——被引用类型描述的值中著录了另二个值的地点。

有各类引用类型:

·         对象类型是2个自描述值的引用类型(见八.二.三章)。1些对象类型(如抽象类型)仅是四个值的有个别讲述。

·         接口类型总是一个值的片段讲述,被广大指标类型潜在地援救。

·         指针类型是叁个编写翻译时的值描述,那么些值的变现是地面包车型大巴叁个机械地址。

·         内建的引用类型。

八.贰.贰          内建的值和引用类型

上面包车型地铁数据类型是2个CTS的完全部分,被VES直接帮忙。它们在持久的metadata中有越发的编码。

表1:特殊的编码

 

                                                                                          
Table 1: Special Encoding

Name in CIL assembler

(see Partition II)

CLS Type?

Name in class library

(see Partition IV)

Description

bool1

Yes

System.Boolean

True/false value

char1

Yes

System.Char

Unicode 16-bit char.

object

Yes

System.Object

Object or boxed value type

string

Yes

System.String

Unicode string

float32

Yes

System.Single

JEC 60559:1989 32-bit float

float64

Yes

System.Double

JEC 60559:1989 64-bit float

int8

No

System.SByte

Signed8-bitinteger

int16

Yes

System.Int16

Signed 16-bit integer

int32

Yes

System.Int32

Signed32-bitinteger

int64

Yes

System.Int64

Signed64-bitinteger

native int

Yes

System.IntPtr

Signed integer, native size

native unsigned int

No

System.UIntPtr

Unsigned integer, native size

typedref

No

System.TypedReference

Pointer plus exact type

unsigned int8

Yes

System.Byte

Unsigned 8-bit integer

unsigned int16

No

System.UInt16

Unsignedl6-bitinteger

unsigned int32

No

System.UInt32

Unsigned32-bitinteger

unsigned int64

No

System.UInt64

Unsigned64-bitinteger

 

在上表中归类的bool和char 类型为整型。

八.二.3          类、接口和对象

3个门类如若分明得定义了二个值的变现和定义在值上的操作,那么它就全体得描述了贰个值。

对于二个值类型,定义展现须求描述组成值显示的位的次第。对一个引用类型而言,定义展现需求描述组成值展现的位的地点和次序。

方法描述了能在二个稳妥品种的值上所做的操作。定义1套在卓越品种的值上的操作供给为每一种操作命名格局。

壹对连串仅是局地讲述;例如接口类型。这么些项目描述了一套操作的子集,未有表现,由此不是其余一个值的贴切展现。因而,当多个值有七个适度品种的时候,它也得以是广大项目标二个值。进一步说,因为很是品种完整描述了一个值,它也统统内定了三个适龄的值所能拥有的享有别的品类。

当各样值都有个贴切品种的时候,不接二连三能通过查看值的变现来支配它的贴切品种。特别是,永远不大概决定3个值类型的值的熨帖品种。思虑多少个内建的值类型,30人的有记号和无符号整数。当种种体系是它们各自值的全体表明时(如确切的项目),未有主意从贰个值的专有的3一个人体系中收获适当的品种。

对于一些誉为对象的值,总是恐怕从值中获得适当的花色。对象的熨帖品种也叫做对象类型。对象是援引类型的值,但并不是兼备引用类型描述对象。思量一个针对33个人整型的指针的值,一种引用类型。未有办法通过检查位新闻来收获其值类型;由此它不是个指标。未来设想内建的CTS引用类型System.String(见第六某些)。这么些项指标值的适当品种总是通过检查值来规定,由此类型System.String的值是指标,System.String是目的类型。

8.二.肆          值的装箱和拆箱

对各种值类型来说,CTS定义了三个联合的引用类型叫做装箱类型(boxed
type)。反之是不树立的:一般而言,引用类型未有三个合并的值类型。三个装箱类型的值的显现(装箱值)位于值类型的值被积存的地点。1个装箱类型是二个指标类型,装箱值是三个目的。

2个装箱类型不可能透过名字被间接引用,因而并未有字段或许地面变量能被给定二个装箱类型。最相近装箱枚举值类型的钦命基类是System.Enum;对于全体别的的值类型是System.ValueType。类型为System.ValueType的字段仅能包涵空值也许三个装箱值类型的实例。类型为System.Enum的地点变量仅能包蕴空值只怕2个装箱枚举类型的实例。

持有的值类型有2个誉为装箱(box)的操作。装箱一个任意值类型的值发生它的装箱值;例如,3个统1的装箱类型的值包涵了原值的按位拷贝。假诺值类型是空类型——定义为值类型System.Nullable<T>的三个实例——结果是三个空引用可能类型T的值属性的按位拷贝,注重于其HasValue属性(分别是false和true)。全体的装箱类型有个拆箱(unbox)操作,那就涌出了1个指向值的位彰显的托管指针。

装箱指令不仅只可以用来值类型;那样的连串被称为可装箱(boxable)类型。假设类型是底下的1种情景这正是可装箱的:

  • 1个不含有能指向CIL运算栈字段的值类型(包罗泛型值类型的实例)。

【理由:三个值类型上稍加字段不可能棉被服装箱,否则那些指向CIL运算栈顶的放置指针大概存在更长的命宫。例如:System.RuntimeArgumentHandle,
System.TypedReference。包含那样指针的值类型非正式的被描述为“按引用式(byref-like)”的值类型。】

  • 三个引用类型(包罗类、数组、代理和泛型类的实例化)
  • 二个非托管的指针类型
  • 3个泛型参数(对三个泛型类型定义或泛型方法定义)【注:泛型参数的装箱和拆箱扩充了CLI执行的属性开销。constrained前缀能够在骨子里调度值类型定义的方法时进步品质,那是经过制止装箱值类型形成的。

类型System.Void永远是不足装箱的。

接口和继续只定义在引用类型上。那样,当班值日类型定义(见八.玖.柒章)时能而且钦赐相应被值类型达成的接口和它继承自的类(System.ValueType或System.Enum),那仅用于装箱值。

CLS 规则三:装箱的值类型不是CLS包容的

【适当的时候用System
.Object,System.ValueType或System.Enum替代装箱类型】

CLS (consumer):不必要导入装箱值类型

CLS (extender):不须要提供语法规则来定义或选取装箱值类型

CLS (framework):不应当将装箱值类型用在它的集体导出方面。

八.2.伍          值的一模1样和拾分

有五个概念在全体值对上的二元运算符:相同(identity)和拾贰分(equality)。它们再次回到Boolean结果,是数学生运动算符上的十三分。也正是说,它们是:

  • 反身的 – a op a 为true
  • 匹配的 – 当且仅当b op a 为true时,a op b为true
  • 可传递的 – 要是a op b为true并且b op c为true,那么 a op c为true

除此以外,尽管同样总是意味着相等,反之却不树立。为通晓这几个操作之间的异样,考虑二个变量A,B和C,它们的门类是System.String,那里箭头的含义是“是八个对…的引用”:

997755.com澳门葡京 3

假若字符类别的职责是均等的(也正是说事实上唯有3个字符串在内部存款和储蓄器里),那些变量的值是完全相同的。尽管存款和储蓄的字符体系是同1的,存款和储蓄在变量里的值是相等的。那样,变量A和B的值是一样的,变量A和C以及B和C各分裂,全部一个A,B和C的值是13分的。

8.2.5.1    相同

如出一辙操作符被CTS如下概念:

  • 假如值有两样的合适品种,那么它们是不均等的。
  • 除此以外,假设它们的方便品种是值类型,那么当且仅当值的位系列,位成功都以一律的,它们就是一律的。
  • 除此以外,借使它们的妥善品种是引用类型,那么当且仅当值的地点是千篇1律的,它们便是如出1辙的。

一样在System.Object通过ReferenceEquals方法来促成。

8.2.5.2    相等

对此值类型,相等运算符是确切的值类型定义的壹局地。相等的定义应该服从以下规则:

  • 也正是应该是一个相当于操作符,如上边所定义的。
  • 同一应该代表相等,如前方所述。
  • 万一内部3个(大概五个)操作数是装箱类型,相等的判断相应经过以下格局:
    • 率先拆箱全部的装箱操作数,然后
    • 对结果的值做常用的是否等于的判断。

一样在System.Object通过Equals方法来贯彻。

【注:就算七个浮点型指针NaN被IEC 6055玖:一9九〇定义为相比较总是分歧,System.Object.Equals的契约需要重载必须满足多少个对等运算符的供给。因而,当比较几个NaN时,System.Double.Equals和System.Single.Equals重临true,而那种状态下如按IEC标准,相等运算符应重返False。

 

 

版权证明小编:Cubean
出 处:

**
本文版权归小编和博客园共有,欢迎转发,但未经小编同意必须保留此段表明,且
在文章页面分明地点给出原来的作品连接,不然保留追究法律权利的职分。**

 

enum Type { case type1,type2 case type3}

997755.com澳门葡京 ,赋值

enum Type { case type1,type2 case type3}var type = Type.type1type = .type2print

typeType类型,值为type1。由于type类型已经规定,所以第2次赋值时,能够简不难单类型名

switch type{ case .type1: print case .type2: print case .type3: print}

default

switch type{case .type1: printdefault: print}

原始值类型必须联合,原始值必须是字面量,必须唯一

enum Type:Int { case type1 = 1 case type2 case type3}print(Type.type1.rawValue)print(Type.type2.rawValue)print(Type.type3.rawValue)

在品种名后内定原始值类型,在档次值后钦命原始值,打字与印刷1,2,3,那表明,后边的三个值是电动抬高。

那试试字符串类型,赋值a,后边会不会自动赋值b,c

enum Type:String { case type1 = "a" case type2 case type3}print(Type.type1.rawValue)print(Type.type2.rawValue)print(Type.type3.rawValue)

打印a type2 type3,默许把枚举名当作字符串作为原始值

那再试试字符类型

enum Type:Character { case type1 = "a" case type2 = "b" case type3}print(Type.type1.rawValue)print(Type.type2.rawValue)print(Type.type3.rawValue)

报错为:当不是stringint项目时,枚举必须有分明的值。因为stringint能够测算后续的值?

枚举的隐式赋值

当类型为stringint,后续的值可以被隐式赋值int累加,string为string类型,值为枚举名

关联值类型可以分裂

enum Type{ case type1 case type2}var a = Type.type2var b = Type.type1printswitch a{case .type1(let a,let b): print \case .type2: print}

有了关联值好像就不得以有原始值?当绑定类型相同时,能够把let写前面

switch a{case let .type1: print \case .type2: print}

关联值和原始值是见仁见智的,原始值是枚举定义时预填充的值,对于特定的枚举类型,原始值是不变的。关联值是创办三个依照枚举成员的常量或变量时才设置的值,枚举成员的关联值能够变动。

enum Type:Int{ case type1 = 1 case type2 = 2}var type = Type(rawValue: 1)print((type?.rawValue)!)

在概念了原始值后,将活动得到Type(rawValue:1)构造方法,那是1个可难倒构造器,重返可选类型。

权且不做讲解

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website