C# 返回';这';用静态的方法
我想创建一个具有流畅界面的静态类,但我得到了一个错误: “this”在静态属性、方法中无效 这是我的密码:C# 返回';这';用静态的方法,c#,.net,this,static-classes,C#,.net,This,Static Classes,我想创建一个具有流畅界面的静态类,但我得到了一个错误: “this”在静态属性、方法中无效 这是我的密码: public static MyClass { private static StringBuilder builder; private static StringBuilder RouteBuilder { get { if (builder == null) builder
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()和()代码>
有没有办法做到这一点或解决办法?这是不可能的。不能有静态类的实例。因为您已经将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();
返回RouteBuilder将成功
编辑:错误,抱歉
对于这些情况,您也可以只做一个扩展类
说
像这样使用它
var builder = new StringBuilder();
builder.Root().Append()
我感到惊讶的是,语言甚至允许这样做——您定义的方法明确地返回一个实例,但在同一个类定义中,您声明您永远不能创建它的实例
您仍然可以在普通类上定义静态方法。您可以通过以下方式强制实现者始终使用fluent接口,而不是自己实例化MyClass
:
- 给MyClass一个只能从内部调用的私有构造函数
private MyClass()
- 将MyClass标记为密封的
,以防止创建公开公共构造函数的继承器
不能在静态方法中使用'this'关键字,因为'this'返回类的当前实例。但静态方法不属于任何实例(相反,它们属于类本身),因此无法返回它
为什么你需要你的类和方法是静态的?删除所有静态关键字将使其正常工作。如果您愿意,请改用。您希望静态方法中的
这个是什么?我最近写了一篇关于fluent builder接口的文章,这可能会有帮助,但它仍然不利于您的更改,因为返回StringBuilder
并不能传达您的意图。在StringBuilder
上使用名为和的方法毫无意义。我同意你的看法。这只是一种扩展方法的示例。名为MyClass的类也不是那么明确;)但我想你的意思是,这种扩展在“封闭”类中更好,而不是像纯StringBuilder扩展那样,我也同意这一点。
var builder = new StringBuilder();
builder.Root().Append()