首页 / C# / 减少c#中代码复制的惯用方法
减少c#中代码复制的惯用方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了减少c#中代码复制的惯用方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1635字,纯文字阅读大概需要3分钟。
内容图文
![减少c#中代码复制的惯用方法](/upload/InfoBanner/zyjiaocheng/794/474f6dfc31e94f9ea7f9e0dab313545f.jpg)
我是C#的新手(我来自C),我遇到了一个简单的模式,在C中我会使用模板解决,但同样的方法不能使用C#泛型.
下一个代码(C#与C模板的混合)显示了我的问题.
class A { /* ... */ }
class B { /* ... */ }
// C, D, ...
class W
{
public void Update(A a) { /* ... */ }
public void Update(B b) { /* ... */ }
// C, D, ...
}
class X
{
template <typename T>
public void Update(IEnumerable<T> vs) {
if (vs.any(vs => CreateOrUpdate(v))) {
doStuff();
}
}
template <typename T>
public void Update(T v)
{
if (CreateOrUpdate(v)) {
doStuff()
}
}
template <typename T>
private bool CreateOrUpdate(T v)
{
W w;
bool updated = false;
if (!m.TryGetValue(v.Id, out w)) {
w = new W(v.Id);
m.Add(w.Id, w);
updated = true;
}
return w.Update(v) || updated;
}
private Dictionary<string, W> m;
}
即使A,B,……实现了接口IId之类的接口{string Id {get;我使用泛型public void Update< T>(IEnumerable< T> vs):其中T:IId,代码因w.Update(v)而无法工作(它需要添加公共bool更新(IId id)在W中,但是这个方法将是总是被调用的方法.
从理论的角度来看,我理解C#泛型和C模板之间的区别,以及w.Update(v)为什么不能在W中从Update方法中静态调度调用.但是,我无法弄清楚哪个是这个问题的最佳解决方案.
解决方法:
确实有一种方法是将一个方法public bool Update(IId id)添加到W类,但是你需要动态调度参数id:
class W
{
public bool Update(IId id)
{
dynamic d_id = id;
return Update(d_id);
}
// ...
}
程序将在运行时确定要调用哪个Update函数,因为d_id被声明为动态.
如果添加另一个实现IId的类E,但忘记实现Update(E e),上面的Update函数将递归调用自己,直到你内存不足为止.通过将Update(IId id)重命名为DoUpdate(IId id)并在CreateOrUpdate中调用DoUpdate,可以避免无限递归的危险.然后,您将获得一个有意义的异常,指出无法调度E类型的ID.
MSDN上有一个很好的blog post on multimethods in C#可能对你有帮助.
内容总结
以上是互联网集市为您收集整理的减少c#中代码复制的惯用方法全部内容,希望文章能够帮你解决减少c#中代码复制的惯用方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。