为什么我不能编码const结构?

时间:2018-12-20 03:02:17

标签: c# struct const

我希望对const Point结构的硬编码值进行编码。

为什么编译器在编译期间既不允许内部结构也不允许任意结构被替换?由于可以在编译时(在两种情况下)建立内部按位表示,因此没有明显的限制理由。

我的问题是:有一种方法可以用c#硬编码一组预定义的字节,可以在编译时将其解释为适当的类型,因为所有结构都具有预定的内存轮廓。

编辑:

要澄清:编译时间表示C#-> IL字节码,存储在输出程序集中。

用例示例:

public void Draw(Bitmap bmp, Point Location = new Point(0,0)) // invalid

这是一个错误,因为无法在编译时评估new Point(0,0)。我可以传入int X = 0, int Y = 0或可为空的Point? Location = null并在方法内部生成结构,也可以在没有可选参数的情况下重载该方法,并调用main方法传入默认值,但是这种技术会导致根据所需的额外方法调用而导致的性能损失。

这可能不适用于所有结构,因为构造函数可能依赖或更改外部状态或随机性。

2 个答案:

答案 0 :(得分:4)

  

为什么编译器在编译期间既不允许内部结构也不允许任意结构被替换?由于可以在编译时(在两种情况下)建立内部按位表示,因此没有明显的限制理由。

由于相同的原因,未实现所有未实现的功能。要实施,必须考虑,判断其功能是否适当,进行设计,指定,实施,测试,记录并交付功能。所有这些事情都必须发生。对于您建议的功能,这些都没有发生。因此,没有功能。

不需要编程语言设计师提供为什么未实现功能的理由。而是,需要该功能的人员必须提供一个理由,使编程语言设计人员应该花费宝贵的时间来实现所需的功能。

C#设计过程已打开,并且编译器源代码可用。 您为什么不设计和实现该功能?如果您可以公平地问设计师这个问题,那么对他们来说也可以公平地问您!你是计算机程序员;如果您认为值得,请忙于编程计算机并构建功能,然后说服语言团队接受您的请求。如果您认为这样做不值得,那么,语言设计师可能会有同样的想法。

  

我的问题是:有一种方法可以用c#硬编码一组预定义的字节,可以在编译时将其解释为适当的类型,因为所有结构都具有预定的内存轮廓。

我不确定“编译时”是什么意思;你能澄清吗?

当然,有多种方法可以将字节数组存储在程序集中。使用字节数组初始化为所有常数值并ildasm汇编的方式编写C#程序;您将看到C#编译器生成的代码,用于将字节数组图像从元数据中取出并放入数组中。

您可以实现类似的恶作剧,以获取字节数组,将数组固定在适当的位置,然后使用不安全的指针魔术将数组字节重新解释为结构字节。这听起来非常危险,并且可能会破坏垃圾收集器的性能。我本人不希望这样做,但是您似乎非常热衷于此功能,因此请继续并报告发现的问题!

或者,C ++ / CLI可能实现了您想要的功能;我从来没有使用过它,但是这似乎可以做到。您可以用C ++ / CLI编写一个可以满足您需要的小程序,然后(1)使用该程序的程序集作为程序集的依赖项,(2)将其编译为netmodule,通过常规方式将其链接到您的程序集中netmodule链接齿轮(yuck)或(3)推断出他们如何实现该功能,然后执行相同的操作。

答案 1 :(得分:-1)

您可以将结构转换为字节数组并编码字节数组。可能是这样的:(请编译并修复所有错误(通过手机输入))

假设您的结构是:

public struct TestStruct
{
 public int x;
 public string y;
}

public byte[] GetTestByte(TestStruct c)
{
    var intGuy = BitConverter.GetBytes(c.x);
    var stringGuy = Encoding.UTF8.GetBytes(c.y);
    var both = stringGuy.Concat(intGuy).Concat(new byte[1]).ToArray();
    return both;
}

现在您可以像这样编码字节数组:

Convert.ToBase64String(byteArray);

没有直接编码结构的方法。充其量是一种值类型,可能是C和C ++的遗留物