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编译器如何内联这两个例子?
自动属性是字段支持属性的语法糖.
属性是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)
请注意private并public应用于编译,而不是执行,因此虽然支持字段是私有的这一事实会使Obj._name有问题的类外部非法,但允许使用内联生成的等效代码.
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |