【问题标题】:Preferred way of accessing variables from WPF App class从 WPF App 类访问变量的首选方式
【发布时间】:2020-11-26 16:29:09
【问题描述】:

在下面的代码中,我声明了应用程序级别static 变量,然后从MainWindow.xaml.cs 访问它。应该避免在此处使用静态变量,而是首先在下面的MainWindow.xaml.cs 代码中实例化App class,并将那里的变量用作var app = Application.Current as App; app.myVariable = "Some Value";。我在某些地方(例如here)读到generally 我们应该避免使用静态变量。

App.xaml.cs

public partial class App : Application
{
    private static string myVarialbe {get; set;}
    ...........
}

MainWindow.xaml.cs

public partial class MainWindow : Window
{
  ..........
  private void btnUserUpdate_Click(object sender, RoutedEventArgs e)
  {
    App.myVariable = "Some value";
    ......
  }
}

【问题讨论】:

  • 您引用的帖子Using Static method and variables - Good vs Bad 已经有了答案。您定义了一个属性,而不是一个字段。所以,一切都好。如果需要,您可以添加同步。
  • @Jackdaw 是的,在该链接帖子的答案中,当我阅读it seems like you are abusing the static keyword slightly 这句话时,我看到一个黄色(如果不是红色)灯在闪烁。但是你的观点很好——我忘了​​注意到 OP 正在使用字段(而不是属性)。

标签: c# wpf


【解决方案1】:

由于App 不是静态类,并且该类的实例已经可以通过静态Application.Current 属性访问,因此无需将其任何属性声明为静态。

相反,声明非静态属性,如

public partial class App : Application
{
    public string MyProperty { get; set; }
    ...
}

并像这样访问它们:

((App)Application.Current).MyProperty = "Some value";

请注意,您应该避免使用as 运算符而不检查null 的结果,例如

var app = Application.Current as App;
app.MyProperty = "Some Value";

因为这会导致 NullReferenceException 而不是 InvalidCastException,这是您在强制转换操作失败时真正想要得到的。

as 可能有效返回 null 的潜在情况下,对其进行测试:

var app = Application.Current as App;
if (app != null)
{
    app.MyProperty = "Some Value";
}

【讨论】:

  • 这成功了(谢谢):instance of App class is already accessible via the static Application.Current property。无需将myVariable 声明为静态属性
【解决方案2】:

作为 Clemens 答案的补充,我更喜欢以下方式:

public partial class App : Application
{
    public static App Me => ((App) Application.Current);

    public string MyProperty1 { get; set; }
    public int MyProperty2 { get; set; }
    public void DoSomething() { }
    ...
}

这样你就不必到处写铸造的东西了。您现在可以简单地编写如下代码:

App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

【讨论】:

  • 感谢您分享您的知识(我的赞成票)-我也应该尝试您的建议。您的建议有助于避免在多个地方投射内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多