C#拾遗

Posted by WannaTwo on June 28, 2018

List与Vector3.Set()

错误案例

List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));

foreach (Vector3 one in list)
{
	one.Set(1f, 1f, 1f);
}

结果:list = {Vector3(0f, 0f, 0f)}

正确方法

List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));

foreach (Vector3 one in list)
{
	one = new Vecor3(1f, 1f, 1f);
}

原因

此处one是一个getter,是原始值的一份复制,而Set方法只会改变getter的值,并不会改变原始值。同理的还有Unity里的transform.position


List<Vector3>.Contains()

错误案例

List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(0f, 0f, 0f));

bool containsVal = list.Contains(new Vector3(0f, 0f, 0f));

结果:containsVal = false

正确方法

...

public static bool ContainsManially(this List<Vector3> list, Vector3 val)
{
    foreach (Vector3 one in list)
    {
        if (one == val)
           return true;
    }
    return false;
}

bool containsVal = list.ContainsManially(new Vector3(0f, 0f, 0f));

原因

.Contains()使用的是Vector3.Equals(),其实现方法和==的实现方法是不一样的。详见How do I properly use List-Vector3-.Contains()?