Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态属性引用非静态方法_C#_Static Methods - Fatal编程技术网

C# 静态属性引用非静态方法

C# 静态属性引用非静态方法,c#,static-methods,C#,Static Methods,静态属性如何引用非静态方法 例如: public static int UserID { get { return GetUserID(); } } private int GetUserID() { return 1; } public sealed class Singleton { private static readonly Singleton _instance = new Singleton(); private Singleton(

静态属性如何引用非静态方法

例如:

public static int UserID
{
  get
  {
     return GetUserID();
  }
}

private int GetUserID()
{
  return 1;
}
public sealed class Singleton
{
    private static readonly Singleton _instance = new Singleton();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }

    public static int UserID
    {
        get
        {
            return _instance.GetUserID();
        }
    }

    private int GetUserID()
    {
        return 1;
    }

}

当我试图编译这个时,我得到了一个错误:“非静态字段、方法或属性“GetUserID()”需要一个对象引用”

您只需创建一个新实例:

public static int UserID
{
  get
  {
    return new MyClass().GetUserID()     
  }
}
好的,您不必每次调用
UserId
时都创建一个新实例——您可以使用一个包含
MyClass
实例的静态字段(这当然是实现的一种方法)


虽然您可以读取到,您的静态属性正在调用一个可以成为静态的方法,但另一个方法不是静态的。因此,您必须在实例上调用该方法。

您需要以某种方式获取实例。没有实例,就不可能调用实例方法

对于您的情况,您确定需要
GetUserID()
作为实例方法吗?它返回相同的值。或者,如果您的代码只是伪代码,并且您需要在
GetUserID()
中使用更多逻辑,您可以告诉我们您打算做什么吗?

这不起作用

定义静态属性(或静态方法)时,定义的属性适用于类类型,而不是类的实例

另一方面,实例属性和方法处理类的特定构造实例。为了使用它们,您需要对该特定实例进行引用。(不过,反过来也可以。)

例如,考虑水果和一个“Apple”类,假设Apple类有一个实例属性,即此时苹果的成熟度

你不会用“苹果”来描述它的成熟程度,而是用一个特定的“苹果”(实例)。另一方面,你可以有一个苹果实例,并询问它是否包含种子(可能在Apple类本身(静态)上定义)。

简单地说,它不能

如果需要调用静态方法来调用实例方法,可能需要一个单例

试试看:

例如:

public static int UserID
{
  get
  {
     return GetUserID();
  }
}

private int GetUserID()
{
  return 1;
}
public sealed class Singleton
{
    private static readonly Singleton _instance = new Singleton();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }

    public static int UserID
    {
        get
        {
            return _instance.GetUserID();
        }
    }

    private int GetUserID()
    {
        return 1;
    }

}

考虑它的一个简单方法是:非静态方法(或属性,因为属性只是包装好的方法)作为第一个隐藏参数接收对其操作的实例的引用(被调用方法中的“
this
”实例)静态方法没有这样的实例,因此没有任何东西可以作为非静态方法的第一个隐藏参数。

你需要一个很好的理由来这样做……为什么
UserID
是静态的?如果系统中只有一个用户,我会使用单例模式。虽然技术上正确,但我会指出,这通常是一个大红色构建一个新实例只是为了返回一个静态属性值的代码通常是一个真正糟糕的设计缺陷的标志……那么转基因无核苹果呢?