gpt4 book ai didi

c# - 枚举 VS 静态类(普通和字符串值)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:25 25 4
gpt4 key购买 nike

一段时间以来,我一直在为 Windows Mobile 和 Android 开发。我对这两个概念感到困惑。

假设我想根据某些用户设备的屏幕尺寸做出决定。所以我会期待如此预定义的值。我可以使用 switch 语句来处理我的逻辑。但是我不确定我是否应该为此目的使用静态类的枚举。哪一个是更好的方法。我可以用这两种不同的方式来做我的逻辑。哪一个是正确的方法?我很困惑。 我也可以使用字符串值吗?因为目前我坚持使用类,所以我需要更新以使用所有枚举。那么如何将我的类更改为字符串枚举?反正。谢谢。

使用枚举

//My predefined values
public enum ScreenSizeEnum
{
Small, Medium, Large, XLarge,
}
//Handling Logic
private void SetScreenSize(ScreenSizeEnum Screen)
{
switch (Screen)
{
case ScreenSizeEnum.Large:
//Do Logic
break;
case ScreenSizeEnum.Small:
//Do Logic
break;
}
}

使用类

//My predefined values
public class ScreenSizeClass
{
public const int Small = 0;
public const int Medium = 1;
public const int Large = 2;
public const int XLarge = 3;
}
//Handling Logic
private void SetScreenSize(int Screen)
{
switch (Screen)
{
case ScreenSizeClass.Large:
//Do Logic
break;
case ScreenSizeClass.Small:
//Do Logic
break;
}
}

最佳答案

来自 Enumeration Types (C# Programming Guide) :

An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable.

The following are advantages of using an enum instead of a numeric type:

  1. You clearly specify for client code which values are valid for the variable.

  2. In Visual Studio, IntelliSense lists the defined values.

因此,如果您传递 enum,它是强类型的,因此您会自动控制可以传递给方法的内容。

ScreenSizeEnum size = ScreenSizeEnum.Medium;
SetScreenSize(size);

当使用 conststatic 字段时,您肯定需要检查传递的 int 值是否来自预期的音调。

int somevalue = ...;//anything
SetScreenSize(somevalue); //compiles

private void SetScreenSize(int Screen)
{
switch (Screen)
{
case ScreenSizeClass.Large:
//Do Logic
break;
case ScreenSizeClass.Small:
//Do Logic
break;
default:
// something else, what to do??
break;
}
}

基于评论:

如果需要检查enum中是否定义了一些int,可以这样做:

int somevallue = 0;
if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue))
{
//it's ok
}

或者扩展方法:

public static T GetEnumValue<T>(this string value) where T : struct
{
Type t = typeof(T);
if (!t.IsEnum)
throw new Exception("T must be an enum");
else
{
T result;
if (Enum.TryParse<T>(value, out result))
return result;
else
return default(T);
}
}

可以用

int somevalue = 1;
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>();

至于string(基于OP的编辑问题):

来自 enum (C# Reference) :

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

所以你不能有一个字符串枚举。但是您可以使用枚举中的名称,因为 ToString 方法返回名称,而不是枚举的值。

ScreenSizeEnum.Small.ToString(); //Small

因此您可以在字符串上使用另一种扩展方法:

public static T GetEnumValue<T>(this string value) where T : struct
{
Type t = typeof(T);
if (!t.IsEnum)
throw new Exception("T must be an enum");
else
{
if (Enum.IsDefined(t, value))
return (T)Enum.Parse(t, value);
else
return default(T);
}
}

这样

int i = (int)ScreenSizeEnum.Small;
string str = ScreenSizeEnum.Small.ToString();
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small

关于c# - 枚举 VS 静态类(普通和字符串值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com