【问题标题】:How to call a static constructor to reassign the properties to their default?如何调用静态构造函数将属性重新分配为其默认值?
【发布时间】:2017-03-04 21:28:12
【问题描述】:

我有一个Settings 类将设置参数存储为Properties。这个类有其默认的Property 变量,我想随时将它们设置为默认值。我在视频课程中看到过这种用法,但我记不清他是如何做到的。请帮忙。

Settings.cs

class Settings
{
    static Settings()
    {
        SaveDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        Type = ImageFormat.Png;
    }
    public static string SaveDir
    {
        get;
        set;
    }
    public static ImageFormat Type
    {
        get;
        set;
    }
}

Form.cs

Debug.WriteLine(Settings.SaveDir);
Settings.SaveDir = "path_to_another_directory";

Debug.WriteLine(Settings.SaveDir);
//In this line I expect that variables set their default
//but it stays the same
new Settings();

Debug.WriteLine(Settings.SaveDir);

此代码没有按我的预期工作。如何调用 new Settings() 重新分配这些值?

【问题讨论】:

  • 好吧,因为他们是staticstatic 项目的要点是,尽管有实例数量,但只有一个副本。
  • 您不能调用静态构造函数,但是您可以添加一个名为 Reset() 的方法并重新分配初始值
  • 好的,我已经想出将static 访问修饰符更改为public 给出了调用new Settings() 的解决方案。我记错了,视频课中使用了static,所以我强迫自己使用static。对不起这个愚蠢的问题。解决方案比我想象的要简单。 Reset 也是另一种方法。
  • 当心,因为现在您的类不再是静态的,更改属性只会影响该实例。
  • 虽然这确实有效,但这不是最佳解决方案,因为每次您想重置时都会创建一个Settings 对象。这就是为什么最好使用静态Reset() 方法的原因。

标签: c# constructor static


【解决方案1】:

你不能像C# reference中解释的那样调用静态构造函数

不能直接调用静态构造函数

但是没有什么能阻止你编写一个重置初始值的方法

static Reset()
{
    SaveDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    Type = ImageFormat.Png;
}

【讨论】:

    【解决方案2】:

    不要直接在 Settings 的静态构造函数中设置属性,而是尝试用不同的方法进行设置,如下所示:

    class Settings
    {
        static Settings()
        {
            Reset()
        }
        public static void Reset()
        {
            SaveDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            Type = ImageFormat.Png;
        }
        public static string SaveDir
        {
            get;
            set;
        }
        public static ImageFormat Type
        {
            get;
            set;
        }
    }
    

    如果您想重置设置,例如在Form.cs,请致电Settings.Reset()

    【讨论】:

      【解决方案3】:

      首先,您不能称自己为静态构造函数。其次,静态构造函数不能被调用两次。这里有一个MSDN post 关于它。

      那又怎样。

      class Settings
      {
          static Settings()
          {
              LoadDefault();
          }
          public static void LoadDefault()
          {
              SaveDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
              Type = ImageFormat.Png;
          }
          public static string SaveDir
          {
              get;
              set;
          }
          public static ImageFormat Type
          {
              get;
              set;
          }
      }
      

      然后随时随地调用 Settings.LoadDefault()。

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 1970-01-01
        • 2011-02-20
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2020-02-04
        • 1970-01-01
        相关资源
        最近更新 更多