我不知道如何更好地描述它,所以标题可能有点令人困惑。
我想知道是否可以使用... = new MyClass()
实例化一个类,并在实例化时立即调用此类的非静态方法?
例如类似的东西:
return new MyClass().SetName("some name");
我想我以前见过类似的东西,但我找不到它。 做一些像...这样的事情有点烦人。
MyClass myclass = new MyClass();
myclass.SetName("some name");
return myclass;
有没有办法缩短它或像我的第一个例子那样做?
(请不要建议我使用属性而不是SetName(string)
- 这只是一个例子)
提前致谢!
答案 0 :(得分:17)
好吧,如果你 有一个属性,你可以使用一个对象初始化器:
return new MyClass { Name = "some name" };
如果你真的,真的必须使用方法,那么唯一的选择是让方法再次返回实例:
public Foo SomeMethod()
{
// Do some work
return this;
}
你可以这样写:
return new Foo().SomeMethod();
如果你不能改变你正在调用的方法,那么作为一种真正的极端做事方式,你可以写一个扩展方法:
public static T ExecuteAndReturn<T>(this T target, Action<T> action)
{
action(target);
return target;
}
然后你可以写:
return new Foo().ExecuteAndReturn(f => f.SomeMethod());
但这真的很糟糕。在这些情况下使用局部变量会更简单远 ...
答案 1 :(得分:7)
如果SetName
返回this
,那么您可以在第一个代码示例中完成您想要做的事情。
答案 2 :(得分:7)
问题中存在巨大误解:
...并在实例化时立即调用此类的非静态方法
例如类似的东西:
return new MyClass().SetName("some name");
事实是,在实例化完成后调用SetName
函数。它不是“在实例化时”发生的。这与:
MyClass newInstance new MyClass();
return newInstance.setName("some name");
所以当调用SetName
方法时,构造函数已经完成了它需要做的所有事情,对象在堆上就绪了。
除此之外,它在语法上是可行的,你只需要像其他人注意到的那样返回this
,当然也可以相应地指定返回类型。不过我不会这样做,但是......这不太好。
此外,如果您始终必须设置名称,请考虑让构造函数将该名称作为参数,并在构造函数中设置它:
public class MyClass
{
public String name;
public MyClass(String initialName)
{
name = initialName;
}
}
然后你可以用一个非常简短的形式使用它:
MyClass instance = new MyClass("someName");
答案 3 :(得分:6)
这很容易做到。通常,这被称为“流畅的界面”,但具有更合适的方法名称。
以下是如何将SetName写成这样的函数:
public MyClass SetName(...)
{
...
return this;
}
这将允许您准确的语法。
然后,您可以将多个此类调用链接到不同的方法:
return new MyClass().SetName("kkk").SetAge(44).SetAddres("...");
但是,我建议你也考虑添加一个更合适的构造来完成所有这些。
答案 4 :(得分:3)
您可以将这些方法设为可链接:
public void SetName(String name) {
this._name = name;
return this;
}
答案 5 :(得分:3)
除非SetName
是承载它的类的类型并返回this
,否则您无法避免使用中间变量。当然你可以采用流利的语法,让你的SetName
返回对象,但这不是C#的原生习语。
class MyClass {
public int A {get;private set;}
public int B {get;private set;}
public MyClass SetA(int a) {
A = a;
return this;
}
public MyClass SetB(int b) {
B = b;
return this;
}
}
现在你可以这样做:
return new MyClass().SetA(123).SetB(456);
答案 6 :(得分:1)
您可以创建一个静态属性,作为工厂,返回一个新实例。在这种情况下,呼叫看起来像:
MyClass.GetInstance.SetName("some name");
不确定这是否是你想要的。或者,为什么不在构造函数中调用该方法并通过构造函数传递所需的参数。
OR,第三个选项,构建一个工厂类,它将处理所有这些额外的步骤并返回给你一个实例。