令人困惑的 throw new NotImplementedException();
//代理类
public class HelloWCFClient : ClientBase<IHelloWCFService>, IHelloWCFService
{
public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)
: base(binding, remoteAddress)
{
}
public string HellowWCF(string str)
{
return base.Channel.HelloWCF(str);
//return str;
}
public string HelloWCF(string str)
{
throw new NotImplementedException();
}
}
以上代码为什么必须实现
public string HelloWCF(string str)
{
throw new NotImplementedException();
}
才能正常,去掉就报错错误
“HandClientByClientBase.HelloWCFClient”不实现接口成员“HandClientByClientBase.IHelloWCFService.HelloWCF(string)”
王那位大虾指点下。
------解决方案--------------------为什么Visual Studio要添加throw new NotImplementedException();而不是直接留空呢。
原因我想有2:
一个是对于那些有返回值的方法,如果什么都不写,会无法通过编译,VS不希望这样;
另一个原因是,NotImplementedException();可以表示真的没有实现这个方法。对于可以预见的调用者,它们可能真的只需要使用接口中的一些方法。因此完全没有必要实现所有的方法。NotImplementedException();保证了不实现某些方法,代码仍然合法,同时对调用的违例给出异常提示。
------解决方案--------------------一个很经典的例子是,比如有一个叫鸟的接口,我们定义了下蛋、吃、飞行三个方法。
当我们实现一个鸵鸟的类的时候,如果非要在飞行中添加点代码,或者胡乱返回点什么,如2楼说的那样,并不是好的设计,因为这会让人产生迷惑。
因此直接在方法体内填入throw new NotImplementedException();是一个合理的设计。
类似地,我们设计一个方法,获得来自传感器的温度,用正数表示零上温度,用负数表示零下温度。一个不好的设计是,当传感器故障没有返回的时候返回0,或者某个值。这会导致调用者的迷惑,到底这是故障还是确实有这么一个温度呢。因此最好表示为异常。
去年的动车事故中,信号机没有正确获得信号,因为雷击导致供电中断了。信号机软件在无法获得信号的时候,会返回之前的信号,而不是报错,最终导致了事故。这说明对软件异常的处理必须非常谨慎。
------解决方案--------------------
C# code
public string HellowWCF(string str)
public string HelloWCF(string str)