C# 从WPF应用程序类访问变量的首选方法

C# 从WPF应用程序类访问变量的首选方法,c#,wpf,C#,Wpf,在下面的代码中,我声明了应用程序级别静态变量,然后从MainWindow.xaml.cs访问它。应避免在此处使用静态变量,而是首先在main window.xaml.cs下面的代码中实例化App类,并将其中的变量用作var App=Application.Current as App;app.myVariable=“某些值”。我在一些地方(比如)读到,通常我们应该避免使用静态变量 App.xaml.cs: public partial class App : Application {

在下面的代码中,我声明了应用程序级别
静态
变量,然后从
MainWindow.xaml.cs
访问它。应避免在此处使用静态变量,而是首先在
main window.xaml.cs
下面的代码中实例化
App类
,并将其中的变量用作
var App=Application.Current as App;app.myVariable=“某些值”。我在一些地方(比如)读到,
通常
我们应该避免使用静态变量

App.xaml.cs

public partial class App : Application
{
    private static string myVarialbe {get; set;}
    ...........
}
public partial class MainWindow : Window
{
  ..........
  private void btnUserUpdate_Click(object sender, RoutedEventArgs e)
  {
    App.myVariable = "Some value";
    ......
  }
}
main window.xaml.cs

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

由于
App
不是静态类,并且该类的实例已经可以通过静态
应用程序访问。当前的
属性不需要声明其任何静态属性

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

public partial class App : Application
{
    public string MyProperty { get; set; }
    ...
}
然后像这样访问它们:

((App)Application.Current).MyProperty = "Some value";
App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

需要注意的是,在没有检查
null
结果的情况下,应该避免使用
As
运算符,如

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";
}

由于
App
不是静态类,并且该类的实例已经可以通过静态
应用程序访问。当前的
属性不需要声明其任何静态属性

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

public partial class App : Application
{
    public string MyProperty { get; set; }
    ...
}
然后像这样访问它们:

((App)Application.Current).MyProperty = "Some value";
App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

需要注意的是,在没有检查
null
结果的情况下,应该避免使用
As
运算符,如

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";
}

作为对克莱门斯答案的补充,我更喜欢以下方式:

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)Application.Current).MyProperty = "Some value";
App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

作为对克莱门斯答案的补充,我更喜欢以下方式:

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)Application.Current).MyProperty = "Some value";
App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

你引用的帖子已经有答案了。您定义了一个属性,而不是一个文件。所以,一切都好。如果需要的话,你可以添加同步。@Jackdaw是的,在那篇链接文章的答案中,当我读到句子
时,你似乎稍微滥用了static关键字,我看到一个黄色(如果不是红色的话)灯在闪烁。但是你的观点是正确的-我忘了注意到OP使用的是字段(而不是属性)。你引用的帖子已经有答案了。您定义了一个属性,而不是一个文件。所以,一切都好。如果需要的话,你可以添加同步。@Jackdaw是的,在那篇链接文章的答案中,当我读到句子
时,你似乎稍微滥用了static关键字,我看到一个黄色(如果不是红色的话)灯在闪烁。但是你的观点是正确的-我忘了注意到OP正在使用字段(而不是属性)。谢谢你分享你的知识(我的投票)-我也应该试试你的建议。你的建议有助于避免在多个地方投掷物品。谢谢你分享你的知识(我的投票)-我也应该试试你的建议。您的建议有助于避免在多个位置强制转换内容。这就成功了(谢谢):
应用程序类的实例已经可以通过静态应用程序访问。当前属性
。无需将
myVariable
声明为静态属性这就成功了(谢谢):
应用程序类的实例已经可以通过静态应用程序访问。当前属性
。无需将
myVariable
声明为静态属性