Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要使用流畅的界面?_C#_Fluent Interface - Fatal编程技术网

C# 为什么要使用流畅的界面?

C# 为什么要使用流畅的界面?,c#,fluent-interface,C#,Fluent Interface,与经典属性相比,使用它的最大好处是什么 我知道实例名称的重复已经消失了,但仅此而已 public class PropClass { public Object1 object1 { get; set; } public Object2 object2 { get; set; } } PropClass propClass = new PropClass(); propClass.object1 = o1; propClass.object2 = o2; public class F

与经典属性相比,使用它的最大好处是什么

我知道实例名称的重复已经消失了,但仅此而已

public class PropClass
{
  public Object1 object1 { get; set; }
  public Object2 object2 { get; set; }
}

PropClass propClass = new PropClass();
propClass.object1 = o1;
propClass.object2 = o2;

public class FluentClass
{
    public Object1 object1 { get; private set; }
    public Object2 object2 { get; private set; }

    public FluentClass SetObject1(Object1 o1)
    {
        object1 = o1;
        return this;
    }

    public FluentClass SetObject2(Object1 o2)
    {
        object1 = o2;
        return this;
    }
}

FluentClass fluentClass = new FluentClass().SetObject1(o1).SetObject1(o2);

在我看来,使用fluent接口设置属性没有什么好处,尤其是使用C#3.0类初始值设定项。当你开始链接方法和操作时,流畅的界面会变得更加有趣。

在我看来,这不一定有什么大的优势,或者像上面那样简单的类(具有一些属性的类)。一方面,这是一种不同的语义,一些开发人员对此很满意。另一方面,我认为它在某些领域非常有利,比如ASP.NETMVC。。。我使用Telerik MVC控件,它使用一个流畅的界面,使用它设置控件非常好;MS方式需要使用集合和匿名类,使用起来并不方便


嗯。

这取决于它的使用方式。在您的示例中,使用流畅的界面没有多大意义

另一方面,fluent界面对于构建器等方面非常有效,尤其是当您将多个fluent构建器链接在一起时(例如,汽车构建器/引擎构建器)。我用得很广泛,效果也很好。如果没有流畅的界面,你也可以做同样的事情,但是使用起来并不好

此外,还有Martin Fowler从特定领域的语言角度提出的问题

唯一的问题是,人们有时会对流畅的接口有点疯狂,并创建过于冗长的API,但在我看来,这不是一个流畅的接口问题,而是一个应用程序/实现问题。

fluent pattern(Builder)当您希望减少代码重复和减少每个类之间的依赖性时,这将是最大的好处。对于C#3.5+,您可以通过创建方法扩展(如LINQ或以下代码)来创建fluent模式

public BaseControl
{
    public void RenderControl(HTMLWriter writer) {}
}

public TextBox : BaseControl
{
    public string Text { get;set; }
}

public static T TabIndex<T>(this T control, int index) where T : BaseControl {}
var pmLogOnName = Html.CreatePopUpMenu("pmLogOnName")
                      .AddMenuItem("mLogOnName-RememberMe", "Remember UserName", isCheckBox: true, isSelected: true);

Html.CreateTextBox("txtLogOnName", 1)
    .BindData(Model, x => x.LogOnName, "showError")
    .WaterMark(LogOnView.LogOnName)
    .BindMenu(pmLogOnName)
如您所见,您可以减少BaseControl类不必要的代码。但你可以像我展示的那样把它插上。这个概念适用于许多具有高耦合率的类

顺便说一下,我喜欢这种模式,因为它使我的代码像下面的代码一样易于阅读

public BaseControl
{
    public void RenderControl(HTMLWriter writer) {}
}

public TextBox : BaseControl
{
    public string Text { get;set; }
}

public static T TabIndex<T>(this T control, int index) where T : BaseControl {}
var pmLogOnName = Html.CreatePopUpMenu("pmLogOnName")
                      .AddMenuItem("mLogOnName-RememberMe", "Remember UserName", isCheckBox: true, isSelected: true);

Html.CreateTextBox("txtLogOnName", 1)
    .BindData(Model, x => x.LogOnName, "showError")
    .WaterMark(LogOnView.LogOnName)
    .BindMenu(pmLogOnName)

可能不用于设置属性,但用于链接操作,例如,乘5、加3、除7等。
Fluent接口
在处理
规范模式时非常有用。它将n个规范链接为一个,如中所示,听起来像您想要一个带有
块的VB.Net
流畅的界面
在处理
规范模式时非常有用。它将n个规格链接为中给出的一个规格