C# 静态成员不能通过实例引用进行访问。

27 浏览
0 Comments

C# 静态成员不能通过实例引用进行访问。

首先,请在得出结论之前仔细阅读问题,确认它不是成员 \'\' 无法通过实例引用访问的重复问题。\n现在,我的问题不同,因为我的静态成员是另一个类:\n

using System;
public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { Console.WriteLine("Driving"); }
    // public static event bool RunOutOfGas;
    // Other non-static fields and properties...
}
class SimpleClass
{
    // 需要在运行时初始化的静态变量。
    static readonly long baseline;
    public static Automobile A1;
    // 静态构造函数最多只会在任何实例构造函数被调用或成员被访问之前调用一次。
    static SimpleClass()
    {
        baseline = DateTime.Now.Ticks;
        A1 = new Automobile();
    }
}
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Automobile");
        Automobile.Drive();
        Console.WriteLine(Automobile.NumberOfWheels);
        Console.WriteLine("SimpleClass");
        Console.WriteLine(SimpleClass.A1.NumberOfWheels);
        Console.WriteLine(SimpleClass.Automobile.NumberOfWheels);
    }
}

\n无论是SimpleClass.A1.NumberOfWheels还是SimpleClass.Automobile.NumberOfWheels(甚至是SimpleClass.NumberOfWheels),都会给我报错。\n如何在SimpleClass下访问A1.NumberOfWheels?\n结论:因此,如果使用静态类而不是C#的简单类型,将无法在根类(SimpleClass)下访问其静态成员(A1.NumberOfWheels),因为受限于C#静态成员访问规则的限制。我提出这个问题是因为我认为这是一个明显的设计缺陷,然而,没有人解决这个具体问题,并迅速将其搁置一边。\n

\n也许更大的问题就是:你究竟想做什么?\n

\n@RufusL,好问题。我对静态变量或其目的的理解是,在所有类对象之间共享一个真理集中点。用一个非常简单的例子来解释,假设我有一堆单位数乘法器对象,它们负责计算两个单位数的倍数。最快的方法不是每次都计算,而是在它们的静态变量中存储一个二维单位数乘法表,因此不需要实际计算,只需要查找。这将极大地提高性能。
\n现在,\n

    \n

  • 这样的静态变量只能是C#预定义的简单类型,而不能是我自定义的类型,并没有太多意义。
  • \n

  • 这样的静态变量在一个类内只能是一级深度,不能再深入。
  • \n

0
0 Comments

C#中的静态成员不能通过实例引用来访问,这是因为静态成员是属于类本身的,而不是类的实例。静态成员在类的所有实例之间共享,可以通过类名直接访问。

在给定的代码示例中,A1可能是SimpleClass的一个静态成员,但是这个静态成员仍然是对Automobile类型的特定实例的引用。如果需要访问A1.NumberOfWheels,可能NumberOfWheels属性不应该是静态的。

解决这个问题的方法是将NumberOfWheels属性改为实例属性,而不是静态属性。这样就可以通过实例引用来访问NumberOfWheels属性。

以下是修改后的示例代码:

public class SimpleClass
{
    public Automobile A1 { get; set; }
    public SimpleClass()
    {
        A1 = new Automobile();
    }
}
public class Automobile
{
    public int NumberOfWheels { get; set; }
}

这样,就可以通过实例引用SimpleClass.A1来访问A1.NumberOfWheels属性。

需要注意的是,如果NumberOfWheels属性需要在类的所有实例之间共享,那么它应该仍然是静态的。但是,访问静态成员时仍然需要使用类名来引用,而不能使用实例引用。

0
0 Comments

C#中出现(C# Static Members cannot be accessed with an instance reference)错误的原因是尝试通过实例访问静态字段。解决方法是通过类名直接访问静态成员。

在C#中,如果我们有一个类SimpleClass,并且该类有一个静态字段NumberOfWheels,我们可以通过类名直接访问该字段,如SimpleClass.NumberOfWheels。然而,如果我们试图通过实例来访问静态字段,如SimpleClass.A1.NumberOfWheels,将会出现错误。

这是因为A1是一个实例,我们不能通过实例来访问静态成员。静态成员是属于类本身的,而不是类的实例。因此,我们只能通过类名来访问静态成员。

另外,如果我们尝试使用错误的名称来访问静态成员,也会出现错误。例如,如果我们尝试使用SimpleClass.Automobil.NumberOfWheels来访问静态字段,会得到错误提示,因为SimpleClass中没有声明名为Automobil的公共静态成员。

因此,正确的访问静态成员的方法是直接使用类名,如SimpleClass.Automobile.NumberOfWheels。

总结起来,C#中的静态成员不能通过实例来访问,只能通过类名来访问。当我们尝试通过实例来访问静态成员或使用错误的名称访问静态成员时,就会出现(C# Static Members cannot be accessed with an instance reference)错误。要解决这个问题,我们需要直接使用类名来访问静态成员。

0