Как метод inline работает для авто-свойств в C #? - PullRequest
7 голосов
/ 28 марта 2011

Я читаю Эффективный C # (второе издание) , и в нем говорится о методе встраивания .

Я понимаю принцип, но не понимаю, как он будет работать, основываясь на 2 примерах в книге. Книга говорит:

Подстановка означает замену тела функции на вызов функции.

Достаточно справедливо, поэтому, если у меня есть метод и его вызов:

public string SayHiTo(string name)
{
    return "Hi " + name;
}

public void Welcome()
{
    var msg = SayHiTo("Sergi");
}

JIT-компилятор может (будет?) Встроить его в:

public void Welcome()
{
    var msg = "Hi " + "Sergi";
}

Теперь, с этими двумя примерами (дословно из книги):

Пример 1

// readonly name property
public string Name { get; private set; }

// access:
string val = Obj.Name;

Пример 2

string val = "Default Name";
if(Obj != null)
    val = Obj.Name;

В книге упоминается код, но не идет дальше, как они могут быть встроены. Как компилятор JIT встроит эти 2 примера?

Ответы [ 3 ]

6 голосов
/ 28 марта 2011

Автоматические свойства являются синтаксическим сахаром для свойств на основе поля.

Свойства являются синтаксическим сахаром для методов установки и / или получения.

Следовательно, код, который вы даете, более или менее эквивалентен:

private string _name;
public string get_Name()
{
  return _name;
}
private void set_Name(string value)
{
  _name = value;
}

Тогда string val = Obj.Name становится эквивалентным string val = Obj.get_Name(), который может быть встроен в string val = Obj._name.

Аналогично, код

string val = "Default Name";
if(Obj != null)
  val = Obj.Name;

Is эквивалентен:

string val = "Default Name";
if(Obj != null)
  val = Obj.get_Name();

Который может быть встроен в:

string val = "Default Name";
if(Obj != null)
  val = Obj._name;

Обратите внимание, что private и public относятся к компиляции, а не к выполнению, поэтому пока факт, что поле поддержкиЗначение private означает, что Obj._name будет недопустимым вне рассматриваемого класса, разрешен эквивалентный код, созданный путем встраивания.

4 голосов
/ 28 марта 2011

Гипотетически говоря, вставка здесь развернула бы тело get_Name(), которое автоматически генерируется компилятором, который просто возвращает приватное поле поддержки.Это может выглядеть примерно так:

string val = Obj.k__BackingField;
2 голосов
/ 28 марта 2011

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

...