静态属性可以在c#中返回对象/类的新实例

时间:2014-08-30 13:24:17

标签: c# asp.net oop design-patterns

我正在ASP.NET MVC 4中构建一个应用程序。我正在创建一个类(类似于Factory类型),它将返回我在BAL Layer中创建的服务类的实例。我想在该类中声明静态属性,它们应该返回所请求的服务类的实例。

我的问题是,静态属性可能会返回新类的实例,因为静态属性将被分配一个将保留在整个应用程序中的内存。我在这里有点困惑,请解释发生了什么以及最好的方法。

到目前为止完成的代码

public class Factory
{
    public static CountryService CountryServiceInstance
    {
        get
        {
            return new CountryService(new CountryRepository());
        }
    }
}

3 个答案:

答案 0 :(得分:3)

你应该做的是编写一个函数,它将创建新实例而不是get属性

public class Factory
{
    public static CountryService CreateNewService()
    {
        return new CountryService(new CountryRepository());
    }
}

关于你的记忆关注阅读Sriram Sakthivel的第一条评论 更多关于工厂模式的信息: http://msdn.microsoft.com/en-us/library/ee817667.aspx

答案 1 :(得分:2)

C#中的属性只是一个返回它应该在其体内返回的方法。在您的情况下,每次访问该属性时,都将创建一个新的服务实例。

如果您只想要该服务的一个实例,您可能希望将其存储到静态私有变量中,如下所示

private static readonly Lazy<CountryRepository> _fact 
    = new Lazy<CountryRepository>(() => new CountryRepository());

此外,静态属性永远不会在整个应用程序中存储“内存”,但程序员可以这样做。

再一次,属性只是一对set \ get方法,除非你使用自动属性,其中还有一个为要存储的值创建的支持字段。

static关键字本身仅指定不能通过this关键字访问当前的类成员,并且它的值将在整个appdomain(或您的应用程序)中共享。

答案 2 :(得分:1)

您的方法每次调用的CountryServiceInstance将始终为您提供CountryRepository的新实例。

正如您所提到的,大多数Factory类都是静态的,负责创建新的对象实例。如果它们给出相同的对象实例,则任何工厂模式都不会满足其意图。

你可以毫无疑问地继续处理你的罪行。

如果要快速验证,可以检查创建的对象哈希码 object.GetHashCode()它们将是唯一的,因为它们是单独的对象