我如何避免';呼叫不明确…';在C#中写入静态和非静态方法时出错?
我有许多表示业务事务调用的类:执行适当的存储过程 现在,问题看起来是这样的:我如何避免';呼叫不明确…';在C#中写入静态和非静态方法时出错?,c#,.net,static,thread-safety,C#,.net,Static,Thread Safety,我有许多表示业务事务调用的类:执行适当的存储过程 现在,问题看起来是这样的: public static class Request { public static void Approve(..) { using(connection) { command.Text = "EXEC [Approve] ,,"] command.ExecuteNonQuery(); } } } 我想让它们更加线程安
public static class Request
{
public static void Approve(..) {
using(connection) {
command.Text = "EXEC [Approve] ,,"]
command.ExecuteNonQuery();
}
}
}
我想让它们更加线程安全:
public class Request {
public static void Approve(..) {
new Request().Approve(..);
}
internal void Approve(..) {
using(connection) {
command.Text = "EXEC [Approve] ,,"]
command.ExecuteNonQuery();
}
}
}
但正在获取下一个错误消息:
两个用户之间的呼叫不明确
以下方法或属性:
'MyNamespace.Request.Approve(..)'和
'MyNamespace.Request.Approve(..)'
我如何强制,标记我正在从静态调用非静态实例方法
或者我不重命名其中一个方法就不能这样做?或者将静态方法移动到另一个类,等等,如果您正在从实例进行调用(例如,
requestVar.Approve()
),那么不,您必须重命名它。可以使用Request.Approve()
调用静态方法。但是C#allows不允许通过实例引用调用静态方法。因此-这些方法必须以不同的方式命名,或者使用参数重载来区分静态方法和实例方法
在您的示例中,由于Approve()方法是内部的,因此重命名它可能是最简单的选择
至于标记一个方法是静态的。。。我(个人)认为这个名字是区分两者的一个很好的方法——为什么要发明更复杂的东西呢。是的,因为你是从
请求
类的一个实例调用Approve()
。要明确地调用静态方法,您需要执行Request.Approve()
。无论如何,使用相同的签名执行静态方法和实例方法会生成编译器错误。但根据LBushkin的回答,您可能应该将内部方法重命名为InternalApprove()
或类似的名称,或者重新考虑您的类结构。我无法命名静态类:)什么后缀听起来适合它?请求管理员?请求映射器?请求工厂?这取决于你想做什么。由于这两种方法都返回void,RequestFactory
听起来不太正确。我想,我会选择RequestManager
,但您知道自己的代码:)。我决定将实例方法命名为宿主类RequestInternal,并将其放入静态请求中。谢谢你的第一句话错了。C#当然不允许通过实例引用调用静态方法。您可能对一些涉及消除C#中静态方法与实例方法的歧义的设计决策感兴趣。这些规则看起来有点奇怪,但实际上它们是精心设计的。我最近写了一篇关于这个话题的文章:@Eric Lippert你好,Eric。非常感谢你的链接!我得到了很多新信息。顺便说一句,我正在读你的博客(由盖达尔翻译成俄语)