[英]Can a delegate be used to call a method of a class without instantiating it?
[英]Call class method while instantiating?
我不知道如何更好地描述它,所以标题可能有点令人困惑。
我想知道是否可以通过使用... = new MyClass()
来实例化一个类,并在实例化时立即调用此类的非静态方法?
例如,类似的东西:
return new MyClass().SetName("some name");
我想我以前见过类似的东西,但我找不到它。 做一些像...这样的事情有点烦人
MyClass myclass = new MyClass();
myclass.SetName("some name");
return myclass;
有没有办法缩短它或像我的第一个例子那样做? (请不要建议我使用属性而不是SetName(string)
- 这只是一个例子)
提前致谢!
好吧,如果你确实有一个属性,你可以使用一个对象初始化:
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());
但这真的很糟糕。 这将是简单得多在这些情况下,使用局部变量...
如果SetName
返回this
,那么您可以在第一个代码示例中完成您想要执行的操作。
这个问题存在一个巨大的误解 :
...并在实例化时立即调用此类的非静态方法
例如,类似的东西:
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");
这很容易做到。 通常,这称为“流畅的界面”,但具有更合适的方法名称。
以下是如何将SetName写成这样的函数:
public MyClass SetName(...)
{
...
return this;
}
这将允许您准确的语法。
然后,您可以将多个此类调用链接到不同的方法:
return new MyClass().SetName("kkk").SetAge(44).SetAddres("...");
但是,我建议你也考虑添加一个更合适的构造来完成所有这些。
您可以使方法链接如下:
public void SetName(String name) {
this._name = name;
return this;
}
除非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);
您可以创建一个静态属性,作为工厂,返回一个新实例。 在这种情况下,呼叫看起来像:
MyClass.GetInstance.SetName("some name");
不确定这是不是你想要的。 或者,为什么不在构造函数中调用该方法并通过构造函数传递所需的参数。
或者,第三个选项,构建一个工厂类,它将处理所有这些额外的步骤并返回给你一个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.