函数修改传递的参数,不应该

时间:2016-10-25 18:51:03

标签: c# .net

我正在尝试编写一个用于创建素因子列表的函数。为此 - 我正在使用递归函数。 以下是电话:

    private int Problem003()
    {
        //The prime factors of 13195 are 5, 7, 13 and 29.
        //What is the largest prime factor of the number 600851475143 ?

        return GeneratePrimeFactorsList(15).Last();
    }

    private List<int> GeneratePrimeFactorsList(int n)
    {
        List<int> _primefactors = new List<int>();
        _primefactors.Add(2);

        int i = 3;

        while(i <= n)
        {   
            if (CheckIfIntIsPrime(_primefactors, i))
            {   
                _primefactors.Add(i);
            }

            i=i+2;
        }

        return _primefactors;
    }

    private bool CheckIfIntIsPrime(List<int> _primefactors, int i)
    {   
        if (_primefactors.Count() == 0)
        {   
            return true;
        }
        else
        { 
            if(i % _primefactors.First() != 0)
            {
                _primefactors.Remove(_primefactors.First());
                return CheckIfIntIsPrime(_primefactors, i);
            }
            else
            {   
                return false;
            }
        }
    }

问题在于,当我调用具有bool返回类型的CheckIfIntIsPrime(List,i)时,它会修改List。这意味着,在检查之后 - 传递给GeneratePrimeFactorsList(int)的参数在每次while循环迭代后变为空。

CheckIfPrime函数可以正常工作,但修改传递的参数,当它不应该 - 我不相关它们。

非常奇怪的情况,但我觉得,我错过了一些List属性的知识。

1 个答案:

答案 0 :(得分:1)

An object is a reference type。输入为reference type的所有变量都不包含值本身;它们每个都包含一个引用或指向值(或对象)的指针。即使将变量作为参数传递,也是如此。

接收object参数的函数不能修改变量本身(同样,它只是一个指针)。这意味着它不能使变量指向其他位置。但是,它可以使用指针来获取对象的引用和modify the object itself

如果您想传递一个对象,但又想确保它没有被修改,您可以传递一个clone of it