首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在静态属性getter中创建的新对象是否只创建一次?

在静态属性getter中创建的新对象是否只创建一次?
EN

Stack Overflow用户
提问于 2010-01-11 23:44:02
回答 3查看 4.7K关注 0票数 6

我正在为我正在编写的web服务创建一个静态助手类。我正在利用Telligent的API,因此创建了这些Telligent“服务”对象,允许我使用该平台进行操作。例如,我在我的助手类中创建了一个MembershipSerice对象,这样我就可以用相同的对象来做成员资格的事情了。在我的helper类中,我有一个带有getter的属性,可以创建这些对象中的一个新对象:

代码语言:javascript
复制
private static MembershipService _MembershipService {
  get {
    return new MembershipService(path, usr, pwd);
  }
}

然后我有一个返回该属性的方法:

代码语言:javascript
复制
public MembershipService getMembershipService() {
  return _MembershipService;
}

这是否意味着因为属性是静态的,所以在getter中创建的新对象只创建一次?此外,在编码风格方面,最好将属性设置为公共的,因此该方法将是不必要的。

或者..。将对象创建为私有变量并通过公共方法返回它是不是更好:

代码语言:javascript
复制
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
  return _mbrSvc;
}

// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();

如果你对我如何设置它的风格有任何想法,以便它的效率和表现良好,请让我知道。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-11 23:48:15

是否意味着因为属性是静态的,所以在getter中创建的新对象只创建一次?

不,因为你有

代码语言:javascript
复制
new MembershipService(path, usr, pwd);

在getter内部,无论_MembershipService被声明为static,每次调用时都会创建一个新实例。在这个上下文中,static意味着您可以在没有定义类的实例的情况下调用该方法。

至于评论风格,嗯,这真的取决于你想做什么。您想要单实例吗?如果是,则创建一个静态成员变量_mbrSvc,并从getter返回该变量:

代码语言:javascript
复制
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
    get {
        return _mbrSvc;
    }
}

否则,照原样做就好了。

票数 14
EN

Stack Overflow用户

发布于 2010-01-12 00:28:37

为了完整起见,Jason,Mark还取决于MembershipService的定义。如果MembershipService是一个类,那么该对象将在调用方法之间共享。如果MembershipService是一个结构,则始终会创建一个副本。仅仅将其称为成员服务对象并不能说明区别,因为在DotNet中,所有东西都是对象。

如果创建对象的成本很高,可以考虑结合使用单例模式和延迟加载:

代码语言:javascript
复制
private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 
票数 4
EN

Stack Overflow用户

发布于 2010-01-11 23:48:38

每次使用new时,都会创建一个新对象。

因此,第一种方法在每次访问属性时创建一个新对象。

你正在寻找的东西被称为单例-你的第二种方法是在C#中实现它的一种可能性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2042857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档