我不知道如何更好地描述它,所以标题可能有点令人困惑.
我想知道是否可以通过在实例化时使用... = new MyClass()和调用此类的非静态方法来实例化一个类?
例如,类似的东西:
return new MyClass().SetName("some name");
Run Code Online (Sandbox Code Playgroud)
我想我以前见过类似的东西,但我找不到它.做一些像...这样的事情有点烦人
MyClass myclass = new MyClass();
myclass.SetName("some name");
return myclass;
Run Code Online (Sandbox Code Playgroud)
有没有办法缩短它或像我的第一个例子那样做?(请不要建议我使用属性而不是SetName(string)- 这只是一个例子)
提前致谢!
Jon*_*eet 18
好吧,如果你也有一个属性,你可以使用一个对象初始化:
return new MyClass { Name = "some name" };
Run Code Online (Sandbox Code Playgroud)
如果你真的,真的必须使用一个方法,那么唯一的选择是让方法再次返回实例:
public Foo SomeMethod()
{
// Do some work
return this;
}
Run Code Online (Sandbox Code Playgroud)
你可以这样写:
return new Foo().SomeMethod();
Run Code Online (Sandbox Code Playgroud)
如果你不能改变你正在调用的方法,那么作为一种非常极端的做事方式,你可以编写一个扩展方法:
public static T ExecuteAndReturn<T>(this T target, Action<T> action)
{
action(target);
return target;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以写:
return new Foo().ExecuteAndReturn(f => f.SomeMethod());
Run Code Online (Sandbox Code Playgroud)
但这真的很糟糕.这将是迄今为止简单在这些情况下,使用局部变量...
如果SetName返回this,那么您可以在第一个代码示例中完成您想要做的事情.
这很容易做到.通常,这称为"流畅的界面",但具有更合适的方法名称.
以下是如何将SetName写成这样的函数:
public MyClass SetName(...)
{
...
return this;
}
Run Code Online (Sandbox Code Playgroud)
这将允许您准确的语法.
然后,您可以将多个此类调用链接到不同的方法:
return new MyClass().SetName("kkk").SetAge(44).SetAddres("...");
Run Code Online (Sandbox Code Playgroud)
但是,我建议你也考虑添加一个更合适的构造来完成所有这些.
这个问题存在一个巨大的误解:
...并在实例化时立即调用此类的非静态方法
例如,类似的东西:
return new MyClass().SetName("some name");
Run Code Online (Sandbox Code Playgroud)
事实是,在实例化完成后调用SetName函数.它不是"在实例化时"发生的.这完全相同:
MyClass newInstance new MyClass();
return newInstance.setName("some name");
Run Code Online (Sandbox Code Playgroud)
因此,在SetName调用该方法时,构造函数已完成它需要执行的所有操作,对象已在堆上准备就绪.
除此之外,它在语法上是可行的,你只需要this像其他人注意到的那样返回,当然也可以相应地指定返回类型.不过我不会这样做,但是......这不太好.
此外,如果您始终必须设置名称,请考虑让构造函数将名称作为参数,并在构造函数中设置它:
public class MyClass
{
public String name;
public MyClass(String initialName)
{
name = initialName;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用一个非常简短的形式使用它:
MyClass instance = new MyClass("someName");
Run Code Online (Sandbox Code Playgroud)