C# 诚实与不诚实功能问题
我目前正在阅读Enrico Buonanno的C#函数编程。第3章包含一个练习(我将把练习缩短到相关部分):C# 诚实与不诚实功能问题,c#,functional-programming,C#,Functional Programming,我目前正在阅读Enrico Buonanno的C#函数编程。第3章包含一个练习(我将把练习缩短到相关部分): /5。在下面的'AppConfig'类中编写该方法的实现。 //假设设置的类型为字符串、数字或日期。 公共类AppConfig { NameValueCollection来源; //public AppConfig():此(ConfigurationManager.AppSettings){} public AppConfig(NameValueCollection source)=>t
/5。在下面的'AppConfig'类中编写该方法的实现。
//假设设置的类型为字符串、数字或日期。
公共类AppConfig
{
NameValueCollection来源;
//public AppConfig():此(ConfigurationManager.AppSettings){}
public AppConfig(NameValueCollection source)=>this.source=source;
公共选项Get(字符串名称)
{
抛出新的NotImplementedException(“此处的实现…”);
}
}
我想出的解决办法是
public Option<T> Get<T>(string name)
{
try {
return (T)Convert.ChangeType(source.Get(name), typeof(T)));
}
catch {
return None;
};
}
public选项Get(字符串名称)
{
试试{
return(T)Convert.ChangeType(source.Get(name)、typeof(T));
}
捕获{
不返回任何值;
};
}
作者的解决方案是
public Option<T> Get<T>(string key)
=> source[key] == null
? None
: Some((T)Convert.ChangeType(source[key], typeof(T)));
public选项获取(字符串键)
=>源[键]==null
? 没有一个
:一些((T)Convert.ChangeType(source[key],typeof(T));
但这不是一个不诚实的函数吗?我可以有一个配置文件,其中包含一个键“SomeNumber”,其值为“nota number”,因此如果我使用类似于Get(“SomeNumber”)
的方法,这将抛出,而我的实现将不返回任何值。或者,我也可能有一个键为“SomeString”的条目,其值为“再见世界”,我通过调用Get(“SomeString”)
错误地试图检索该条目
您可能会认为抛出实际上是期望的结果,因为这是一个开发人员错误,应该突出显示
思考?投掷实际上是期望的结果是的。NET中使用的模式是不抛出方法被称为TrySomething
(例如TryParse
,TryGetValue
)
我要补充一点,在您的案例中,书中建议的方法有三个可能的“返回值”(我将在这里使用双引号):
- 已找到正确类型的密钥
- 找不到密钥
- 找到键,但类型错误(引发异常)
- 已找到正确类型的密钥
- 找不到密钥或找到的密钥类型错误
public Option<T> Get<T>(string key)
=> source[key] == null
? None
: Some((T)Convert.ChangeType(source[key], typeof(T)));