在静态方法中返回'this'

时间:2012-04-15 08:51:02

标签: c# .net this static-classes

我想创建一个具有流畅界面的静态类,但我收到错误:

  

'this'在静态属性中无效,方法......

这是我的代码:

public static MyClass
{
    private static StringBuilder builder;
    private static StringBuilder RouteBuilder
    {
        get
        {
            if (builder == null)
                builder = new StringBuilder();

            return builder;
        }
    }

    public static MyClass Root()
    {
      RouteBuilder.Append("/");
      return this;
    }

    public static MyClass And()
    {
      RouteBuilder.Append("and");
      return this;
    }

    public static MyClass Something()
    {
       RouteBuilder.Append("something");
       return this;
    }
}

这使我能够MyClass.Root().And().Something();

有没有办法做到这一点或解决方法?

4 个答案:

答案 0 :(得分:11)

那是不可能的。您不能拥有静态类的实例。由于您已将MyClass标记为静态,因此不能有任何实例。不要让它静止:

public class MyClass
{
    private StringBuilder builder;
    private StringBuilder RouteBuilder
    {
        get
        {
            if (builder == null)
                builder = new StringBuilder();

            return builder;
        }
    }

    public MyClass Root()
    {
        RouteBuilder.Append("/");
        return this;
    }

    public MyClass And()
    {
        RouteBuilder.Append("and");
        return this;
    }

    public MyClass Something()
    {
        RouteBuilder.Append("something");
        return this;
    }
}

然后你可以链接:

var result = new MyClass().Root().And().Something();

答案 1 :(得分:1)

返回RouteBuilder会成功!

编辑:错误,抱歉

对于这些情况,您也可以只进行扩展类

 public static class StringBuilderExtensions {

    public static StringBuilder Root(this StringBuilder builder) {
      Asserts.IsNotNull(builder);
     builder.Append("/");
     return builder;
    }

   public static StringBuilder And(this StringBuilder builder) {
     Asserts.IsNotNull(builder);
     builder.Append("and");
     return builder;
   }
   //...etc
 }

并像

一样使用它
var builder = new StringBuilder();
builder.Root().Append()

答案 2 :(得分:0)

我很惊讶语言甚至允许这样 - 你定义的方法清楚地返回一个实例,但是在同一个类定义中,你已经声明你不能创建它的实例。

您仍然可以在普通类上定义静态方法。您可以强制实施者始终使用流畅的界面,而不是通过以下方式实例化MyClass

  • 为MyClass提供一个只能从private MyClass()内部调用的私有构造函数MyClass
  • 将MyClass标记为sealed,以防止创建公开构造函数的继承者。

答案 3 :(得分:0)

你不能在静态方法中使用'this'关键字,因为'this'返回class的CURRENT INSTANCE。但是静态方法不属于任何实例(相反,它们属于类本身),因此无法返回它。

为什么你需要你的类和方法是静态的?删除所有静态关键字将使其工作。如果您使用Singleton pattern代替。