如何在使用Singleton Pattern时处理未分配的属性

时间:2012-08-26 23:10:02

标签: c#

我已经基于Singleton模式创建了以下类:

public sealed class UTrans
{
    private static volatile UTrans _instance;
    private static readonly object syncRoot = new Object();
    private UTrans(){}

    private static UTrans Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (syncRoot)
                {
                    if (_instance == null)
                        _instance = new UTrans();
                }
            }
            return _instance;
        }
    }
}

在这个类中我创建了一个枚举属性和字符串属性

    private static MethodType _method; // Alphabectic 1 - 50
    public static MethodType Method
    {
        get {  return _method; }
        set { _method = value; }
    }
    private static string _uName;
    public static string UserName
    {
        get { return _uName; }
        set { _uName = value; }
    }

我也有一些方法在这个类中有很多参数。当我在代码中调用类实例时,如果用户为属性分配值;将使用这些值。否则,将使用作为参数传递的值。

通过检查属性上的空值,这在UserName属性的情况下工作正常:

var un = UserName ?? user;

但是我无法对枚举属性执行相同的检查,因为如果未分配枚举属性,该属性似乎会自动采用枚举的第一个值。

我试图通过将枚举的第一个值指定为“未指定”来绕过该问题。然后我可以继续编码:

var processMethod = TranslateMethodType(Method) == "Unspecified" ? method : Method;

其中TranslateMethodType是一个私有方法,它将选定的枚举转换为等效的字符串值。

我不相信这是解决这个问题的最优雅方法,并希望就此问题的可能替代方案提供一些反馈。

有没有办法检查类的用户是否没有为MethodType属性设置值,而不必添加“Unspecified”值作为第一个值,因为此值仅作为指示的方式没有设定价值?

显然,如果用户决定使用该值,情况可能并非如此,并且会以这种方式构造代码,从而产生不良结果。

枚举方法可以标记为可为空吗???

3 个答案:

答案 0 :(得分:2)

  

枚举方法可以标记为可为空吗???

public Nullable<MyEnum> Bob(){
    //stuff
}

var bob = Bob() ?? MyEnum.Default;

答案 1 :(得分:1)

是的,您可以使Method字段/属性可以为空。

private static MethodType? _method; // Alphabectic 1 - 50
public static MethodType? Method
{ 
    get {  return _method; } 
    set { _method = value; }
} 

然后你可以做

var processMethod = Method == null ? method : Method.Value;

var processMethod = Method.HasValue ? Method.Value: method;

答案 2 :(得分:0)

您可以将其标记为可为空,但您遇到的是预期行为。

作为引用类型成员的值类型初始化为0.这就是为什么您应始终为枚举提供值0的原因。如果你没有,那么你班级的用户永远不会知道班级的状态是无效的。