实例化时调用类方法?

时间:2013-03-01 14:46:22

标签: c#

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

我想知道是否可以使用... = new MyClass()实例化一个类,并在实例化时立即调用此类的非静态方法?

例如类似的东西:

return new MyClass().SetName("some name");

我想我以前见过类似的东西,但我找不到它。 做一些像...这样的事情有点烦人。

MyClass myclass = new MyClass();
myclass.SetName("some name");
return myclass;

有没有办法缩短它或像我的第一个例子那样做? (请不要建议我使用属性而不是SetName(string) - 这只是一个例子)

提前致谢!

7 个答案:

答案 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,第三个选项,构建一个工厂类,它将处理所有这些额外的步骤并返回给你一个实例。