实例化时调用类方法?

Tor*_*enJ 6 c#

我不知道如何更好地描述它,所以标题可能有点令人困惑.

我想知道是否可以通过在实例化时使用... = 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)

但这真的很糟糕.这将是迄今为止简单在这些情况下,使用局部变量...


Jak*_*e H 7

如果SetName返回this,那么您可以在第一个代码示例中完成您想要做的事情.

  • 在这里抵抗downvote是非常困难的.这是一个糟糕的解决方案,模糊了意图,违反了serps. (2认同)

ang*_*son 6

这很容易做到.通常,这称为"流畅的界面",但具有更合适的方法名称.

以下是如何将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)

但是,我建议你也考虑添加一个更合适的构造来完成所有这些.


ppe*_*rka 5

这个问题存在一个巨大的误解:

...并在实例化时立即调用此类的非静态方法

例如,类似的东西:

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)