C# “获取/设置错误”;非静态字段需要对象引用……”;

C# “获取/设置错误”;非静态字段需要对象引用……”;,c#,C#,我收到一条错误消息“非静态字段、方法或属性……需要对象引用”,用于调用刷新函数: //地位 public static string Status { get { return status; } set { status = value; Refresh(); } } p

我收到一条错误消息“非静态字段、方法或属性……需要对象引用”,用于调用刷新函数:

//地位

    public static string Status 
    {
        get 
          { 
              return status; 
          }
        set 
        {
            status = value;
            Refresh();
        } 
    }

    private void Refresh()
    {
        lblStatus.Text = Status.ToString();
    }

只能从静态函数调用静态函数

应该是

public static string Status 
{
    get 
    { 
       return status; 
    }
    set 
    {
        status = value;
        Refresh();
    } 
}

private static void Refresh()  // Change signature of function
{
    lblStatus.Text = Status.ToString();
}

使属性非静态

public string Status // Change signature of property 
{
    get 
    { 
       return status; 
    }
    set 
    {
        status = value;
        Refresh();
    } 
}

private void Refresh()
{
    lblStatus.Text = Status.ToString();
}

只能从静态函数调用静态函数

应该是

public static string Status 
{
    get 
    { 
       return status; 
    }
    set 
    {
        status = value;
        Refresh();
    } 
}

private static void Refresh()  // Change signature of function
{
    lblStatus.Text = Status.ToString();
}

使属性非静态

public string Status // Change signature of property 
{
    get 
    { 
       return status; 
    }
    set 
    {
        status = value;
        Refresh();
    } 
}

private void Refresh()
{
    lblStatus.Text = Status.ToString();
}

只需将状态属性设置为非静态即可。显然,您并没有在该类的所有实例中共享此属性。看起来您正在使用控件或页面类,并且尝试调用其他实例方法或属性

因此,这将修复编译错误

public string Status 
....

只需将状态属性设置为非静态即可。显然,您并没有在该类的所有实例中共享此属性。看起来您正在使用控件或页面类,并且尝试调用其他实例方法或属性

因此,这将修复编译错误

public string Status 
....

我认为这是一个糟糕的设计,因为lblStatus是一个控件,所以它不能是静态的,所以刷新不能是静态的


因此,无论如何都不应该在静态上下文中调用Refresh()。

我认为这是一个糟糕的设计,因为lblStatus是一个控件,所以它不能是静态的,所以刷新不能是静态的


因此,无论如何都不应该在静态上下文中调用Refresh()。

这是一个糟糕的设计。您应该从状态中删除static

您试图做的是从静态属性设置实例值

只能从静态属性/方法修改静态字段/属性

如果您坚持状态必须是静态的,那么您必须创建另一个静态属性/字段,并通过该字段进行更新。(然而,这是非常糟糕的)

例如: 假设状态在类Form1中定义,并且只有一个Form1实例

    Class Form1
    {
        private static Form1 staticInstance = default(Form1);
        Form1()
            {
            staticInstance  = this;
            }
        public static string Status 
        {
            get 
            { 
            return status; 
            }
            set 
            {
                status = value;
                Refresh();
            } 
        }

        private static void Refresh()  // Change signature of function
        {
            if(staticInstance  != default(Form1)
            staticInstance .lblStatus.Text = Status.ToString();
        }

    }

这是一个糟糕的设计。您应该从状态中删除static

您试图做的是从静态属性设置实例值

只能从静态属性/方法修改静态字段/属性

如果您坚持状态必须是静态的,那么您必须创建另一个静态属性/字段,并通过该字段进行更新。(然而,这是非常糟糕的)

例如: 假设状态在类Form1中定义,并且只有一个Form1实例

    Class Form1
    {
        private static Form1 staticInstance = default(Form1);
        Form1()
            {
            staticInstance  = this;
            }
        public static string Status 
        {
            get 
            { 
            return status; 
            }
            set 
            {
                status = value;
                Refresh();
            } 
        }

        private static void Refresh()  // Change signature of function
        {
            if(staticInstance  != default(Form1)
            staticInstance .lblStatus.Text = Status.ToString();
        }

    }


是的,
Refresh
不是静态的,因此必须在对象实例上调用它error@JonB:这不是一个例外,这是一个编译时错误-而且非常明显…是的,
Refresh
不是静态的,因此,必须在对象实例上调用它。您正在从静态调用非静态方法…因此error@JonB:这不是一个例外,这是一个编译时错误-而且很明显…@Cicada:Made
Refresh Static
当我将函数更改为Static时,lblStatus会给我同样的错误。@KelvinFixx:为什么要使属性为静态?这是个坏习惯。像我的第二个代码段(编辑)一样,将属性和函数都设置为非静态。@Cicada:Made
Refresh static
当我将函数更改为静态时,lblStatus将给出相同的错误。@KelvinFixx:为什么要将属性设置为静态?这是个坏习惯。使您的属性和函数都像我的第二个代码段(编辑)一样非静态。我想在状态更改时刷新LBL状态。然后。。。您应该删除Status属性上的static关键字!我想在状态更改时刷新LBL状态。然后。。。您应该删除Status属性上的static关键字<代码>(这是非常糟糕的)。,你能给我提供一些链接说这是糟糕的吗?这是IMHO。为什么->创建staticInstance只是为了保持静态状态。在实例修改中使用statics是没有错误的,直到它按照要求进行,并且使用了适当的保护措施来处理同步化。是的,没错,因为我对我的一个membership profiler类使用了静态属性。因此,这取决于需求。我只是想弄清楚这到底是真的不好还是什么。对不起,我不清楚,我的意见只是针对这个问题。如果静态数据真的很糟糕,它们一开始就不会出现在语言规范中。
(但这很糟糕)。
,你能提供一些链接告诉我这很糟糕吗?这是IMHO。为什么->创建staticInstance只是为了保持静态状态。在实例修改中使用statics是没有错误的,直到它按照要求进行,并且使用了适当的保护措施来处理同步化。是的,没错,因为我对我的一个membership profiler类使用了静态属性。因此,这取决于需求。我只是想弄清楚这到底是真的不好还是什么。对不起,我不清楚,我的意见只是针对这个问题。如果static真的很糟糕,那么它们一开始就不会出现在语言规范中。