C#我不理解构造函数之后的代码

时间:2017-10-24 15:44:00

标签: c# asp.net .net-core

我不理解构造函数之后的代码。

    var host = new WebHostBuilder()
    .UseKestrel()
    .UseConfiguration(config)
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .Build();

https://www.hanselman.com/blog/PublishingAnASPNETCoreWebsiteToACheapLinuxVMHost.aspx

4 个答案:

答案 0 :(得分:5)

它只是方法链接,并且在流畅的设计模式中很常见(如LINQ等)。

例如:

public class TestClass
{
    public TestClass DoSomething()
    {
        return this;
    }
}

通过上述内容,您可以这样做:

var test = new TestClass().DoSomething();

在您的示例中,它专门用于配置准备使用的Web主机。在这种情况下:

var host = new WebHostBuilder()
    .UseKestrel() // Use Kestrel web server
    .UseConfiguration(config) // Use the IConfiguration specified in config
    .UseContentRoot(Directory.GetCurrentDirectory()) // Set the content directory
    .UseStartup<Startup>() // Set the startup class
    .Build(); // Build and instantiate an IWebHost based on the above configuration

答案 1 :(得分:5)

如果你有一个班级

public class C
{
    public C MethodA()
    {
        //TODO: do something useful here.
        return this;
    }

    public C MethodB()
    {
        //TODO: do something useful here.
        return this;
    }

    public C MethodC()
    {
        //TODO: do something useful here.
        return this;
    }
}

其中方法返回对象本身的实例,您可以像这样调用这些方法:

var c = new C();
c.MethodA();
c.MethodB();
c.MethodC();

var c = new C();
c.MethodA().MethodB().MethodC();

甚至

var c = new C().MethodA().MethodB().MethodC();

这些调用也可能返回另一个可能是另一种类型的对象。在这种情况下,语句var result = new T().A().B().C();等同于:

var temp1 = new T();
var temp2 = temp1.A();
var temp3 = temp2.B();
var result = temp3.C();

方法也可以是扩展方法。

这称为Method chaining,用于Fluent interfaces

答案 2 :(得分:4)

这些是[{1}}界面的[扩展]方法。

它被设计为用作流畅的API,这意味着对方法的每次调用都会返回[推测]实现IWebHostBuilder接口的同一对象的实例,因此您可以在其中保持调用方法链

IWebHostBuilder

所以最后,host变量是调用[推测]同一个对象的几个操作的结果,最终调用一个最终方法var host = new WebHostBuilder() //This call would return IWebHostBuilder .UseKestrel() //This call would return IWebHostBuilder .UseConfiguration(config) //This call would return IWebHostBuilder .UseContentRoot(Directory.GetCurrentDirectory()) //This call would return IWebHostBuilder .UseStartup<Startup>() //This call would return IWebHostBuilder .Build(); //This call would return IWebHost ,返回一个{{1}类型的对象}}

这在功能上等同于:

Build

我说&#34;大概&#34;因为这一切都取决于内部实施。

答案 3 :(得分:2)

  

我不理解构造函数之后的代码。

我认为你对此感到困惑只是因为它在构造函数上完成了。您的代码等同于:

    var builder = new WebHostBuilder();
    var host = builder.UseKestrel()
                      .UseConfiguration(config)
                      .UseContentRoot(Directory.GetCurrentDirectory())
                      .UseStartup<Startup>()
                      .Build();

因此,在这些方法调用中没有特殊的魔法,它恰好在WebHostBuilder()返回的对象上被调用。