code

Enum의 초기 값

codestyles 2020. 11. 30. 08:18
반응형

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

반응형