C# .Net时区验证的正确方法

C# .Net时区验证的正确方法,c#,.net,timezone,C#,.net,Timezone,我有一个接受.Net(或windows)时区id作为字符串的方法: public void SaveTimezoneId(string timezoneId) { ... } 您可能知道,.Net中的时区是如下字符串: try { TimeZoneInfo.FindSystemTimeZoneById(timezoneId); CurrentUser.TimezoneId = timezoneId; context.SaveCh

我有一个接受.Net(或windows)时区id作为字符串的方法:

public void SaveTimezoneId(string timezoneId) { ... }
您可能知道,.Net中的时区是如下字符串:

    try
    {
        TimeZoneInfo.FindSystemTimeZoneById(timezoneId);

        CurrentUser.TimezoneId = timezoneId;
        context.SaveChanges();

        return JsonSuccess();
    }
    catch(Exception)
    {
        return JsonError("Invalid time zone");
    }
  • 阿拉伯标准时间
  • 俄罗斯标准时间
  • 加拿大中央标准时间
等等

在将它们保存到数据库之前,我需要一种方法来验证它们。我现在做的是这样的:

    try
    {
        TimeZoneInfo.FindSystemTimeZoneById(timezoneId);

        CurrentUser.TimezoneId = timezoneId;
        context.SaveChanges();

        return JsonSuccess();
    }
    catch(Exception)
    {
        return JsonError("Invalid time zone");
    }
但它完全违背了优秀软件开发的一个主要原则:永远不要依赖异常。此外,例外情况也很昂贵

有没有其他方法来执行此检查并摆脱try-catch


谢谢。

首先,如果你没有替代品,或者替代品(也)很昂贵,那么例外是最好的选择。我不是要你停止寻找替代方案,但不要禁止例外,它们和所有类型的代码一样都有自己的位置

但是,您还有一个选择,您可以自己调用并执行查找:

void Main()
{
    var timeZones = TimeZoneInfo
        .GetSystemTimeZones()
        .ToDictionary(stz => stz.Id);

    TimeZoneInfo tz;
    if (timeZones.TryGetValue("UTC-11", out tz))
        tz.Dump();
    else
        Debug.WriteLine("No such timezone");
}
如果您只需要知道id是否有效:

void Main()
{
    var timeZoneIds = new HashSet<string>(TimeZoneInfo
        .GetSystemTimeZones()
        .Select(tzi => tzi.Id));

    timeZoneIds.Contains("UTC-11").Dump();
}
void Main()
{
var timeZoneIds=新哈希集(TimeZoneInfo
.GetSystemTimeZones()的名称
.Select(tzi=>tzi.Id));
timeZoneIds.Contains(“UTC-11”).Dump();
}
这两个都可以在中进行测试


如果您需要多次执行查找/检查,并且可以节省一些内存来支付一定的速度,您可以在通话之间将字典/哈希集存储在安全的地方。

只有在捕获异常时,异常才会很昂贵。您是否考虑过自己使用并执行查找?