我不得不反编译一些代码,我不知道这个语法是什么?你们可以帮忙,还是指点一下这是什么意思?我用谷歌搜索并搜索了这个网站,找不到任何东西。
只需一行代码:
Rectangle pageBounds;
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
Rectangle& local = @pageBounds;
Rectangle对象类型末尾的@
符号是什么,@
变量之前的pageBounds
是什么?
这是我需要修复的最后一行代码,以便让这个可执行文件再次编译。
以下是使用此语法的方法,我可以将其删除吗?
protected override void OnPrintPage(PrintPageEventArgs e)
{
Application.DoEvents();
++this._pageNum;
float num1;
if (this.Header != null)
{
num1 = this.Header.CalculateHeight(this, e.Graphics);
this.Header.Draw(this, (float) e.MarginBounds.Top, e.Graphics, e.MarginBounds);
}
else
num1 = 0.0f;
float num2;
if (this.Footer != null)
{
num2 = this.Footer.CalculateHeight(this, e.Graphics);
this.Footer.Draw(this, (float) e.MarginBounds.Bottom - num2, e.Graphics, e.MarginBounds);
}
else
num2 = 0.0f;
Rectangle pageBounds;
// ISSUE: explicit reference operation
// ISSUE: variable of a reference type
Rectangle& local = @pageBounds;
int left = e.MarginBounds.Left;
Rectangle marginBounds = e.MarginBounds;
int y = (int) ((double) marginBounds.Top + (double) num1);
marginBounds = e.MarginBounds;
int width = marginBounds.Width;
marginBounds = e.MarginBounds;
int height = (int) ((double) marginBounds.Height - (double) num2 - (double) num1);
// ISSUE: explicit reference operation
local = new Rectangle(left, y, width, height);
float yPos = (float) pageBounds.Top;
bool flag = false;
int num3 = 0;
while (this._printIndex < this._printElements.Count)
{
PrintElement printElement = (PrintElement) this._printElements[this._printIndex];
float num4 = printElement.CalculateHeight(this, e.Graphics);
if ((double) yPos + (double) num4 > (double) pageBounds.Bottom && num3 != 0)
{
flag = true;
break;
}
else
{
printElement.Draw(this, yPos, e.Graphics, pageBounds);
yPos += num4;
++this._printIndex;
++num3;
}
}
e.HasMorePages = flag;
}
答案 0 :(得分:21)
在该行代码之前的评论正在告诉您究竟发生了什么。 &amp;类型名称后面的符号表示它是引用类型,变量名称前面的@生成对该变量的引用。
(@符号也可以在C#代码中用于“转义”关键字以用作变量名,但这不是这里发生的事情。“pageBounds”不是C#关键字。)
请注意,这不是有效的C#语法 - 您不能在C#中引用本地变量,尽管CLR支持它。 (注意:从C#7.0开始,这不再是真的;语法描述为here,但它不使用&
,因此这个反编译的代码仍然是无效的C#)。
例如,当您使用ref
和out
参数时,隐式地创建对局部变量的引用,但使用关键字而不是显式键入参数作为参考。 (例如,如果你有一个out int x
,那么该变量的类型为Int32&
。)代码的 intent ,如果它是合法的C#,那将是{{1和pageBounds
是具有两个不同名称的相同实例;你做的任何事都发生在另一个。所以,例如,这个非法代码:
local
与此法律代码相同:
Rectangle pageBounds;
Rectangle& local = @pageBounds;
local = new Rectangle();
如果您尝试将代码编译为反编译,则会出现错误,因为编译器会处理&amp;作为按位和,并且会抱怨你使用了一个类型,好像它是一个变量。但这没关系,因为你没有从C#源文件中获取它。您反编译IL方法以获取它,并且您可以在IL中执行许多在C#中非法的事情。当您反编译代码时,这种情况一直发生;你会看到非法的类和方法名称。它只是意味着编译器根据原始代码生成IL,而不直接转换回C#,但以您想要的方式行事。您要获取的代码很简单,反编译器最好尝试从它生成的IL中生成C#代码。
您可以在众多关于它们的Jetbrains错误报告中看到产生这些引用的代码类型示例:
答案 1 :(得分:3)
见这里 - http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx(从未使用过)
The prefix "@" enables the use of keywords as identifiers
,在与其他编程语言交互时非常有用。字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许使用@前缀作为非关键字的标识符but strongly discouraged as a matter of style
。
示例:
class @class
{
public static void @static(bool @bool) {
if (@bool)
System.Console.WriteLine("true");
else
System.Console.WriteLine("false");
}
}
class Class1
{
static void M() {
cl\u0061ss.st\u0061tic(true);
}
}