目录:
定义-方向属性是什么意思?
在C#中,方向属性是用于指定对象方法参数的标签,这些参数具有与调用方和被调用方之间的数据定向流有关的信息。
方向属性控制方法参数的方向和返回值的编组(对象准备为跨应用程序或过程边界传输)。 在传递由公共语言运行时(CLR)执行的托管代码和在CLR的控制范围之外执行的非托管代码时,方向属性用于修改运行时封送处理。
技术百科解释了方向属性
InAttribute和OutAttribute是用于映射到组件对象模型(COM)接口定义语言(IDL)属性的两个C#定向属性。 InAttribute映射到,而OutAttribute映射到。 托管方法签名返回值映射到类型库中。 必须为方法参数指定正确的方向属性,以便导出类型库正确设置输入/输出位。
通过将InAttribute和OutAttribute应用到数组和格式化的不可复制类型(不具有公共的托管和非托管内存表示形式)中,调用方可以看到被调用方的更改。 应用于这些类型的方向属性可减少在编组期间不必要的副本。
在C#中,在呼叫者和被呼叫者通信期间,InAttribute和OutAttribute以三种形式使用,带有两个关键字,如下所示:
- “出” –暗示
- “ ref” –表示,
- (未指定)–(默认情况下)
out和ref关键字用于值类型和可序列化的引用类型。 ref关键字表示该参数在两个方向上均已编组,而out表示被调用者数据传输。 当不使用ref或out时,这表示数据已传输到被调用方。
例如,.NET客户端应用程序将输入值发送到COM组件方法,该方法计算输入值结果并将结果返回给客户端。 通过指示输入值和结果所需的编组类型,可以将方向属性应用于服务请求的方法的参数。
方向属性具有以下特征:
- 可选,在设计时应用于方法参数
- 仅支持COM互操作和平台调用
- InAttribute不能应用于带有out关键字的参数
CLR互操作性封送程序通过在运行时通过处理方法调用参数并在托管和非托管内存之间返回值来提供封送服务。 如果未定义方向属性,则封送拆封器将根据参数类型和修饰符(如果有)来确定方向流。 封送处理程序以以下方式运行:
- 它不会覆盖非托管代码中作为“ In”参数传递的数据。 因此,只能传递只读数据,例如并发访问的数据。
- 在传递具有确定的内存分配的对象(例如基本或二进制字符串(BSTR))时,将根据输入/输出设置遵循正确的分配/取消分配顺序。
