2012-06-16 22 views
11

私はいくつかのコードをコンパイルする必要がありましたが、私はこの構文が何であるか分かりません。よろしくお願いします。それが何であるかについて書面で教えてもらえますか?私はgoogledとこのサイトを検索し、何かを見つけることができません。コードのオブジェクトタイプの末尾にあるアンパサンド文字は何ですか?

だけで1行:

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; 
} 
+1

ポインタは – Tschallacka

+0

@MichaelDibbets:これはC#です... – Ryan

+0

C#には参照、ポインタ、*、*値tがあります –

答えて

19

コード行の前に右のコメントが起こっている正確に何を言っています。タイプ名の後の符号&は、それが参照タイプであることを示し、@は変数名の前にその変数への参照を生成します。

(@記号は、変数名として使用するためのキーワードを「エスケープ」するためにC#のコードでも使用することができますが、それがここで何が起こっているのかいないのです。「pageBounds」C#のキーワードではありません。)

(注)このこと有効なC#構文ではありません.C#のローカル変数への参照はできません。たとえば、refoutのパラメータを使用すると暗黙的に発生しますが、明示的にパラメータを参照として入力する代わりにキーワードが使用されます。それは法的C位であった場合には(あなたは、内部変数はタイプInt32&であること、out int xを有し、例えば場合)コードの意図pageBoundslocalが2つの異なる名前で同じインスタンスたことであろう。あなたがしていることは、他の人に起こります。したがって、たとえば、この不正なコード:

Rectangle pageBounds; 
Rectangle& local = @pageBounds; 
local = new Rectangle(); 

は、この法律上のコードと同じになります:

Rectangle pageBounds = new Rectangle(); 

あなたは逆コンパイルとして、コードをコンパイルしようとした場合ので、あなたがエラーになるだろうコンパイラは&をビット単位で扱います。そして、型を変数のように使用していると不満を持ちます。しかし、それはあなたがC#ソースファイルからそれを取得しなかったので大丈夫です。あなたはのILメソッドを逆コンパイルして取得しています。そして、C#では違法であるILでできることがたくさんあります。これは、コードを逆コンパイルするときに常に発生します。不正なクラス名やメソッド名が表示されます。これは、コンパイラが元のコードに基づいてILを直接生成し、C#に直接変換しないことを意味しますが、は、あなたが望むやり方でを実行します。あなたが戻ってくるコードは、それが持っているILからC#コードを生成するデコンパイラの最善の試みです。あなたはそれらについての数多くのJetBrainsのバグレポートにこれらの参照を生成するコードの種類の例を見ることができます

参照の上まで読む
+0

素晴らしい答えです。説明をいただきありがとうございます。私の状況では、コードを動作させるために余分な文字を取り除くのと同じくらい簡単です(そしてRectangle x = new Rectangle();)? – ganders

+1

正直言って、 'local'変数がまったく必要ない理由はわかりません。それは参照によって 'pageBounds'を構築するためにのみ使用されます。私はそれがデコンパイラを混乱させるコンパイラ最適化だと思う。単に 'local'を取り除き、新しい' pageBounds'を直接構築してください。 –

+0

マイケルが本当に感謝しています! – ganders

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); 
    } 
} 
+2

downvotingの前に理由を書いてください。本当の勇気がある! –

関連する問題