Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何避免';呼叫不明确…';在C#中写入静态和非静态方法时出错?_C#_.net_Static_Thread Safety - Fatal编程技术网

我如何避免';呼叫不明确…';在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。非常感谢你的链接!我得到了很多新信息。顺便说一句,我正在读你的博客(由盖达尔翻译成俄语)