【问题标题】:Declaring a static object from inside its own class从自己的类中声明一个静态对象
【发布时间】:2018-09-14 00:35:54
【问题描述】:

您好,我有一些代码使用 Manager 的静态对象从 Manager 调用方法:

public class Manager
{
    public static Manager sManager = new Manager();
    public int x;

    public Manager()
    {  
    }


    public void Modify()
    {
        x ++;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Manager.sManager.x);
        Manager.sManager.Modify();
        Console.WriteLine(Manager.sManager.x);
        Console.ReadLine();
    }
}

这是从外部访问 Manager 方法的好方法吗,或者如果类 Manager 必须拥有方法 Modify,是否有更好的方法。

在这种情况下使用事件是构建它并让 Manager 监听更新的更好方法吗?

或者即使我希望 Modify 方法保留在 Manager 类中,是否有更好的方法来处理这个问题?

【问题讨论】:

  • 这让我印象深刻,好像您应该在需要它的外部实例化 Manager 的实例,或者将整个类和所有方法/属性设为静态(如果可行,我不知道申请)
  • 我不明白你想要完成什么。我同意@JamesHughes 的观点,简单地实例化Manager 就足够了。
  • 我可能错了,但我看到不少 Java 开发人员这样做。我不明白为什么这会有好处。如果你想这样做,你也可以将类定义为静态的。
  • 看起来已经完成了一半Singleton pattern
  • 对于真正的单身人士,您将拥有一个 private 构造函数。否则,您允许创建多个实例。所以这更像是一个 multiton ;)

标签: c# oop static


【解决方案1】:

这取决于您要构建的架构。

让一切静止

如果就这么简单,只需将xModify 设为静态,就不需要实例了。

使用单例模式

如果您确实需要一个 Manager 实例,您的代码最好使用单例模式

private static Manager _manager;

public static Manager Manager
{
   get 
   {
      if (_manager == null)
      {
         _manager = new Manager();
      }
      return instance;
   }
}

【讨论】:

    【解决方案2】:

    这里没有理由在Manager 类中创建相同类型的静态字段。您只需要创建一个对象,然后调用所需的方法。

    更好的办法是把字段设为私有,直接暴露读取,这样就不能直接修改了,我们只需要调用modify()方法修改即可:

    public class Manager
    {
    
      private int x;
    
      public int X
      {
        get
        {
           return x;
        }
      }
    
      public Manager()
      {  
      }
    
    
      public void Modify()
      {
          x++;
      }
    } 
    

    然后在你的 Program 类中使用它:

    class Program
    {
        static void Main(string[] args)
        {
            Manager objManager = new  Manager();
            Console.WriteLine(objManager.X);
    
            objManager.Modify();
    
            Console.WriteLine(objManager.X);
            Console.ReadLine();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 1970-01-01
      • 2013-01-28
      • 2017-07-17
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2012-04-22
      相关资源
      最近更新 更多