很抱歉没有使用评论,我认为它不合适。
乔恩,这不是一个实际的实现,我只是想更深入地了解结构,所以不用担心我实现可变结构:)
无论如何,我不确定你是否正确。考虑这段代码,它与第一个示例几乎相同:
public struct SomeStruct
{
public int PublicProperty { get; set; }
public int PublicField;
public SomeStruct(int propertyValue, int fieldValue)
: this()
{
PublicProperty = propertyValue;
PublicField = fieldValue;
}
public int GetProperty()
{
return PublicProperty;
}
public void SetProperty(int value)
{
PublicProperty = value;
}
}
class Program
{
static void Main(string[] args)
{
SomeStruct a = new SomeStruct(1, 1);
a.PublicProperty++;
a.SetProperty(a.GetProperty()+1);
}
}
现在,使用 ildasm 查看 msil,主要方法如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 45 (0x2d)
.maxstack 3
.locals init ([0] valuetype ConsoleApplication1.SomeStruct a)
IL_0000: nop
IL_0001: ldloca.s a
IL_0003: ldc.i4.1
IL_0004: ldc.i4.1
IL_0005: call instance void ConsoleApplication1.SomeStruct::.ctor(int32,
int32)
IL_000a: nop
IL_000b: ldloca.s a
IL_000d: dup
IL_000e: call instance int32
ConsoleApplication1.SomeStruct::get_PublicProperty()
IL_0013: ldc.i4.1
IL_0014: add
IL_0015: call instance void
ConsoleApplication1.SomeStruct::set_PublicProperty(int32)
IL_001a: nop
IL_001b: ldloca.s a
IL_001d: ldloca.s a
IL_001f: call instance int32 ConsoleApplication1.SomeStruct::GetProperty()
IL_0024: ldc.i4.1
IL_0025: add
IL_0026: call instance void ConsoleApplication1.SomeStruct::SetProperty(int32)
IL_002b: nop
IL_002c: ret
}
对于糟糕的格式,我深表歉意,我不知道如何使它看起来正常。无论如何,希望您能看到 main 方法中的最后两行代码实际上是相同的。
因此,我认为,从上一篇文章来看,这一行:
a.OtherStruct.PublicProperty++;
实际上与它后面的行相同:
a.OtherStruct.SetProperty(a.OtherStruct.GetProperty() + 1);
因此在我看来第一行不能编译只是因为编译器不支持它,而不是因为它不合法。
你怎么看?