问题
I use more than one class and I need a... lets say Global storage for all the class and method. Is it the right way to create a static class for storage?
public static class Storage
{
public static string filePath { get; set; }
}
Or is there other ways to do it?
回答1:
If you really need to make your example a singleton then here is how you do it.
public class StorageSingleton
{
private static readonly StorageSingleton instance;
static StorageSingleton() {
instance = new Singleton();
}
// Mark constructor as private as no one can create it but itself.
private StorageSingleton()
{
// For constructing
}
// The only way to access the created instance.
public static StorageSingleton Instance
{
get
{
return instance;
}
}
// Note that this will be null when the instance if not set to
// something in the constructor.
public string FilePath { get; set; }
}
The way to call and set the singleton is the following:
// Is this is the first time you call "Instance" then it will create itself
var storage = StorageSingleton.Instance;
if (storage.FilePath == null)
{
storage.FilePath = "myfile.txt";
}
Alternatively you can add into the constructor the following to avoid null reference exception:
// Mark constructor as private as no one can create it but itself.
private StorageSingleton()
{
FilePath = string.Empty;
}
Word of warning; making anything global or singleton will break your code in the long run. Later on you really should be checking out the repository pattern.
回答2:
You could consider using the Singleton design pattern: Implementing Singleton in c#
eg.
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
回答3:
You should have a look at the repository pattern:
http://martinfowler.com/eaaCatalog/repository.html
One way of implementing this pattern is through the use of ORM's s.a. NHibernate:
https://web.archive.org/web/20110503184234/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx
回答4:
Applying Singleton to your original class:
public class Storage
{
private static Storage instance;
private Storage() {}
public static Storage Instance
{
get
{
if (instance == null)
{
instance = new Storage();
}
return instance;
}
}
public string FilePath { get; set; }
}
usage:
string filePath = Storage.Instance.FilePath;
回答5:
I love seeing that implementation of singleton in C#.
public class Singleton
{
public static readonly Singleton instance;
static Singleton()
{
instance = new Singleton();
}
private Singleton()
{
//constructor...
}
}
C# guarantees that your instance wont be overriden and your static constructor guarantees that you WILL have your static property instantiated before the first time it's used.
Bonus: It's threadsafe as per language design for static constructors, no double checked locking :).
来源:https://stackoverflow.com/questions/1276292/c-sharp-separate-class-for-storage