繁体   English   中英

实例化时调用类方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM