如何判断是否已设置枚举属性? C#
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断是否已设置枚举属性? C#相关的知识,希望对你有一定的参考价值。
我有一个类enum属性,如下所示:
public class Foo
{
public Color ColorType {get;set;}
}
public enum Color
{
Red,
Green,
}
现在这个类可以像这样初始化:
var foo = new Foo();
没有设置ColorType属性。现在,我正在尝试创建一个方法并对是否设置枚举执行操作,例如我有一个方法
private void checkEnum(Foo foo)
{
if(foo.ColorType !=null)
{
//perform these actions
}else
{
//perform those actions
}
}
然而,我得到一个警告,说值永远不会为空,经过进一步的研究,如果枚举永远不会被设置,如果默认为第一个值,在我的情况下是红色,我在考虑为我的枚举添加一个值是'未设置'并将该值设为第一个,所以如果没有设置,那么枚举将具有'未设置'的值,是否有更好的方法这样做,我提出的方法似乎可能会变得混乱
您可以使用以下两种方法之一:默认枚举值或可以为空的枚举。
默认枚举值
由于枚举由整数支持,并且int
默认为零,因此枚举将始终默认初始化为等于零的值。除非您明确指定枚举值,否则第一个值将始终为零,第二个值将为1,依此类推。
public enum Color
{
Undefined,
Red,
Green
}
// ...
Assert.IsTrue(Color.Undefined == 0); // success!
可空的枚举
处理未分配枚举的另一种方法是使用可空字段。
public class Foo
{
public Color? Color { get; set; }
}
// ...
var foo = new Foo();
Assert.IsNull(foo.Color); // success!
您可以将其设置为底层私有字段可为空,但属性不可以。
EG
class SomeClass
{
private Color? _color; // defaults to null
public Color Color
{
get { return _color ?? Color.Black; }
set { _color = value; }
}
public bool ColorChanged
{
get { return _color != null; }
}
}
这样,如果color == null
你知道它尚未设置,并且你也阻止用户将其设置为null
(或其他答案指定的undefined
)。如果color
是null
你100%确定用户没有设置它。
只有catch是get
返回的默认值,但是如果它更适合你的程序,你总是可以抛出异常值。
您还可以更进一步,使set
只在给定值不等于默认值时设置字段(取决于您的用例):
public Color Color
{
get { return _color ?? Color.Black; }
set
{
if (value != Color)
{
_color = value;
}
}
}
你有两个真正的选择。第一种是向枚举添加未定义的值。这将是初始化属性之前的默认值。
1)
public enum Color
{
Undefined,
Red,
Green,
}
您的支票如下:
private void checkEnum(Foo foo)
{
if(foo.ColorType == Color.Undefined)
{
//perform these actions
}else
{
//perform those actions
}
}
2)或者你不能添加未定义的值,只需要使属性Nullable
public class Foo
{
public Color? ColorType {get;set;}
}
public enum Color
{
Red,
Green,
}
并执行以下检查:
private void checkEnum(Foo foo)
{
if(!foo.ColorType.HasValue)
{
//perform these actions
}else
{
//perform those actions
}
}
枚举是Value Types,这意味着它们不是对存储在其他地方的对象的引用,因此它们不能是null
。它们总是有一个默认值,就像int
一样,在创建时默认为零。我建议两种方法:
- 添加另一个名为
None
的枚举条目,其值等于零。这样,您的枚举值将在创建时默认为None
。然后你可以检查if(foo.ColorType != Color.None)
。 - 让你的
Color
财产像一个可以为空的:public Color? ColorType { get; set; }
。现在它将默认为null
,并可以赋值null
。在这里阅读更多关于nullable
类型的信息:MSDN - Nullable Types (C#)。
正如您所发现的,C#中的枚举是值类型(它们本质上是整数)而不是引用类型,因此它们不会默认为NULL,而是枚举中的最小整数值。处理枚举时不要忘记这种关系,因为它是最有用的属性之一。永远记住,无论你是否明确说明,
public enum Color
{
Red,
Green
}
相当于:
public enum Color
{
Red = 0,
Green = 1
}
虽然您当然可以为每个枚举成员提供您喜欢的任何整数值。
至于是否有更好的方法,这实际上取决于“这个”是什么,尽管你的建议只是简单地使用以下枚举设置没有错:
public enum Color
{
None = 0,
Red,
Green
}
通常,当您希望能够通过名称选择一组绝对有限且离散的可能值时,您希望使用枚举。例如,假设我有一个方法,它采用4个基本方向之一(北,东,南,西)作为参数。我决定按顺时针顺序为每个方向编号,从0开始为North。
public enum Direction
{
North = 0,
East,
South,
West
}
现在,我没有让我的函数接受一个整数参数,并相信我会记住每个数字引用的内容,我现在可以让函数将枚举成员作为参数,并立即知道我正在处理的方向。例如:
getNeighbor(1);
阅读更容易:
getNeighbor(Direction.East);
enum
是一个值类型,因此它不能为null,并且存储通常是一个整数。如果你想为你的类型定义一个未定义的值,你可能会有
public enum Color
{
Undefined,
Red,
Green,
}
以上是关于如何判断是否已设置枚举属性? C#的主要内容,如果未能解决你的问题,请参考以下文章
Object的几个方法(defineProperty,hasOwnProperty...)
Python代码阅读(第38篇):根据谓词函数和属性字符串构造判断函数