C#类中的静态实例变量

时间:2018-08-12 17:38:43

标签: c#

我正在尝试自学C#。从我正在使用的书中,我创建了一个Color类和一个Ball类。以下是相关代码:

iBeacon

这将创建Color类,并允许我为我们习惯于使用Color构造函数的标准RGB光谱分配值。

然后我在Color类中也有一个名为GetRed()的方法,该方法返回在构造函数中创建颜色时为Red设置的值。

iBeacon

最后,我还有一个名为Ball的类,在这里我声明一个实例变量color1以从Color类中获取Red值。

public class Color
{
    public int Red;
    public int Blue;
    public int Green;
    public int Alpha;

    public Color(int red, int blue, int green, int alpha)
    {
        this.Red = red;
        this.Blue = blue;
        this.Green = green;
        this.Alpha = alpha;
    }
  }

我在Ball类中使用color1声明得到的错误是public int GetRed() { return Red; } 。 Visual Studio建议的解决方案是在变量声明中引用名称空间和类,因此在我的情况下,class Ball { public int color1 = Color.GetRed(); }  并将我在An object reference is required for the non-static field, method, or property "Color.GetRed()"类和public int color1 = Hello_World.Color.GetRed()方法中创建的颜色变量设为静态。这解决了我的问题,但是我想知道是否还有另一种方法可以解决此问题,而不必将变量或方法设为静态。很抱歉,如果我不能很好地解释这一点。我只是从C#开始,所以如果您需要澄清,请在回复中告诉我。谢谢。

2 个答案:

答案 0 :(得分:0)

public int color1 = Color.GetRed(); <-从Color类访问静态方法。

public int color1 = new Color()。GetRed(); <-从类Color的实例访问实例方法。

public class Ball
{
    private Color _color;

    public Ball(Color color)
    {
        _color = color;
    }

    public int GetColorRedValue()
    {
        return _color.GetRed();
    }
}

var color = new Color();
var ball = new Ball(color);

Console.WriteLine(ball.GetColorRedValue()); <- print red color value

答案 1 :(得分:0)

您应该真正创建一个MCVE。没有一个,我们只能猜测。所以我想这就是你的书要你做的:

class Color
{
   // ...
}

class Ball
{
    Color SurfaceColor = new Color(/*...*/);
}

好吧,哎呀,为什么不呢,让我们多加努力。这是我实现Color-Ball模型的方式:

public static class Colors
{   
    public static readonly Color Red   = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue  = new Color(0, 0, 255);

    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Black = new Color(0, 0, 0);
}

public class Color
{
    public int R;
    public int G;
    public int B;

    public Color() : this(Colors.Black) {}

    public Color(Color other) : this(other.R, other.G, other.B) {}

    public Color(int red, int green, int blue)
    {
        R = red;
        G = blue;
        B = blue;
    }
}

public class Ball
{
    public Color SurfaceColor { get; private set; }

    public Ball(Color surfaceColor)
    {
        SurfaceColor = surfaceColor;
    }
}

public class Program
{
    public static void Main()
    {
        Ball blueBall /* huh */ = new Ball(Colors.Blue);
        Ball redBall            = new Ball(Colors.Red);
        Ball maroonBall         = new Ball(new Color(128, 0, 0));
    }
}