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

本文关键字:参数 不应该 修改 函数 | 更新日期: 2023-09-27 18:14:57

我正在尝试编写一个用于创建素数因子列表的函数。我用的是递归函数。以下是呼叫:

    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;
            }
        }
    }

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

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

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

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

对象是引用类型。所有类型为引用类型的变量都不包含值本身;它们每个都包含指向值(或对象)的引用或指针。即使变量作为参数传递,也是如此。

接收对象形参的函数不能修改变量本身(同样,它只是一个指针)。这意味着它不能导致变量指向其他地方。但是,它可以使用指针获取对对象的引用并修改对象本身。

如果你想传递一个对象,但又想确保它不会被修改,你可以传递它的克隆。