0

今天,我搜索了一行代码,它是这样写的:

SomeObject.SomeFunction().SomeOtherFunction();

我无法理解这一点。我试图在谷歌上搜索它,但没有运气。

请帮助我理解这一点。

4

6 回答 6

3

SomeObject 有一个名为 SomeFunction() 的函数。此函数返回一个对象(根据您的示例,我们的类型未知)。该对象有一个名为 SomeOtherFunction() 的函数。

不过,“如何实施”这个问题有点模糊。

于 2013-05-31T10:04:51.017 回答
2

这称为流利编码或方法链接,是一种允许您将命令链接在一起的编程方法。这在 LINQ 中很常见,您可能会遇到这样的情况:

var result = myList.Where(x => x.ID > 5).GroupBy(x => x.Name).Sort().ToList();

这将为您提供大于 5 的所有记录,然后按名称分组、排序并作为列表返回。相同的代码可以这样写:

var result = myList.Where(x => x.ID > 5);
result = result.GroupBy(x => x.Name);
result = result.Sort();
result = result.ToList();

但你可以看到这要啰嗦得多。

于 2013-05-31T10:05:54.423 回答
2

这种编程风格称为FluentInterface风格。

例如:

internal class FluentStyle
    {
        public FluentStyle ConnectToDb()
        {
            // some logic
            return this;
        }
        public FluentStyle FetchData()
        {
            // some logic
            return this;
        }
        public FluentStyle BindData()
        {
            // some logic
            return this;
        }
        public FluentStyle RefreshData()
        {
            // some logic
            return this;
        }
    }

并且可以创建对象和使用方法,如下所示;

  var fluentStyle = new FluentStyle();
     fluentStyle.ConnectToDb().FetchData().BindData().RefreshData();
于 2013-05-31T10:12:01.360 回答
2

考虑以下

public class FirstClass
{
    public SecondClass SomeFunction()
    {
        return new SecondClass();  
    }
}

public class SecondClass
{
    public void SomeOtherFunction()
    {

    }
}

所以以下是等价的。

 FirstClass SomeObject = new FirstClass();
 SomeObject.SomeFuntion().SomeOtherFunction();

或者

 FirstClass SomeObject = new FirstClass();
 SecondClass two = SomeObject.SomeFuntion();
 two.SomeOtherFunction();
于 2013-05-31T10:12:59.233 回答
1

这种类型的链接可能涉及扩展方法。这些允许将新方法添加到现有类(即使是那些您没有源代码的类)。

例如

public static class StringExtender
{
    public static string MyMethod1(this string Input)
    {
        return ...
    }

    public static string MyMethod2(this string Input)
    {
        return ...
    }
}

....

public string AString = "some string";
public string NewString = AString.MyMethod1().MyMethod2(); 
于 2013-05-31T10:13:20.690 回答
1

这可以使用扩展方法来完成

 public class FirstClass
{
}

public class SecondClass
{
}
public class ThridClass
{
}

public static class Extensions
{

    public static SecondClass GetSecondClass(this FirstClass f)
    {
        return new SecondClass();
    }
    public static ThridClass GetThridClass(this SecondClass s)
    {
        return new ThridClass();
    }
}

}

然后你可以使用

        FirstClass f= new FirstClass();
        f.GetSecondClass().GetThridClass();
于 2013-05-31T10:34:05.467 回答