如何声明要在几种方法中使用的变量?

时间:2019-03-02 04:40:47

标签: c#

我对C#编程(以及一般编程)还是比较陌生的。我想在两种不同的方法中使用变量,我以为我需要在类内部声明变量,但我不断收到此错误消息“ 错误:字段初始化器无法引用非静态字段方法,或属性 ”。我确信这是相对简单的错误,但是如何解决?

经过一段时间的在线研究,我认为我在理解课堂上的正确轨道上,但是我显然缺乏理解。`

public partial class MainPage : ContentPage
{

     public string path = diceNumber.SelectedItem.ToString();

    public MainPage()
    {
        InitializeComponent();

    }

    private void DiceRollResult_Clicked(object sender, EventArgs e)
    {
        if (path == "One")
        {
            DisplayAlert("One", "You Lost", "Close");
        }
        else if (path=="Two")
        {
            DisplayAlert("Two", "You Lost", "Close");
        }
        else if (path == "Three")
        {
            DisplayAlert("Three", "You Won", "Close");
        }

// else if语句只是为了向您展示我如何使用代码。

3 个答案:

答案 0 :(得分:3)

一些要在这里理解的东西:

  1. 如果将值分配给类级变量,则该值将在该类的任何其他部分之前执行。因此diceNumber.SelectedItem在初始化path时甚至不存在。这就是导致您出错的原因。您只能使用静态字段或值来分配给类级变量进行初始化(因为静态成员不需要实例)。
  2. 这就是您犯的逻辑错误。即使可以在启动时将diceNumber.SelectedItem分配给变量,您也可能不想这样做,因为那样的话,它只会在启动时执行一次。您实际上想要执行的操作是在单击时检查当前选择的值,然后做出相应的响应。因此,您应该将路径变量移到点击处理程序中,因为我看不到您在其他任何地方都在使用它。
  3. 最后,如果您也需要在其他函数中访问此值,则可以在这些函数中创建局部变量,如下所示:

    string path = diceNumber.SelectedItem.ToString();
    

    在需要此功能的所有功能中。不需要全局变量。

  4. 本质上,diceNumber(可能是UI控件)本身是全局类级变量。因此,它将完成您的path变量为您所做的所有工作。不确定是WinForms还是WPF还是其他,但是您始终可以在后面的代码中看到这些UI控件的声明为类级变量。

答案 1 :(得分:0)

这似乎是Xamarin.Forms应用程序,在几种通常使用类并在程序生命周期中实例化该类的方法中使用变量不是一个好习惯。

答案 2 :(得分:0)

您可以通过将其设为静态变量来访问任何其他类或表单中的变量。

public static string path = diceNumber.SelectedItem.ToString();

现在,在任何类或任何方法中,您都可以通过以下方式访问变量:     var s = MainPage.path;

始终通过类名称而不是实例名称访问静态成员。无论创建多少个类实例,静态成员只有一个副本。静态方法和属性无法访问其包含类型的非静态字段和事件,并且除非在方法参数中显式传递了对象的实例变量,否则它们将无法访问该对象的实例变量。