Enum의 초기 값
열거 형 속성이있는 클래스가 있습니다.
열거 형은
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
코드에서 NOWHERE라는이 클래스의 인스턴스를 만들 때 열거 형 필드의 값을 지정해야하지만 null 값이 아닌 열거 형 목록의 첫 번째 항목이 기본값 인 것 같습니다. 열거 형이 작동하는 방식입니까? 열거 형이 설정되지 않은 경우 어떤 종류의 null 값을 얻는 것이 어떻게 가능한지, 열거 형의 첫 번째 값을 기본값으로 설정하고 싶지 않습니다.
enum
유형의 기본값 은 0
(기본적으로 열거 형의 첫 번째 요소)입니다. 클래스의 필드는 기본값으로 초기화됩니다.
열거 형에 알 수없는 값 을 표시해야하는 경우 Unknown
값이 0 인 요소 를 추가 할 수 있습니다. 또는 필드를 Nullable<MyEnum>
( MyEnum?
) 로 선언 할 수 있습니다.
열거 형은 int와 같은 값 유형입니다. 첫 번째 (또는 0으로 정의 된) 열거 형 멤버를 기본값으로 사용하지 않도록 nullable로 만들어야합니다.
public class MyClass
{
public EnumDeliveryAction? DeliveryAction { get; set;}
}
열거 형 필드는 0으로 초기화됩니다. 당신이 열거 값을 지정하지 않은 경우, 그들은 제로 (시작 Email = 0
, SharePoint=1
등).
따라서 기본적으로 초기화하는 모든 필드는 Email
. None=0
이러한 경우 에 추가 하거나 대신 사용하는 것이 비교적 일반적입니다 Nullable<T>
. 즉
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Not specified
/// </summary>
None,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
또한 마지막 예상 값을 기본값으로 취급하지 않도록해야합니다 . 즉
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
default: RunSharePoint(); break;
}
이것은 다음과 같아야합니다.
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
case EnumDeliveryAction.SharePoint; RunSharePoint(); break;
default: throw new InvalidOperationException(
"Unexpected action: " + action);
}
모범 사례 (Code Analysis에서 권장)는 항상 열거 형에 설정되지 않은 값을 나타내는 기본값을 갖는 것입니다.
따라서 귀하의 경우에는 다음이있을 수 있습니다.
public enum EnumDeliveryAction
{
/// <summary>
/// Default value
/// </summary>
NotSet,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
제쳐두고, 열거 형의 이름 앞에 Enum을 붙이지 않아야합니다. 다음으로 변경하는 것을 고려할 수 있습니다.
public enum DeliveryAction;
Enums are value types. Value types cannot be null and are initialized to 0.
Even if your enum does not have a 0, enum variables will be initialized to 0.
public enum SomeEnum
{
A = 1,
B = 2
}
(later)
SomeEnum x = default(SomeEnum);
Console.WriteLine(x);
Outputs - 0
Some answerers are advocating using Nullable<T>
to match your initialization expectations. Becareful with this advice since Nullable<T>
is still a value type and has different semantics than reference types. For example, it will never generate a null reference exception (it's not a reference).
SomeEnum? x = default(SomeEnum?);
if (x == null)
{
Console.WriteLine("It's null!");
}
if (x > SomeEnum.B)
{
}
else
{
Console.WriteLine("This runs even though you don't expect it to");
}
You can start your enums at any value (such as 1), but when they represent a lookup value in a Database, you generally want them to match up.
I generally declare the first Enum as None ( = 0) when it makes sense to do so, as per the .Net Framework Design guidelines.
The traditional aproach to adding a null to values that don't generally have one is to declare your variable as a nullable type, ie:
EnumDeliveryAction? action=null;
I'd suggest having a value of None = 0 as your first enum value. Make it explicit, then you know for sure what it's value is.
By default only reference types are nullable types. If you want a variable to allow nulls you have to define it as nullable using the "?" character (for this you need C# 2.0 or up).
enum MyEnum
{
ValueOne,
ValueTwo
}
and in your class
MyEnum? myvariable = null;
My C++ teacher in college (11 years ago) told me that the linker replaces enum with their actual type:
typedef static const int enum;
Thus, any time you write something like enum MY_VAL = 5;
, you could easily replace with static const int MY_VAL = 5;
(but that just makes your code longer...).
Anyway, the default value of any int
is 0.
참고URL : https://stackoverflow.com/questions/1165402/initial-value-of-an-enum
'code' 카테고리의 다른 글
Scala 배열을 Scala vararg 메서드에 전달하는 방법은 무엇입니까? (0) | 2020.11.30 |
---|---|
HTTP / 2에서 멀티플렉싱의 의미 (0) | 2020.11.30 |
경로 대신 URL에 파일이 있는지 확인하십시오. (0) | 2020.11.30 |
자산 속도 향상 : Rails 3.1 / 3.2 Capistrano 배포로 사전 컴파일 (0) | 2020.11.30 |
사전의 키 값으로 사전의 NSArray 정렬 (0) | 2020.11.30 |