改变方法中的属性
Mutating properties in methods
我有这些属性:
private float colorR;
private float colorG;
private float colorB;
public static float defaultInc = 0.001f;
private float addR = defaultInc;
private float addG = defaultInc;
private float addB = defaultInc;
在我的更新方法中,我正在执行以下操作:
void Update()
{
if (colorR + addR > 1.0f) {
addR = addR * -1;
} else if (colorR + addR < 0.0f) {
addR = defaultInc;
}
colorR += addR;
if (colorG + addG > 1.0f) {
addG = addG * -1;
} else if (colorG + addG < 0.0f) {
addG = defaultInc;
}
colorG += addG;
if (colorB + addB > 1.0f) {
addB = addB * -1;
} else if (colorB + addB < 0.0f) {
addB = defaultInc;
}
colorB += addB;
setColor();
}
如您所见,我对 6 个不同的属性执行了 3 次相同的计算。我的问题是,我如何重构它以便它使用一种或两种方法来更新属性,而不是重复我自己。我尝试将属性传递给一个方法并在那里改变它们,但是方法范围阻止了它。
您可以使用 ref
:
通过引用传递
void Update(ref float color, ref float add)
{
if (color + add > 1.0f)
{
add = add * -1;
}
else if (color + add < 0.0f)
{
add = defaultInc;
}
color += add;
}
void Update()
{
Update(ref colorR, ref addR);
Update(ref colorG, ref addG);
Update(ref colorB, ref addB);
}
因为每个字段都是通过引用传递的,所以该方法可以直接更新它们。
我有这些属性:
private float colorR;
private float colorG;
private float colorB;
public static float defaultInc = 0.001f;
private float addR = defaultInc;
private float addG = defaultInc;
private float addB = defaultInc;
在我的更新方法中,我正在执行以下操作:
void Update()
{
if (colorR + addR > 1.0f) {
addR = addR * -1;
} else if (colorR + addR < 0.0f) {
addR = defaultInc;
}
colorR += addR;
if (colorG + addG > 1.0f) {
addG = addG * -1;
} else if (colorG + addG < 0.0f) {
addG = defaultInc;
}
colorG += addG;
if (colorB + addB > 1.0f) {
addB = addB * -1;
} else if (colorB + addB < 0.0f) {
addB = defaultInc;
}
colorB += addB;
setColor();
}
如您所见,我对 6 个不同的属性执行了 3 次相同的计算。我的问题是,我如何重构它以便它使用一种或两种方法来更新属性,而不是重复我自己。我尝试将属性传递给一个方法并在那里改变它们,但是方法范围阻止了它。
您可以使用 ref
:
void Update(ref float color, ref float add)
{
if (color + add > 1.0f)
{
add = add * -1;
}
else if (color + add < 0.0f)
{
add = defaultInc;
}
color += add;
}
void Update()
{
Update(ref colorR, ref addR);
Update(ref colorG, ref addG);
Update(ref colorB, ref addB);
}
因为每个字段都是通过引用传递的,所以该方法可以直接更新它们。