C#-如何绕过错误cs0212为程序员和计算机作弊



我想处理一个类中的许多整数,所以我将它们列在int*数组中。

int*[] pp = new int*[]{&aaa,&bbb,&ccc};

然而,编译器用以下EXCUSE:拒绝了上面的代码

>只能在固定语句初始值设定项中获取未固定表达式的地址

我知道我可以更改上面的代码来避免这个错误;然而,我们需要考虑dddeee将来将加入阵列。

public enum E {
    aaa,
    bbb,
    ccc,
    _count
}
for(int i=0;i<(int)E._count;i++)
gg[(int)E.bbb]

Dictionary<string,int>ppp=new Dictionary<string,int>();
ppp["aaa"]=ppp.Count;
ppp["bbb"]=ppp.Count;
ppp["ccc"]=ppp.Count;
gg[ppp["bbb"]]

这些解决方案是有效的,但它们使代码和执行时间更长。

我也希望有一个非官方的编译器补丁或一个新的非官方C#编译器,但我已经很多年没有看到可用的下载了;为我们准备一个似乎很困难。

有没有更好的方法让

  1. 我不需要对数组ppp的计数进行计数
  2. 如果代码变长,则只有几个字母变长
  3. 执行时间不会增加太多
  4. 要将dddeee添加到阵列中,只有一个或两个每个新成员的集

.NET运行时是一个托管执行运行时,它(除其他外)提供垃圾收集。NET垃圾收集器(GC)不仅管理内存的分配和释放,而且透明地在"托管堆"中移动对象,阻止在执行此操作时执行代码的其余部分。它还通过将寿命较长的对象移动到一起来压缩(碎片整理)内存,甚至将它们"提升"到堆的不同部分,称为生成,以避免过于频繁地检查它们的状态。

有一堆内存一直在被复制,而你的程序甚至没有意识到这一点。由于垃圾回收是一种在程序执行过程中随时可能发生的操作,因此任何与指针相关的("不安全")操作必须在小范围内完成,方法是告诉运行时使用fixed关键字"固定"对象。这可以防止GC移动它们,但只能移动一段时间。

在C#中使用指针和unsafe代码不仅不太安全,而且对于一般的托管语言来说也不太习惯。如果你有C语言背景,你可能会对这些结构感到宾至如归,但C#有一个完全不同的理念:作为C#程序员,你的工作应该是编写可靠、可读和可维护的代码,然后再考虑出于性能原因压缩几个CPU周期。您可以在小函数中不时使用指针,执行一些非常具体、时间关键的代码。但即便如此,在进行此类优化之前,您也有责任对进行评测。即使是最有经验的程序员在分析之前也经常无法预测瓶颈。

最后,关于您的实际代码:

  1. 我不明白你为什么这么想:

    int*[] pp = new int*[] {&aaa, &bbb, &ccc};
    

    会比这更具性能:

    int[] pp = new int[] {aaa, bbb, ccc};  
    

    在32位机器上,int和指针的大小相同。在64位机器上,指针甚至更大。

  2. 考虑将这些普通的int替换为您自己的class,它将为这些值中的每一个提供一些上下文和额外的功能/数据。创建一个新问题,描述你试图解决的实际问题(你也可以使用代码审查来解决这些问题),你会从更好的建议中受益。

最新更新