我已经基于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”值作为第一个值,因为此值仅作为指示的方式没有设定价值?
显然,如果用户决定使用该值,情况可能并非如此,并且会以这种方式构造代码,从而产生不良结果。
枚举方法可以标记为可为空吗???
答案 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的原因。如果你没有,那么你班级的用户永远不会知道班级的状态是无效的。