我通过以这种方式初始化字段来创建对象:
class Example
{
    public int a;
    public int b;
}
var obj = new Example
{
    a = stream.ReadInt(),
    b = stream.ReadInt()
};
是否总是在字段“b”之前初始化字段“a”?否则,当以不同的顺序减去流中的值时,可能会出现令人不快的错误。谢谢!
UPD:在评论中,许多人不明白我的意思。我会澄清这个问题。这些记录在不同(.NET、Mono 等)编译器上的行为是否始终相同?
第一的:
var obj = new Example
{
    a = stream.ReadInt(),
    b = stream.ReadInt()
};
第二:
var a = stream.ReadInt();
var b = stream.ReadInt();
var obj = new Example
{
    a = a,
    b = b
};
我需要使用反射来检查 C# 位置记录中的不可写属性。
这是位置记录示例:
record MyRecord(int MyProperty);
MyProperty正如预期的那样不可写:
MyRecord myRecord = new(5);
Console.WriteLine(myRecord.MyProperty); // 5
//myRecord.MyProperty = 6; <-- yields compile time error as expected
然而,反思告诉我:
PropertyInfo pi = typeof(MyRecord).GetProperty("MyProperty");
Console.WriteLine(pi.CanWrite);     // True
MethodInfo mi = pi.GetSetMethod();  
Console.WriteLine(mi == null);      // False
Console.WriteLine(mi.IsPublic);     // True
所以MyProperty看起来是公共可写的。问题似乎是 init 访问器,因为
record MyRecord
{
    public int MyProperty { get; } = 5;
}
已CanWrite设置MyProperty为false,但这种记录定义不是我需要的。
那么有没有一种方法可以使用反射来区分记录中的 init 访问器和 set 访问器?