views:

99

answers:

3

I'm creating a static helper class for web services I'm writing. I'm tapping into the API of Telligent and therefore creating these Telligent "service" objects that allow me to do things with the platform. For example, I'm creating a MembershipSerice object in my helper class so I can do membership stuff with the same object. In my helper class I have a property with a getter that creates a new one of these objects:

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

And then I have a method that returns that property:

public MembershipService getMembershipService() {
  return _MembershipService;
}

Does that mean since the property is static that the new object created in the getter is only created once? Also, in terms of coding style, would it just be better to make the property public and therefore the method would be unnecessary.

Or... would it be better to just create the object as a private variable and return it via the public method:

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

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

If you have any thoughts on the style of how I set this up so its efficient and performs well, please let me know.

+8  A: 

Does that mean since the property is static that the new object created in the getter is only created once?

No, because you have

new MembershipService(path, usr, pwd);

inside the getter, regardless of _MembershipService being declared static a new instance will be created on every invocation. All that static means in this context is that you can invoke the method without having an instance of the defining class.

As far as commenting on the style, well, it really depends on what you want to do. Do you want a single instance? If so, create a static member variable _mbrSvc and return that from the getter:

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

Otherwise, as it is is fine.

Jason
Thanks Jason for the details.
Mark Ursino
+1  A: 

Everytime you use new a new object is created.

Therefore, the first approach creates a new object everytime the property is accessed.

What you are looking for is called a Singleton - your second approach is one possibility to implement it in C#.

winSharp93
Thanks. I'm just realizing this is the singleton pattern and using a variable will work.
Mark Ursino
+1  A: 

Jason, Mark Just for completeness sake, it als depends on the definition of MembershipService. If MembershipService is a class then the object is shared between the calling methods. If MembershipService is a struct, a copy is always being created. Just calling it a MembershipService-object does not specify the difference, since in DotNet everything is an object.

If the object is expensive to create, consider using a singleton pattern combined with lazy loading:

private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 
Thanks for the extra info. After I posted and got answers, one of my co-workers actually told me the same thing about only creating it when you need it. Thanks!
Mark Ursino