日期:2014-05-18  浏览次数:20972 次

在方法内定义的变量为什么不会丢失数据?
C# code

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args) {

            //总行数
            int totalLineCount = 0;
            //目录
            string directory;

            if (args.Length > 0) {
                directory = args[0];
            }
            else {
                directory = Directory.GetCurrentDirectory();
            }
            totalLineCount = DirectoryCountLines(directory);
            Console.WriteLine(totalLineCount);
            Console.ReadLine();
        }
        /// <summary>
        /// 计算目录数
        /// </summary>
        /// <param name="directory"></param>
        /// <returns></returns>
        static int DirectoryCountLines(string directory) {
            //这里的变量不是每次方法运行一次就会把次赋为0吗?为什么还可以累加上次的结果。
            int lineCount = 0;
            foreach (string file in Directory.GetFiles(directory, "*.txt")) {
                lineCount += CountLines(file);
            }

            //递归子目录
            foreach (string subdirectory in Directory.GetDirectories(directory)) {
                lineCount += DirectoryCountLines(subdirectory);
            }

            return lineCount;
        }

        /// <summary>
        /// 计算行数
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        private static int CountLines(string file) {
            string line;
            int lineCount = 0;
            FileStream stream = new FileStream(file, FileMode.Open);
            StreamReader reader = new StreamReader(stream);
            line = reader.ReadLine();

            while (line != null) {
                if (line.Trim() != "") {
                    lineCount++;
                }
                line = reader.ReadLine();
            }
            reader.Close();
            return lineCount;
        }       
    }
}




------解决方案--------------------
程序貌似没啥问题啊,,,

------解决方案--------------------
是因为你递归的问题,先把变量压栈,然后在出栈,这样你出栈的变量还保留这被压栈时的值,出来后就会加上你当前的值
------解决方案--------------------
探讨

是因为你递归的问题,先把变量压栈,然后在出栈,这样你出栈的变量还保留这被压栈时的值,出来后就会加上你当前的值

------解决方案--------------------
主要问题在于你的函数返回值也是int,再加上变量也是int累计,及自己跟踪看看吧
------解决方案--------------------
方法结束,方法中 的值类型都会被 立即释放销毁;引用类型会 被 .Net 内存回收器 间接销毁;

函数值只会有 一个返回值被返回,且不会在函数内销毁;

——至于,递归;这只是一个方法此次调用的问题:子方法不执行完,母方法的数据状态依然保持!!

递归只是在于:子方法下可能有 孙方法,孙方法下面可能还有 重孙方法;——方法中数据的销毁,也是 从 重孙方法> 孙方法 > 子方法 > 母方法;

——你的程序在递归过程中,母方法的 数据方然得保存着!

————————————————————————————————————————————
你的递归中:DirectoryCountLines 和 CountLines 
都是自己调用自己,即,母方法 和 子方法 都是同一个方法体.....