gpt4 book ai didi

c# - 编译器生成的 Cruft

转载 作者:行者123 更新时间:2023-11-30 14:20:02 26 4
gpt4 key购买 nike

我正在尝试使用 Reg Gate 的 Reflector 从程序集中恢复源代码。原始源利用了几个 C# 3.0 功能,这使得它有点难以恢复。例如,这里是匿名类型的恢复源。首先弹出的是类标识符上的 <>。运行时类型命名规则显然比设计时规则更自由。很公平。一个简单的搜索和替换将解决这个问题。我还必须注意哪些其他编译器重整以及如何处理它们?

[DebuggerDisplay(@"\{ OverrideType = {OverrideType}, EntityType = {EntityType} }", Type="<Anonymous Type>"), CompilerGenerated]
internal sealed class <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly <EntityType>j__TPar <EntityType>i__Field;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly <OverrideType>j__TPar <OverrideType>i__Field;

[DebuggerHidden]
public <>f__AnonymousType1(<OverrideType>j__TPar OverrideType, <EntityType>j__TPar EntityType)
{
this.<OverrideType>i__Field = OverrideType;
this.<EntityType>i__Field = EntityType;
}

[DebuggerHidden]
public override bool Equals(object value)
{
var type = value as <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>;
return (((type != null) && EqualityComparer<> <<OverrideType>j__TPar>.Default.Equals(this.<OverrideType>i__Field, type.<OverrideType>i__Field)) && EqualityComparer<<EntityType>j__TPar>.Default.Equals(this.<EntityType>i__Field, type.<EntityType>i__Field));
}

[DebuggerHidden]
public override int GetHashCode()
{
int num = -338316509;
num = (-1521134295 * num) + EqualityComparer<<OverrideType>j__TPar>.Default.GetHashCode(this.<OverrideType>i__Field);
return ((-1521134295 * num) + EqualityComparer<<EntityType>j__TPar>.Default.GetHashCode(this.<EntityType>i__Field));
}

[DebuggerHidden]
public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("{ OverrideType = ");
builder.Append(this.<OverrideType>i__Field);
builder.Append(", EntityType = ");
builder.Append(this.<EntityType>i__Field);
builder.Append(" }");
return builder.ToString();
}

public <EntityType>j__TPar EntityType
{
get
{
return this.<EntityType>i__Field;
}
}

public <OverrideType>j__TPar OverrideType
{
get
{
return this.<OverrideType>i__Field;
}
}
}

最佳答案

该术语通常用于带有 <> 的名称其中有无法形容的名称 - 因为它们不是有效的 C#。这可以防止它们与非编译器生成的名称发生冲突,并阻止您尝试在 C# 中引用它们。

一些可能导致它们的事情:

  • 迭代器 block 生成嵌套类型来实现它们。

  • 数组初始值设定项,例如:

    int[] x = new int[] { 1, 2, 3 };

    将生成一个 <PrivateImplementationDetails>{...}类(class)。 (但仅适用于某些类型。)

  • Lambda 表达式可以创建新方法和新类型来实现逻辑,并在可能的情况下创建用于缓存委托(delegate)和表达式树的静态变量

  • 如果您在打开调试信息的情况下进行编译,则集合和对象初始值设定项如下:

    List<string> list = new List<string> { "hello", "there" }`)
    Button button = new Button { Text = "Hi" };

    会导致产生名字难读的局部变量。 (在分配给实际变量之前,它们用于在分配属性和添加项目时保存临时值。)

  • C# 4 中的动态代码创造了各种奇怪而美妙的事物

如果您在 Reflector( View /选项/反汇编程序)中将“优化”级别调高,它通常会尽力为您提供类似于原始源代码的内容 - 关闭优化以获得有趣的体验:)

关于c# - 编译器生成的 Cruft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com