首页
学习
活动
专区
工具
TVP
发布

《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(二)

从托管堆上分配一个对象时,总是强制执行一次垃圾收集操作 虽然FCL得大多数类型都是引用类型,但程序员使用最多的还是值类型,如果一个程序全部使用的是引用类型,那么它的性能会极度低下。...为了提升性能,CLR提供了名为“值类型”的轻量级类型。 值类型不受GC得控制。...---- .NET Framework SDK明确指出,哪些类型是值类型 OR 引用类型: 任何称为“类”的都是引用类型:System.Exception类、System.Random类; 结构或者枚举为值类型...选择使用值类型还是引用类型 某些时候,值类型能提供更好的性能,具体说除非以下所有条件都满足,否则不应将一个类型声明为值类型类型具有基元类型的行为。...(即其中没有成员会修改类型的任何实例字段) 类型不需要从其他任何类型继承 类型也不会派生出其他类型 除了满足以上3个条件之外,还必须满足以下任一条件: 类型的实例较小(约16字节或者更小) 类型的实例较大

30010
您找到你想要的搜索结果了吗?
是的
没有找到

C# 基元类型

"基元类型"。..."基元类型"直接映射到Framework(FCL)中存在的类型。如:在用"基元类型"int初始化一个整数时,int会直接映射到FCL中System.Int32类型,这个过程,编译器自动完成....,以及基元类型对应的Framework(FCL)中的FCL类型,以及当前基元类型的CLS(公共语言规范)相容性,对于相容于公共语言规范的类型,其他语言将提供类似的基元类型. ?...关于开发的时候是使用基元类型还是FCL类型,这是个仁者见仁,智者见智的问题。...C#语言规范建议我们使用基元类型,但是使用基元类型的坑还是很多的,下面来列举几个: (1)、很多人会困惑使用string还是String,其实是一样的,如果使用string初始化一个字符串,编译器会把string

83370

《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(一)

本章内容 编程语言的基元类型 引用类型和值类型类型的装箱和拆箱 对象哈希码 dynamic基元类型 本章目的 通过学习了解基元类型、引用类型和值类型的区别,希望让coder...编译器直接支持的数据类型称为基元类型(primitive type) 基元类型直接映射到Framework类库(FCL)中存在的类型,比如C#中,int直接映射到System.Int32类型,因此,以下...,VS的其他语言都将提供类似的基元类型。...对于非CLS的类型不要求。 下图标明了C#中的对应FCL的基元类型: ?...checked和unchecked基元类型操作 对基元类型执行的许多算术运算都可能造成溢出,如下: 1: Byte b = 100; 2: b = (Byte)(b+200);//b现在包含

37930

3-基元类型、引用类型和值类型、装箱拆箱

1.基元类型 编译器直接支持的数据类型成为基元类型。...基元类型与FCL中的类型有直接的映射关系[int=Int32],这样我们可以简化的方式书写代码,并且编译后的IL和直接使用FCL中的数据类型是完全相同的。...System.Decimal是一个特殊的类型,虽然C#把它当作基元类型,但是CLR却不是,意味着CLR没有直接操作Decimal的IL指令,查看msdn中Decimal类型的文档可以发现它提供了Add、...Divide、、、静态方法及一些操作符[+-*/...]重载方法,当我们使用它的值运算时实际上是调用它的成员来执行的,所以效率会比其他基元类型差些[CLR为其他基元类型直接提供了运算的IL指令,省去了操作符的重载...2.引用类型和值类型: 作为局部变量时值类型位于线程堆栈上,引用类型位于托管堆;作为类型成员时,则由其所属类型决定。托管代码中,我们定义的类型决定了它在内存中的分配位置,而我们对此没有控制的权限。

88150

.NET的基元类型包括哪些?Unmanaged和Blittable类型又是什么?

在讨论.NET的类型系统的时候,我们经常提到“基元类型(Primitive Type)”的概念,我发现很多人并没有真正理解基元类型就究竟包含哪些(比如很多人觉得字符串是基元类型)。...除了明确界定基元类型外,本篇文章还会简单介绍额外两种关于类型的概念——Unmanaged类型和Blittable类型。...一、Primitive Type .NET下的基元类型(Primitive Type)如下14个。...外加布尔类型和字符类型, 计2个。所以我们熟悉的String(string)和Decimal(decimal)并不是基元类型。...如下的类型属于Unmanaged 类型的范畴: 14种基元类型+Decimal(decimal) 枚举类型 指针类型(比如int*, long*) 只包含Unmanaged类型字段的结构体 如果要求泛型类型是一个

18320

《CLR via C#》Part2之Chapter4 类型基础(一)

本章内容要点 所有类型都从System.Object派生 类型转换 命名空间和程序集 运行时的相互联系 所有类型都从System.Object派生 “运行时”要求每个类型最终都要从...System.Object类型派生。...由于所有类型最终都从System.Object派生,所以可以保证每个类型的每个对象都有一组最基本的方法,具体如下: ? 此外,从System.Object派生的类型能访问受保护的方法,如下图 ?...NameClass isaac = new NameClass(); 以下为new所做的事情: 计算所有需要的字节数 从托管堆中分配指定类型需要的字节数,从而分配对象的内存,分配的所有字节都设为(0)...初始化对象的“类型对象指针”和“同步块索引”成员 调用类型的实例构造器 执行完操作后,会返回指向新建对象一个引用。

26320

Chapter 2: auto

正确的做法应该是: for( const auto& p : m) { ... // as before } 有关代码可读性的建议: 如果使用显示类型声明使得代码更清晰且更容易维护,那么就应该使用显示类型声明...,否则就应该试着使用auto 通过auto声明的变量,如果想要方便获取是什么类型,可以通过命名规则来间接表示类型。...2.当auto推导出错误类型时使用显式类型初始化方式 当表达式返回的类型是代理类的类型时,不能使用auto 例1: //提取出Widget对象的特征,并以vector的形式返回 //每一个...唯独bool不适用),而是返回一个std::vector::reference类型的对象。...auto推到出代理类类型时,需要对表达式做代理类类型到实际类型的静态转换,而不是弃用auto 针对上面的例1: auto highPriority = static_cast(features

1.1K70

《CLR via C#》Part2之Chapter4 类型基础(二)

类型转换 CLR最重要的特性之一是安全性,在运行时,通过调用GetType(),总是知道一个对象的确切类型。 CLR允许将一个对象转换为它的实际类型或者它的任何基类型。...类型伪装是去多安全漏洞的根源。 在C#中还有is和as两种转换方式: is转换:is检查一个类型是否兼容于指定的类型,并返回一个Boolean值。...,将返回一个Null;因为使用as操作符,CLR只会校验一次对象的类型,所以性能有所提升。...命名空间和程序集 在C#中我们使用using引入命名空间,但是CLR并不知道命名空间的任何事,访问一个类型时,CLR需要知道类型的完整名称(长的、包括句点符号的名称)以及该类型的定义具体在哪个程序集中。...有时候,为了消除歧义,必须显示的告诉编译器要创建的是哪一个类型 1: //Isaac.Test中包含一个IsaacZhang类型 2: //Isa.Common中也包含一个IsaacZhang

37530

Chapter 4: Smart Pointers

Effective Modern C++(11&14)Chapter4: Smart Pointers 1....通用的例子是将 std::unique_ptr 作为返回层次结构中对象的工厂函数的返回类型,对于这样一个层次结构,工厂函数通常在堆上分配一个对象,然后返回指向该对象的指针,而工厂函数调用者则负责在使用完对象后..., g2, g3; }; Widget::Widget(): pImpl(std::make_unique()) {} std::unique_ptr 支持不完全类型...,编译器会插入调用 std::unqiue_ptr 的析构函数代码,默认的析构器是 delete ,然而通常默认 delete 会使用 static_assert 来判断原始指针是否指向的是一个不完全类型...为了解决这个问题,我们需要在析构函数调用时,确保 Widget::pImpl 是一个完整的类型,也就是当 Widget 的 Impl 在 Widget.cpp 中定义之后,类型是完整的,关键就是让编译器在看到

1.5K20

Chapter 6:Lambda Expressions

closure class 是一个类类型,一个closure可以从该closure class中实例化。每个lambda都会使得编译器产生一个独一无二的closure class。...应该填入x的类型,但是这个类型不是固定的 //且此处也不是模板函数 通过decltype来确定参数的类型名和左值/右值属性 过程: auto f = [](auto&& x) {...return normalize(std::forward(x); }; //1,decltype推导x的类型A //2.std::forward根据A推导模板参数类型...T decltype作用在左值参数,得到左值引用类型;作用在右值参数,得到右值引用类型 std::forward函数中T应该使用左值引用来暗示参数是左值,T应该使用非引用来暗示参数是右值 左值作用在通用引用...,得到左值引用参数;右值作用在通用引用参数,得到右值引用参数 尽管decltype在把右值参数推导为右值引用类型而不是非引用类型(std::forward中T要求的),但是最终转发的结果一样

1.7K50

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券