结构构造函数和布局
本文关键字:布局 构造函数 结构 | 更新日期: 2023-09-27 17:56:43
[根据答案和评论进行编辑和扩展]
我们有一个公共 C# API,它使用没有任何构造函数的嵌套结构。注意:public 意味着它不是我们的,我们需要通过固定的序列化函数与它进行通信。
因此
public struct Inner {
public int f1;
public int f2;
public Inner(int _f1, int _f2)
{
this.f1 = _f1;
this.f2 = _f2;
}
};
public struct Outer {
public int z;
public Inner f;
public Outer (int _f1, int _f2, int _z)
{
this.f = new Inner(_f1, _f2);
this.z = _z;
}
};
public class HelloWorld
{
static public void Main ()
{
Outer someVar = new Outer(4,5,6);
给定的类型没有Inner
和Outer
构造函数。
我建议我们添加构造函数(如上),因为初始化变得相当乏味。实际结构比显示的要大得多,导致数十个
someVar.f.f1 = initialzier
但是,我的团队中的一些成员认为我们"不允许更改API"。
对此是否有官方立场?在这里,我指的不是人类约定/最佳实践,而是 C# 语义;即。向 C# 添加构造函数是否可以struct
更改struct
布局?
还有相关的问题,内部结构上的new
或构造函数会初始化一个临时位置,然后将其复制到外部结构中,还是会将其原位初始化到外部结构中?
上面的代码中有 2 个new
。根据下面@supercat的回答,存储分配可能会也可能不会优化。没有办法保证吗?
[基本上我缺少C将指针指向内部的能力结构并将其传递给初始值设定项函数]
另请注意,struct
应该/不应该使用,因此不在讨论范围内。它是这样完成的,也许是为了历史的,也许是为了与 C 的互操作等我们的代码需要与之互操作的另一方的原因。
结构构造函数在语义上等效于修改this
的结构成员函数,除了 C# 编译器将:
someVar = new someStructType(this, that, theOther);
进入以下任一:
var temp = default(someStructType);
temp..ctor(this, that, theOther);
someVar = temp;
或
someVar..ctor(this, that, theOther);
而且,在后一种情况下,编译器不会坚持在调用其.ctor
方法之前必须初始化someVar
(这宁愿破坏构造函数的观点)。
更有效,但编译器只有在认为后者等效于前者时才会使用它。 请注意,在某些情况下,尤其是涉及混合语言代码的情况下,C# 行为将明显地影响程序语义,但在大多数情况下,行为是可观察到的,编译器将使用前者。
从语法的角度来看,构造函数调用看起来最像返回结构类型的函数。 但是,这样的函数通常需要临时构建一个新结构,然后让调用者将其复制到所需的位置,这与有时可以直接写入新变量的构造函数不同。
[基本上我缺少 C 将指针指向内部结构并将其传递给初始值设定项函数的能力]
据我所知,你可以在 C# 中做同样的事情:
public struct Inner {
public static void Init(out Inner value,int _f1,int _f2) {
value.f1=_f1;
value.f2=_f2;
}
public int f1;
public int f2;
}
public struct Outer {
public static void Init(out Outer value,int _f1,int _f2,int _z) {
Inner.Init(out value.f,_f1,_f2);
value.z=_z;
}
public int z;
public Inner f;
}
public class HelloWorld {
static public void Main() {
Outer someVar;
Outer.Init(out someVar,4,5,6);