每次要使用类中的函数时,都调用“ new”

时间:2018-08-02 14:16:34

标签: c# class

可以编写这样的类吗?

public class AlexaApi
{
    public string CreateRandomPhrase()
    {
        return "Hello World" //There's more code, but needless for my question
    }
    public object ResponseBuilder(string text)
    {
       //CODE HERE
    }
}

但是当我使用该类时,每次我想访问其功能时都调用“ new”。

new AlexaApi().ResponseBuilder(new AlexaApi().CreateRandomPhrase());

我知道这会创建两个AlexaApi对象的实例,很可能应该这样写:

var alexa = new AlexaApi();
alexa.ResponseBuilder(alexa.CreateRandomPhrase());

每次调用“ new”会消耗更多的内存吗?可能发生的最坏的事情是什么?做第一个示例中写的内容真的很糟糕吗?

4 个答案:

答案 0 :(得分:2)

您实际上想要的是一种static方法:

public class AlexaApi
{
    public static string CreateRandomPhrase()
    {
        return "Hello World" //There's more code, but needless for my question
    }
    public static object ResponseBuilder(string text)
    {
       //CODE HERE
    }
}

然后您可以这样调用这些方法:

AlexaApi.CreateRandomPhrase();
..etc.

即您可以避免每次都开设新课程。

但是请注意,static方法和类的含义与没有static的方法和类略有不同。特别是

  • 您不能在类中存储状态
  • 内存中永远只有该方法的一个实例(这可能会提高内存效率,但是如果您不注意,还会导致内存泄漏)
  • 静态对象在单元测试中可能是一个问题,因为它们无法注入

您不会显示此类的详细信息,因此很难明确。如果您的方法只是“逻辑”,那么将它们设为静态不会有任何危害。如果他们加载资源等,那么就不会。

有关更多信息,请参见Static vs non-static class members

还请注意,仅包含static方法的类本身可以制成static。这只是防止您声明无静态方法/属性

public static class AlexaApi
{
    public static string CreateRandomPhrase()
    {
        return "Hello World" //There's more code, but needless for my question
    }
    public static object ResponseBuilder(string text)
    {
       //CODE HERE
    }
}

答案 1 :(得分:0)

要执行所有这些操作而不创建多个实例,您应该按照建议使用静态方法。考虑以下代码:

public class AlexaApi
{
    public static string CreateRandomPhrase()
    {
        return "Hello World" //There's more code, but needless for my question
    }
    public static object ResponseBuilder(string text)
    {
       //CODE HERE
    }
}

这样,您可以使用以下代码获得相同的结果:

AlexaApi.ResponseBuilder(AlexaApi.CreateRandomPhrase());

答案 2 :(得分:0)

keyword static应该适合您的情况:

public class AlexaApi
{
    public static string CreateRandomPhrase()
    {
        return "Hello World" //There's more code, but needless for my question
    }
    public static object ResponseBuilder(string text)
    {
       //CODE HERE
    }
}

并直接调用该方法,而无需创建实例:

AlexaApi.ResponseBuilder(AlexaApi.CreateRandomPhrase());

答案 3 :(得分:0)

正如您在问题中提到的那样,每次使用类的新实例将占用更多内存。根据调用此方法的范围和类的大小(多少个实例变量,而不是代码行),这实际上几乎不占用额外的内存(存储该类额外实例的内存)或CPU时间(使用现有的默认值/构造函数创建类)消耗的内存比程序其余部分的总和还多。

正如评论中提到的那样,以及在我键入此内容时发布的答案,您始终可以创建这些方法static,这意味着可以完全不使用类的实例来调用它们,这将节省您的时间麻烦。