fixed 和 fixed
译自Eric Lippert's Blog, 原文: http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx
某天我收到一封这样开头的邮件:
我有一个关于C# 固定大小的缓冲区的问题:
unsafe struct FixedBuffer { public fixed int buffer[100]; }
现在把缓冲区声明为固定的,它就是不可移动的...
看到这个问题我的心都碎了。如果语言细节设计容易造成误解,那么上面所遇到的情况只是极为不幸的时刻之一。
当在非安全的代码中对托管对象使用指针算法时,你要确保垃圾回收器不会把你正需要的内存移掉。当你正在用指针操作某个对象的时候,如果另外一个线程进行了资源回收,那么这个指针将完全混乱。因此,C#把变量分为“固定的”和“可变的”。如果你想要将指针应用到一个可移动的对象上,你可以使用“fixed”关键字来声明“这个局部变量是不能被垃圾回收器移动的”。当回收行为发生时,垃圾回收器要为那些正在进行的调用查看所有局部变量(那些被用到的变量需要保留);如果回收器看到某变量被标为“fixed”,它不会移动这样的变量,即使这会造成托管堆碎片(由此也看出让这样的变量固定的时间尽可能少是很重要的)。所以典型地,我们用“fixed”代表固定在某个地方。
但是在这封邮件中的“fixed”并不是这个意思,这里的意思是将此问题中的buffer的大小固定为容纳100个int变量,本质上讲,这和在结构中创建100个int类型的成员是一样的。
明显地,我们经常使用相同的关键字来表示概念上相同的东西。比如,在C#中我们经常用不同的方式使用关键字“internal”,但是所有的“internal”表示的意义都是一样的。它只是用来表示“一些实体的访问权限在同一程序集的代码中是不受限制的”。
某些时候我们也用相同的关键字来表示概念上完全不同的东西,这要依赖于用户使用的上下文环境来确定它代表的意思。比如:
var results = from c in customers where c.City == "London" select c;
和
class C<T> where T : IComparable<T>
很明显“where”使用于两种完全不同的方式:建立查询语句中的筛选从句,和声明一个泛型参数的约束类型。
如果一个关键字用于两种不同的意义但是这个区别非常细微,就像我们上面举到的例子,这会使人们碰到困难。那个用户的邮件将会继续问上一大堆的问题,但是这些问题都是基于一个不正确的假设——一个固定大小的缓冲区会自动地固定在内存中的某一位置。
这只能说这是一个不好的术语的混用:“固定大小”和“固定位置”都是使用“fixed”,但是使用的方式不同,这是很让人头疼的事情。然而它们之间的关联比这还要复杂:只有当某固定大小的缓冲区的容器被固定在某块内存区,你才能安全地访问存储在该缓冲区中的数据。在这个问题中,这两个概念具有很强的相关性,但是并不完全相同。
一方面,为了减少混乱,我们可以使用两个不同的关键字,比如说“pinned”和“fixed”。但是另一方面,“fixed”的所有用法只在非安全代码中才可用。对于非安全的码的所有特性,一个关键的前提假设就是:如果你想在C#中使用非安全代码,那么你肯定已经是一个完全理解CLR中内存管理的编程专家。这也是为什么我们让你在代码中标明“unsafe”的原因;它表明你关闭了安全系统并且知道自己在做什么。
在C#中可以多用的一些重要的关键字:fixed, into, partial, out, in, new, delegate, where, using, class, struct, true, false, base, this, event, return和void都至少包含两种以上不同的意思。大部分的在位于特定上下文中的时候都很清楚,但是至少前三个——fixed, into和partial——已经造成了很多的困扰,我已经收到了很多困惑的用户关于它们使用区别的问题。我接下来会看一下“into”和“partial”。
转载于:https://www.cnblogs.com/tommyli/archive/2009/10/16/1584518.html
fixed 和 fixed相关推荐
- 关于el-table添加fixed或fixed=“right“无横向滚动条的解决方法
实现效果如下 在加入了fixed="right"之后可能会出现无滚动条无法滑动的情况,这时候我们需要加一个scrollbar的style样式加以解决,代码如下: 需要加上浏览器兼容 ...
- CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
- setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】
本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...
- SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号
SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号 如下图是我手工使用ME51N 创建的一个采购申请单据, MD04去看这个PR, 这个PR号码后面有一个*号,代表它是一个被fi ...
- 跨浏览器的CSS固定定位{position:fixed}
不知道您是否留意了,浏览本站时,浏览器右下角有一个标着top的黑色直角三角形,可以点击它返回到正在浏览的网页页眉.当滚动网页时,它的位置一直没有任何改变,您感觉它怎么样?这就是通过CSS的定位属性{p ...
- transform 遇上 position: fixed
最近遇到一个有意思的现象,以下 demo 中 fixed 的元素没有相对 viewport 定位,而是相对于它的父元素进行定位. <html><head><style&g ...
- fixed在微信下的BUG
2019独角兽企业重金招聘Python工程师标准>>> 最近在一个项目中,碰到了一个问题,是属于微信内部的问题,或者说,是属于APP内部的问题,它的根源来自于fixed定位以及-we ...
- transform限制position:fixed的跟随效果
我们应该都知道,position:fixed可以让元素不跟随浏览器的滚动条滚动,而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了.但是,真是一物降一物,pos ...
- 完美解决IE6中fixed抖动问题的方法
我们可以通过position:fixed来实现元素的固定效果,如网页中底部的"回到顶部菜单",底部的toolbar,对联广告等等,可惜fixed属性在IE6及以下是不支持的.通常的 ...
最新文章
- python合并两个有序列表(list)
- java实现layui分页,MVC下实现LayUI分页的Demo
- 密码学基础(1)-前言
- 程序员保值的5个秘密
- Android spinner取Value和Text的值
- 大剑无锋之ArrayList中使用增强for循环能删除元素吗?【面试推荐】
- 后端:推荐九款Java 性能优化工具,你都用过吗?
- html单行元素居中显示,多行元素居左显示
- 6-4 单链表插入排序 (15分)
- VS运行时错误 CRT detected that the application wrote to memory after end of heap buffer
- HBase 表修复在线方式和离线方式
- 标书怎么做?标书制作教程附标书制作思维导图
- Lookup Transformation
- 你还为给自己的IT团队起名字,写口号烦恼吗?(较为流行的团队名称)
- vue中使用antv/g6 绘制关系图、结构图
- The MVGC Multivariate Granger Causality Matlab初上手记录
- 网上一位仁兄关于项目管理的总结
- aardio - 调用Python库下载蓝奏盘文件
- 北航计算机考博经验,北航考博经验总结和感受
- MySQL 内连接、外连接、全连接
热门文章
- [学习Cython编程]Cython编程入门
- RK3399 Android7.1使用网络连接ADB
- 服务器连接数据库mysql
- java 使用sourceforge.pinyin4j查询汉字拼音
- 用Multisim14.0仿真电感L、电容C与电阻R的电压、电流相位关系
- 矩阵的rank,nullspace以及eigenvalue的理解
- java构造方法:有参构造方法和无参构造方法区别
- 用UltraISO制作Ubuntu_18.04U盘启动盘
- 七夕将至,在线感受程序员男友的浪漫,不要再叫我们直男了好吗!!!
- js中对数组的增删方法:push(),pop(),unshift(),shift(),splice()的用法小结