方法内联如何在C#中使用自动属性?

Ser*_*eit 7 .net c# compiler-construction jit

我正在阅读Effective C#(第二版),它讨论了方法内联.

我理解这个原理,但是根据书中的两个例子,我看不出它是如何工作的.这本书说:

内联意味着将函数体替换为函数调用.

很公平,所以如果我有一个方法,它的电话:

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

public void Welcome()
{
    var msg = SayHiTo("Sergi");
}
Run Code Online (Sandbox Code Playgroud)

JIT编译器可能(将?)将其内联到:

public void Welcome()
{
    var msg = "Hi " + "Sergi";
}
Run Code Online (Sandbox Code Playgroud)

现在,通过这两个例子(逐字逐句):

例1

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

// access:
string val = Obj.Name;
Run Code Online (Sandbox Code Playgroud)

例2

string val = "Default Name";
if(Obj != null)
    val = Obj.Name;
Run Code Online (Sandbox Code Playgroud)

这本书提到了代码,但没有进一步讨论它们如何被内联.JIT编译器如何内联这两个例子?

Jon*_*nna 6

自动属性是字段支持属性的语法糖.

属性是setter和/或getter方法的语法糖.

因此,您提供的代码或多或少等同于:

private string _name;
public string get_Name()
{
  return _name;
}
private void set_Name(string value)
{
  _name = value;
}
Run Code Online (Sandbox Code Playgroud)

然后string val = Obj.Name变得相当于string val = Obj.get_Name()可以内联到string val = Obj._name.

同样的代码

string val = "Default Name";
if(Obj != null)
  val = Obj.Name;
Run Code Online (Sandbox Code Playgroud)

相当于:

string val = "Default Name";
if(Obj != null)
  val = Obj.get_Name();
Run Code Online (Sandbox Code Playgroud)

可以内联到:

string val = "Default Name";
if(Obj != null)
  val = Obj._name;
Run Code Online (Sandbox Code Playgroud)

请注意privatepublic应用于编译,而不是执行,因此虽然支持字段是私有的这一事实会使Obj._name有问题的类外部非法,但允许使用内联生成的等效代码.