结构构造函数和布局



[根据答案和评论进行编辑和扩展]

我们有一个公共 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);

给定的类型没有InnerOuter构造函数。

我建议我们添加构造函数(如上),因为初始化变得相当乏味。实际结构比显示的要大得多,导致数十个

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);

最新更新