我有一个接受.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");
}
但它完全打破了良好软件开发的主要原则之一:永远不要依赖异常。而且,异常(exception)是昂贵的。
还有其他方法可以执行此检查并摆脱 try-catch 吗?
谢谢。
最佳答案
首先,如果您没有替代方案,或者替代方案(也)成本很高,那么异常(exception)是要走的路。我不是要你停止寻找替代品,但不要禁止异常,它们和所有类型的代码一样都有自己的位置。
但是,您还有其他选择,您可以调用 TimeZoneInfo.GetSystemTimeZones并自己进行查找:
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();
}
这两个都可以在 LINQPad 中进行测试.
如果您需要多次查找/检查并且可以腾出一些内存来支付一些速度,您可以将字典/哈希集存储在调用之间安全的地方。
关于c# - .Net 时区验证的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681852/