代码之家  ›  专栏  ›  技术社区  ›  CJM

C:(静态)类级变量

  •  5
  • CJM  · 技术社区  · 14 年前

    这绝对是一个有点难懂的问题,但我的搜索至今还没有为我解决这个问题。

    a希望特定的控制台应用程序存储几个类级变量。在一种情况下,我希望存储一个日志对象的副本,我将在类中的不同位置使用它。在另一种情况下,我希望存储一个简单的类型,实际上是一个in t值,它只在内部使用(不需要是属性)。

    似乎除非我将这些变量指定为静态变量,否则我不能在main()及更高版本中使用它们。

    我对静态对象的理解是,它们的值在对象的所有实例中共享。在正常操作下,我希望他们只是我的应用程序的一个实例,所以这个问题不是问题,但它强调了我对一些相当基本的东西缺乏理解。

    在我的日志对象中,我可以看到一个使其静态化的例子——跨多个实例共享一个日志可能是一个好处。然而,情况可能并非如此……对于我的int,我肯定不希望在实例之间共享它。

    所以…

    • 我是否误解了背后的理论?
    • 是否有其他方法可以声明和使用类级变量?
    • 我应该避免使用它们吗?我可以简单地将值作为参数从一个函数传递到另一个函数,尽管对于没有明显增益的函数来说,这似乎不太有用。

    编辑:好的,消息很清楚——我对静态的理解基本上是正确的,但问题在于结构和方法。谢谢你的回复。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Jordão    14 年前

    只需将应用程序封装到另一个类中,然后在 Main 方法:

    class MyApp {
      private MyLog lol = new MyLog(); 
      private int myInt = 0;
    
      public void Execute() {
        // ...
      }
    }
    
    class Program {
      public static void Main() {
        new MyApp().Execute();
      }
    }
    

    如果需要,您仍然可以将日志字段设置为静态。

        2
  •  3
  •   DJ Quimby    14 年前

    您应该在主函数外部创建一个类,然后从主函数内部创建该类的实例。

    class MyConsoleApp
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
        }
    }
    
    Class MyClass
    {
       private MyLog lol as new MyLog();
       private int myInt = 0;
    }
    
        3
  •  2
  •   Thomas Weller    14 年前

    这里的问题或多或少是纯粹的语法问题:因为静态方法只能访问静态字段,并且 Main() 方法必须是静态的,这要求使用的变量是静态的。永远不要创建myconsoleap类的实例。

    这里没有太多的理论,只有务实的要求…

    托马斯