StructLayoutAttribute 对 C# 中的属性有什么影响?
What is the StructLayoutAttribute effect on properties in C#?
我正在定义要通过不同设备和不同编程语言之间的通信通道接收和发送的结构。
为此,我使用 StructLayoutAttribute 明确定义了它们在内存中的布局(顺序,pack=1 - 以防万一)。
从文档中,我知道当结构仅包含字段时它可以工作。它似乎也适用于 'simple' 属性(空 get;set;)。不过不知道是不是一直这样。
所以我关于 StructLayoutAttribute 对属性的影响的问题分为两个:
- 简单属性(同样,空 get;set;)的行为是否与字段相同?
- 其他属性如何表现,例如,他们获得的属性是对其他属性的计算?它们是否被忽略了(因为我没有看到它们背后的实际数据项)?他们占用内存吗?
属性没有存储空间。 StructLayoutAttribute
完全不影响他们。
自动属性访问生成的支持字段,该字段受 StructLayoutAttribute
约束(因为 所有 字段都受此属性约束)。但是,这些字段的顺序未定义。
因为只计算一个值的 get-properties 没有存储,所以它们没有被编组。
自动属性 ({get; set;}
) 有一个自动创建的不可公开访问的支持字段。事实上,如果您使用反射查看具有自动 属性 的 class 的字段,您可以看到该 属性 有一个私有字段。下面的代码打印 <Bar>k__BackingField
-- 一个奇怪的字段名,但仍然是一个字段名!
我不能说我在 属性 上试过 StructLayoutAttribute
。如果有效,它肯定只是将相同的逻辑应用于支持字段。
using System;
using System.Reflection;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
var fields = typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine(fields[0].Name);
}
}
class Foo
{
public int Bar { get; set; }
}
}
根据文档和我的测试,FieldOffsetAttribute 不能应用于属性。这就留下了LayoutKind.Sequential的问题。根据 this article,属性 字段出现在最后。如果您关心布局,基本上不要使用自动属性。展开它们并注释字段。计算的属性不会出现在结构的内存布局中。
我正在定义要通过不同设备和不同编程语言之间的通信通道接收和发送的结构。 为此,我使用 StructLayoutAttribute 明确定义了它们在内存中的布局(顺序,pack=1 - 以防万一)。
从文档中,我知道当结构仅包含字段时它可以工作。它似乎也适用于 'simple' 属性(空 get;set;)。不过不知道是不是一直这样。
所以我关于 StructLayoutAttribute 对属性的影响的问题分为两个:
- 简单属性(同样,空 get;set;)的行为是否与字段相同?
- 其他属性如何表现,例如,他们获得的属性是对其他属性的计算?它们是否被忽略了(因为我没有看到它们背后的实际数据项)?他们占用内存吗?
属性没有存储空间。 StructLayoutAttribute
完全不影响他们。
自动属性访问生成的支持字段,该字段受 StructLayoutAttribute
约束(因为 所有 字段都受此属性约束)。但是,这些字段的顺序未定义。
因为只计算一个值的 get-properties 没有存储,所以它们没有被编组。
自动属性 ({get; set;}
) 有一个自动创建的不可公开访问的支持字段。事实上,如果您使用反射查看具有自动 属性 的 class 的字段,您可以看到该 属性 有一个私有字段。下面的代码打印 <Bar>k__BackingField
-- 一个奇怪的字段名,但仍然是一个字段名!
我不能说我在 属性 上试过 StructLayoutAttribute
。如果有效,它肯定只是将相同的逻辑应用于支持字段。
using System;
using System.Reflection;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
var fields = typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Console.WriteLine(fields[0].Name);
}
}
class Foo
{
public int Bar { get; set; }
}
}
根据文档和我的测试,FieldOffsetAttribute 不能应用于属性。这就留下了LayoutKind.Sequential的问题。根据 this article,属性 字段出现在最后。如果您关心布局,基本上不要使用自动属性。展开它们并注释字段。计算的属性不会出现在结构的内存布局中。