我无法用局部变量 C# 初始化内部结构
I can't initialize the internal structure with local variables C#
老实说,我尝试用谷歌搜索答案,但没有成功。
好的,我有这样的结构:
struct TestStruct
{ public int n;
public struct _InnerStruct { public int m; }
public _InnerStruct InnerStruct;
}
我可以将值赋给 n 字段中的某个局部变量:
static void Main ()
{
int SomeLOCALvar = 1;
TestStruct TEST_STRUCT = new TestStruct () { n = SomeLOCALvar };
}
我的问题是我不明白如何对 m 字段 做完全相同的事情。
为什么这样的代码不能编译:
TestStruct TEST_STRUCT = new TestStruct () { n = SomeLOCALvar, .InnerStruct.m = SomeLOCALvar };
正确的语法是什么?
好吧,以下应该有效:
TestStruct TEST_STRUCT = new TestStruct { n = SomeLOCALvar, InnerStruct = new _InnerStruct { m = SomeLOCALvar } };
但是,坦率地说,这样做是一个非常糟糕的主意。值类型(结构)应该几乎总是不可变的;像这样具有 public 可变字段的结构 难以置信地 脆弱,它 将 导致混乱和损坏的代码。
IMO,这些应该是 readonly struct
,具有仅获取属性和构造函数。例如:
readonly struct InnerStruct {
public int M { get; }
public InnerStruct(int m) => M = m;
}
readonly struct TestStruct
{
public int N { get; }
public InnerStruct InnerStruct { get; }
public TestStruct(int n, int m)
{
N = n;
InnerStruct = new InnerStruct(m);
}
}
(理想情况下,它们也应该覆盖 Equals
、GetHashCode
和 ToString
,以防止装箱)
老实说,我尝试用谷歌搜索答案,但没有成功。 好的,我有这样的结构:
struct TestStruct
{ public int n;
public struct _InnerStruct { public int m; }
public _InnerStruct InnerStruct;
}
我可以将值赋给 n 字段中的某个局部变量:
static void Main ()
{
int SomeLOCALvar = 1;
TestStruct TEST_STRUCT = new TestStruct () { n = SomeLOCALvar };
}
我的问题是我不明白如何对 m 字段 做完全相同的事情。 为什么这样的代码不能编译:
TestStruct TEST_STRUCT = new TestStruct () { n = SomeLOCALvar, .InnerStruct.m = SomeLOCALvar };
正确的语法是什么?
好吧,以下应该有效:
TestStruct TEST_STRUCT = new TestStruct { n = SomeLOCALvar, InnerStruct = new _InnerStruct { m = SomeLOCALvar } };
但是,坦率地说,这样做是一个非常糟糕的主意。值类型(结构)应该几乎总是不可变的;像这样具有 public 可变字段的结构 难以置信地 脆弱,它 将 导致混乱和损坏的代码。
IMO,这些应该是 readonly struct
,具有仅获取属性和构造函数。例如:
readonly struct InnerStruct {
public int M { get; }
public InnerStruct(int m) => M = m;
}
readonly struct TestStruct
{
public int N { get; }
public InnerStruct InnerStruct { get; }
public TestStruct(int n, int m)
{
N = n;
InnerStruct = new InnerStruct(m);
}
}
(理想情况下,它们也应该覆盖 Equals
、GetHashCode
和 ToString
,以防止装箱)