Что такое символ амперсанда в конце типа объекта?

Мне пришлось декомпилировать некоторый код, и я не знаю, что это за синтаксис? Можете ли вы все помочь или указать мне, что это такое? Я гуглил и искал этот сайт, но ничего не могу найти.

Всего одна строка кода:

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;
}
 Ry-♦17 июн. 2012 г., 00:08
@MichaelDibbets: это C # ...
 Nick Babcock17 июн. 2012 г., 00:09
C # имеет ссылки, указатели,and типы значений;)
 Tschallacka17 июн. 2012 г., 00:07
Читайте ссылки и указатели
 ganders17 июн. 2012 г., 00:16
@MarcGravell на самом деле, оба. Должен изменить мой заголовок ...
 Marc Gravell♦17 июн. 2012 г., 00:12
Смущенный заголовок и тело ...& является "амперсандом" (название),@ is & quot; at & quot; (тело) - о чем ты спрашиваешь?

Ответы на вопрос(2)

Посмотреть здесь -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);
   }
}
 27 дек. 2016 г., 10:27
Пожалуйста, укажите причину, прежде чем понизить голосование. Есть настоящие мужества!
Решение Вопроса

Комментарии прямо перед этой строкой кода рассказывают, что именно происходит. & Amp; знак после имени типа указывает, что он является ссылочным типом, а символ @ перед именем переменной создает ссылку на эту переменную.

(Знак @ может также использоваться в коде C # для «экранирования» ключевых слов для использования в качестве имен переменных, но это не то, что здесь происходит. «PageBounds» не является ключевым словом C #.)

Обратите внимание, что это недопустимый синтаксис C # - вы не можете использовать ссылку на локальную переменную в C #, хотя CLR поддерживает это. (ПРИМЕЧАНИЕ. Начиная с C # 7.0, это больше не так; описан синтаксисВот, но он не использует& так что этот декомпилированный код все еще недействителен C #).

Создание ссылки на локальную переменную происходит неявно, когда вы используетеref а такжеout параметры, например, но ключевые слова используются вместо явного ввода параметров в качестве ссылки. (например, если у вас былout int xвнутренне эта переменная имеет типInt32&.)intent кода, если бы это был законный C #, было бы чтоpageBounds а такжеlocal былиsame instance с двумя разными именами; все, что вы делаете с одним, случается с другим. Так, например, этот нелегальный код:

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

будет таким же, как этот правовой кодекс:

Rectangle pageBounds = new Rectangle();

Если вы попытаетесь скомпилировать код как декомпилированный, вы получите ошибку, потому что компилятор обрабатывает & amp; как побитовое и, и будет жаловаться, что вы использовали тип, как если бы он был переменной. Но это нормально, потому что вы не получили его из исходного файла C #. Выdecompiled an IL method чтобы получить его, и есть много вещей, которые вы можете сделать в IL, которые запрещены в C #. Это происходит все время, когда вы декомпилируете код; Например, вы видите недопустимые имена классов и методов. Это просто означает, что компилятор сгенерировал IL на основе исходного кода, который не переводится непосредственно обратно в C #, ноbehaves так, как вы хотели. Код, который вы получаете, является простой попыткой декомпилятора создать код C # из имеющегося у него IL.

Вы можете увидеть примеры кода, который производит эти ссылки в многочисленных отчетах об ошибках Jetbrains о них:

http://youtrack.jetbrains.com/issue/DOTP-521 http://youtrack.jetbrains.com/issue/DOTP-1077 http://youtrack.jetbrains.com/issue/DOTP-524
 ganders17 июн. 2012 г., 01:45
действительно ценю это Майкл!
 17 июн. 2012 г., 01:49
см. мое редактирование для эквивалентного (и гораздо более простого) юридического C #.
 17 июн. 2012 г., 01:44
честно говоря, я не вижу причин, по которым вамlocal переменная вообще; его используют только для строительстваpageBounds по ссылке. Я подозреваю, что это была оптимизация компилятора, которая сбивает с толку декомпилятор. Просто устранитьlocal и построить новыйpageBounds непосредственно.
 ganders17 июн. 2012 г., 01:24
фантастический ответ. Спасибо за объяснение, теперь оно имеет смысл. В моей ситуации это так же просто, как удалить оба этих дополнительных символа, чтобы заставить код работать (и установить Rectangle x = new Rectangle ();)?

Ваш ответ на вопрос