Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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#_Oop_Static - Fatal编程技术网

C#-全局程序对象 脚本

C#-全局程序对象 脚本,c#,oop,static,C#,Oop,Static,我有一个围绕Log4Net的非静态类。这真的很方便,因为它可以连接到我拥有的另一个应用程序,该应用程序显示我编写的各种软件中发生的不同进程的日志(让我可以查看错误发生的位置、批处理失败的位置等) 问题 这一切都很好,但如果我想记录整个过程,我必须做一系列的事情: 实例化日志对象 告诉它开始 原木 叫它停下来 这意味着,如果一个进程在类之外运行,我必须处理如何传递日志对象,这是一件痛苦的事情,而且看起来很混乱 问题: 我怎么能以一种所有类都可以全局访问的方式来声明对象……而使其成为静态并不是一个真

我有一个围绕Log4Net的非静态类。这真的很方便,因为它可以连接到我拥有的另一个应用程序,该应用程序显示我编写的各种软件中发生的不同进程的日志(让我可以查看错误发生的位置、批处理失败的位置等)

问题 这一切都很好,但如果我想记录整个过程,我必须做一系列的事情:

  • 实例化日志对象
  • 告诉它开始
  • 原木
  • 叫它停下来
  • 这意味着,如果一个进程在类之外运行,我必须处理如何传递日志对象,这是一件痛苦的事情,而且看起来很混乱

    问题: 我怎么能以一种所有类都可以全局访问的方式来声明对象……而使其成为静态并不是一个真正的选项,我不认为

    …这可能是浪费时间,但我喜欢意见。

    听起来你想要一份工作


    您可以创建一个返回类的单个实例的静态属性。

    为什么您认为不能将“it”设置为静态?我怀疑您混淆了静态类和维护对非静态类实例的引用的静态变量的概念

    public class Foo
    {
        // Instantiate here, or somewhere else
        private static LogWrapper logWrapper = new LogWrapper(...); 
        public static LogWrapper LogWrapper { get { return logWrapper; } }
    }
    
    仅仅因为类是非静态的,并不意味着你不能拥有一个全局可用的单例实例。通常这不是一个好主意,但对于日志记录来说也不算太坏


    如果你按单路径运行,你可能想考虑阅读我的文章.< /p> ,而不是沿着静态路径或单路径,可以使用(i)用。这将使您的类保持可测试性,并将它们与日志类分离

    IoC容器将为您处理生命周期管理;通过指定容器生存期,您可以模拟没有任何缺点的单例

    有一个学习曲线,但它是值得的;DI还有许多其他优点


    编辑:诀窍是避免服务定位器陷阱。有一些关于这方面的好文章(还有一本书即将出版)。

    我认为他的意思是使整个类保持静态。@Slaks:我的观点是他不必这样做。区分静态类和具有全局可用实例的非静态类很重要。(这并不意味着它必须是单身,但它可能是。)我意识到这一点;这也是我的观点。然而,从你的第一行听起来,你可能误解了他。为什么不让包装器成为静态的选项呢?这正是静态类有意义的情况。