1

我基于单例模式创建了以下类:

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 属性设置值,而不必添加“未指定”值作为第一个值,因为该值仅作为指示没有值的方式存在放?

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

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

4

3 回答 3

2

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

是的。

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

var bob = Bob() ?? MyEnum.Default;
于 2012-08-26T23:17:10.177 回答
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;
于 2012-08-26T23:21:08.410 回答
0

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

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

于 2012-08-26T23:19:26.463 回答