在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。 使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。

固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。

private fixed char name[];

在早期版本的 C# 中,声明 C++ 样式的固定大小结构是很困难的,因为包含数组的 C# 结构不包含数组元素。 相反,该结构包含对元素的引用。

C# 2.0 添加了在 struct(当用在 unsafe 代码块中时)中嵌入固定大小的数组的功能。

例如,在 C# 2.0 之前,下面的 struct 的大小为 8 字节。 pathName 数组是对堆分配数组的引用:

public struct MyArray
{
public char[] pathName;
private int reserved;
}

从 C# 2.0 开始,struct 可以包含嵌入的数组。 在下面的示例中,fixedBuffer 数组有固定的大小。

若要访问数组的元素,应使用 fixed 语句建立指向第一个元素的指针。 fixed 语句将 fixedBuffer 实例固定到内存中的特定位置。

namespace FixedSizeBuffers
{
internal unsafe struct MyBuffer
{
public fixed char fixedBuffer[];
} internal unsafe class MyClass
{
public MyBuffer myBuffer = default(MyBuffer);
} internal class Program
{
static void Main()
{
MyClass myC = new MyClass(); unsafe
{
// Pin the buffer to a fixed location in memory.
fixed (char* charPtr = myC.myBuffer.fixedBuffer)
{
*charPtr = 'A';
}
}
}
}
}

128 个元素的 char 数组的大小为 256 字节。 在固定大小的 char 缓冲区中,每个字符始终占用两个字节,而与编码无关。

即使将 char 缓冲区封送到具有 CharSet = CharSet.Auto 或 CharSet = CharSet.Ansi 的 API 方法或结构,也是如此。 有关更多信息,请参见 CharSet

另一种常见的固定大小的数组是 bool 数组。 bool 数组中元素的大小始终为一个字节。 bool 数组不适合于创建位数组或缓冲区。

除了用 stackalloc 创建的内存之外,C# 编译器和公共语言运行时 (CLR) 不执行任何安全缓冲区溢出检查。 与所有不安全代码一样,请谨慎使用。

不安全缓冲区与常规数组在以下方面不同:

  • 不安全缓冲区只能用在不安全上下文中。

  • 不安全缓冲区始终是向量(或一维数组)。

  • 数组的声明应包括其本身长度,如 char id[8]。 而不能使用 char id[]。

  • 不安全缓冲区只能是不安全上下文中的结构的实例字段。

C#使用Fixed创建固定大小的缓冲区的更多相关文章

  1. 使用SplFixedArray创建固定大小的数组

    PHP在定义数组的时候不用像C或Java一样定义数组大小,PHP数组可以根据我们的需要增长或收缩.但这种灵活性在内存使用方面带来很大的不便. 而PHP中可以使用SplFixedArray创建固定大小的 ...

  2. ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池

    1.ExecutorService: 是一个接口,继承了Executor: public interface ExecutorService extends Executor { } 2.Execut ...

  3. Hyper-V创建固定大小虚拟机

    1.新建硬盘 点击确定,就创建好了一个固定大小的vhd文件,下面我们开始创建虚拟机. 2.创建虚拟机 输入虚拟机名称 选择第一代虚拟机 我这里给虚拟机分配512MB内存 网络配置 在这之前我们已经创建 ...

  4. 使用Java创建指定大小的空文件夹

    /** 方法一 * 创建固定大小的文件 * @param file * @param length * @throws IOException */ public static void create ...

  5. Mina、Netty、Twisted一起学(三):TCP消息固定大小的前缀(Header)

    在上一篇博文中,有介绍到用换行符分割消息的方法.但是这种方法有个小问题,如果消息中本身就包含换行符,那将会将这条消息分割成两条,结果就不对了. 本文介绍另外一种消息分割方式,即上一篇博文中讲的第2条: ...

  6. 6、java5线程池之固定大小线程池newFixedThreadPool

    JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...

  7. textarea 在浏览器中固定大小和禁止拖动

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...

  8. 点击弹出固定大小的新窗口(js实现)

    <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.html') --> </SCRIPT& ...

  9. textarea 怎么固定大小,不让调整

    1:彻底禁用拖动(推荐) resize: none; 2:只是固定大小,右下角的拖动图标仍在 width: 200px; height: 100px; max-width: 200px; max-he ...

随机推荐

  1. servlet 配置

    <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.web.s ...

  2. 委托传参,lambda

    今天一朋友问到一问题,怎么在timer的委托里面传参数,我初一想Invoke 可以传参数吧,我就说了. 后来他说这个委托是微软定义,不能变参数,于是我就自己写了一段代码试 试. 我最初写的代码如下 p ...

  3. SQL逻辑读变成零

    使用缓存HINT 让逻辑读变成0. create table t as select * from dba_objects; insert into t select * from t; commit ...

  4. [示例]NSPredicate基础-查询数组中负荷条件的子集

    代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepo ...

  5. 转: HTTP协议的头信息详解

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可 选的消息体组成.HTTP的头域包括通用头,请求头,响 ...

  6. bzoj 1934: [Shoi2007]Vote 善意的投票

    #include<cstdio> #include<iostream> #define M 100000 #include<cstring> using names ...

  7. iScroll 优化

    iScroll 它比较好的解决了移动互联网 web app 滚动支持问题以及点击事件缓慢的问题,经过简单配置即可让 web app 像原生 app 一样流畅,甚至都不需要改变原来的编码方式,目前它几乎 ...

  8. C#解析Json(多方法解析Json 一)

    解析:{'id':'4028d80858053bed0158053ef7a50001','sl':0.0,'sfyfz':'0','zwjyzsbh':'1000001600000018'} 1.新建 ...

  9. visual studio 2013连接Oracle 11g并获取数据:(二:实现)

    1.VS中新建一个winform窗体 (1)一个按钮 (2)一个数据表格视图(在里面显示得到的数据表) 2.双击按钮进入代码 (1)添加 using System.Data.OracleClient; ...

  10. Jquery判断div是否显示

    $("#test").is(":hidden");//是否隐藏 $("#test").is(":visible");// ...