2010-01-11 75 views
4

我创建web服务我正在写一个静态辅助类。我正在使用Telligent的API,因此创建了这些Telligent“服务”对象,这些对象使我可以在平台上进行操作。例如,我在我的助手类中创建了一个MembershipSerice对象,所以我可以使用同一个对象来完成成员资格。在我的辅助类我有一个getter创建这些对象中的一个新的属性:是仅在一次创建的静态属性获取器中创建的新对象吗?

private static MembershipService _MembershipService { 
    get { 
    return new MembershipService(path, usr, pwd); 
    } 
} 

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

public MembershipService getMembershipService() { 
    return _MembershipService; 
} 

由于这是否意味着属性是静态的,在getter中创建的新对象只创建一次?此外,就编码风格而言,将财产公开为好,因此该方法将不必要。

还是......会是更好的只是创建对象的私有变量,并通过公共方法返回它:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd); 
public MembershipService getMembershipService() { 
    return _mbrSvc; 
} 

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

如果你对我如何设置此样式的任何想法所以它的效率和表现不错,请让我知道。

回答

12

这是否意味着由于属性是静态的,只能创建一次在getter中创建的新对象?

不行,因为你有

new MembershipService(path, usr, pwd); 

getter中,无论_MembershipService被宣布static一个新的实例将在每次调用创建。所有static意味着在这种情况下,您可以调用该方法,而无需定义类的实例。

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

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd); 
private static MembershipService _MembershipService { 
    get { 
     return _mbrSvc; 
    } 
} 

否则,它是好的。

+0

感谢杰森的细节。 – 2010-01-11 15:53:13

1

每当你使用创建一个新的对象。

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

什么你正在寻找被称为辛格尔顿 - 你的第二个方法是实现它在C#中的一种可能性。

+0

谢谢。我只是意识到这是单例模式,使用变量将起作用。 – 2010-01-11 15:54:14

3

杰森,马克 只是为了完整性起见,ALS取决于MembershipService的定义。 如果MembershipService是一个类,则该对象在调用方法之间共享。 如果MembershipService是一个结构体,则始终创建一个副本。只是将它称为MembershipService对象并没有指定差异,因为在DotNet中,一切都是对象。

如果对象是创建昂贵,考虑使用Singleton模式与延迟加载相结合:

private static MembershipService _mbrSvc; 
private static MembershipService _MembershipService { 
    get { 
     if(_mbrSvc == null) 
     { 
      _mbrSvc = new MembershipService(path, usr, pwd); 
     } 
     return _mbrSvc; 
    } 
} 
+0

感谢您的额外信息。在我发布并获得答案后,​​我的一位同事实际上告诉我,只有在需要时才创建它。谢谢! – 2010-01-11 17:51:42

+0

您可以(可以说)通过使用空合并运算符来简化此代码: 'return _mbrSvc ?? (_mbrSvc =新的MembershipService(路径,usr,pwd));' – 2012-08-29 15:48:17