我们何时以及如何使用“set”和“get”方法?

时间:2016-05-08 17:12:10

标签: c# constructor get set

我不确定我应该使用set和get方法。我的混淆来自于我现在正在阅读的这个例子。 我们应该制作一个程序,制作几个球并抛出它们并打印投掷数量。

此程序包含两个公共“颜色”和“Ball”。 颜色类决定球的颜色,球类决定球的大小。

其颜色类:

public class Colors
{
    private byte red;
    private byte green;
    private byte blue;
    private byte alpha;

    public Colors(byte red, byte green, byte blue, byte alpha)
    {
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.alpha = alpha;
    }

    public Colors(byte red, byte green, byte blue)
    {
        this.red = red;
        this.green = green;
        this.blue = blue;
        this.alpha = 255;
    }

    public byte GetRed()
    {
        return red;
    }

    public void SetRed(byte red)
    {
        this.red = red;
    }

    public byte GetGreen()
    {
        return green;
    }

    public void SetGreen(byte green)
    {
        this.green = green;
    }

    public byte GetBlue()
    {
        return red;
    }

    public void SetBlue(byte blue)
    {
        this.blue = blue;
    }

    public byte GetAlpha()
    {
        return alpha;
    }

    public void SetAlpha(byte alpha)
    {
        this.alpha = alpha;
    }

    public byte Grayscale(byte red ,byte green, byte blue)
    {
       return (byte)((red + blue + green) / 3);
    }
}

这是球类

public class Ball
{
    private float radius;
    private int timesThrown;

    public Ball(Color color, float radius)
    {
        this.color = color;
        this.radius = radius;
        this.timesThrown = 0;
    }

    public void Pop()
    {
        radius = 0;
    }

    public void Throw()
    {
        if (radius > 0)
        {
            timesThrown++;
        }
    }

    public int GetTimesThrown()
    {
        return timesThrown;
    }
}

我的问题是为什么我们应该在第一个例子中使用“set”和“get”方法? 是不是构造函数足够? 为什么我们没有使用set和get in ball class?例如对于radius?

4 个答案:

答案 0 :(得分:3)

首先,您可以使用属性替换GetXXXSetXXX方法,因为方法通常用于执行某种类型的函数。

public byte Alpha { get; set; }

通过构造函数设置属性是将对象设置为预定义状态的好方法。但是,如果您需要在初始化后更新属性,该怎么办?您需要调用属性集方法

答案 1 :(得分:2)

看来你刚开始学习面向对象的设计,而C#完全是面向对象的。当学生问我为什么使用get \ set时(访问器和mutator是get和set 的正式定义),他们过去常常提供控制使用这些变量。

例如:

您正在商店工作并可以访问帐户机器。您可以继续付款。因此,您要对 INCOMES 的变量进行GET。但您不是帐户主管,因此您可以设置与 TAX_RATIO 相关的变量。

或者如果某人付款你想通知经理,那么你可以在调用GET时实现另一种方法。看:

public double PaymentSumm { get { InformManagerCodeHere() } private set; }

get \ set的主要目的是提供对访问\更改级别的使用和控制的控制。

答案 2 :(得分:0)

使用getter和setter的各种好处主要是“架构”的观点,特别是当你想稍后对代码进行一些更改时。您可以参考此链接获取好处:Why use getters and setters?

半径设置为私有,没有任何getter或setter来更改/读取它,因为开发人员认为它不应该暴露给其他类。

答案 3 :(得分:0)

举例说如果混淆我必须承认。 以下是一些原因

与获取或设置属性相关联的行为的封装 - 这允许稍后更容易添加其他功能(如验证)。

在使用替代表示公开属性的同时隐藏属性的内部表示。

保护您的公共接口免受更改 - 允许公共接口在实施更改时保持不变,而不会影响现有的使用者。

控制属性的生命周期和内存管理(处置)语义 - 在非托管内存环境(如C ++或Objective-C)中尤为重要。

getter和setter可以允许不同的访问级别 - 例如get可以是公共的,但是该set可以受到保护。

如何使用它们以及为什么

假设您有物品价格

Class item
    {
     private int price=50;

         public int getprice()
        {
         return price; // you can use this fuction to retrieve the price of any item throughout your program
        }

        public int setprice(int newprice)
        {
         price newprice; // you can use this fuction set a new value to the price whenever you want. As you can see in start the price of item is 50 if you want to change it late you can simply call a function and set it. 
        }
}

Getters和Setter提供了一个封装环境,用户无法直接访问类的私有成员,但他们必须遵循特定的路径(由您定义),并且必须遵循一些限制。就像在setter中一样,他们只能设置一个整数值。