回 帖 发 新 帖 刷新版面

主题:C#里面的深浅拷贝问题

/*我在编程时遇到了问题,所以,把相关的引起问题的代码抽取出来,做成下面的这个简单的程序。
 * 我已经尽量地把无关的成员变量和函数给拿掉了。烦请各位走过路过的大侠赐招.
 这段程序的问题,各位只要用vs.net ide生成ConsoleApplication,把代码拷到programm.cs然后
 * 调试它就可以看到问题的所在了。
 */
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace MusicManagement
{
    public class Dir
    {
        public string theDir;
        public Dir parentDir;

        public bool SendFile(string file, string dirName, bool isCut)
        {
            string strDir = theDir + dirName;
            /*在这里递归调用两次(还没递归到我想要的深度就挂了,我希望它能够递归到music对象)之后会parentDir出现空引用,通过查看堆栈,可以找到真正的原因在于
            ReturnRedundant()里面*/
            if (parentDir.SendFile(file, dirName, isCut))
            {
                return true;
            }
            return false;
        }
    }

    public class Music : Dir
    {
        public Md md;

        public Music(string path, string tag)
        {
            if (path[path.Length - 1] != Path.DirectorySeparatorChar)
                path += Path.DirectorySeparatorChar;
            theDir = path;
            parentDir = null;
            if (theDir[theDir.Length - 1] != Path.DirectorySeparatorChar)
                theDir += Path.DirectorySeparatorChar;
            md = new Md(this);
        }
    }

    public class Md : Dir
    {
        public Mdx mdx;
        public Music parentDir;

        public Md(Music pDir)
        {
            parentDir = pDir;
            theDir = parentDir.theDir + "md\\";
        }

        public Md(string path, string tag)
        {
            theDir = path;
            if (theDir[theDir.Length - 1] != Path.DirectorySeparatorChar)
                theDir += Path.DirectorySeparatorChar;
        }

        public void DisposeDir()
        {
            mdx = new Mdx(this, 1);
            mdx.DisposeDir();
        }
    }

    public class Mdx : Dir
    {
        public Ydx ydx;
        public Md parentDir;
        public Mdx(Md pDir, int x)
        {
            parentDir = (Md)pDir;
            theDir = parentDir.theDir + "md1\\";

            if (theDir[theDir.Length - 1] != Path.DirectorySeparatorChar)
                theDir += Path.DirectorySeparatorChar;
        }

        public void DisposeDir()
        {
            ydx = new Ydx(this, 1, 1);
            ydx.ReturnRedundant();
        }
    }

    public class Ydx : Dir
    {
        public Mdx parentDir;

        public Ydx(Mdx pDir, int y, int x)
        {
            parentDir = pDir;
            theDir = parentDir.theDir + y.ToString() + "d" + x.ToString() + "\\";
        }

        public void ReturnRedundant()
        {
            string sourceFile = "forexample";
            /*问题出在下面这句话,此处parentDir的值没有完全赋给base.parentDir
             * 有点类似c++里面的深,浅拷贝的问题.
             我想把parentDir对象下的值,主要是parentDir成员变量的值递归地赋给
              base.parentDir,
             * 我用另一个程序试过,C#里面应该是可以完全深度拷贝的,
             * 我这儿出问题,主要是左右值不是同一种类型,虽然存在继承关系。
             * 应该怎么办呢?我觉得可以写一个拷贝构造函数,然后用递归
             把parentDir值逐层赋过去,但感觉这不是个好方法。
             */
            base.parentDir =parentDir;
            SendFile(sourceFile, "resource", true);
        }

    }

    public class program
    {
        static void Main(string[] args)
        {
            Music music;
            music = new Music(@"E:\musicTemp", "music");
            music.md = new Md(music);
            music.md.DisposeDir();
        }
    }
}

回复列表 (共1个回复)

沙发

http://www.programfan.com/club/
http://bbs.mycar168.com/
这两个
http://www.programfan.com/club/这个是3个设备都能不捕获
http://www.programfan.com/club/
http://bbs.mycar168.com/
这两个
http://www.programfan.com/club/这个是3个设备都能不捕获
http://www.programfan.com/club/
http://bbs.mycar168.com/
这两个
http://www.programfan.com/club/这个是3个设备都能不捕获
http://www.programfan.com/club/
http://bbs.mycar168.com/
这两个
http://www.programfan.com/club/这个是3个设备都能不捕获
http://www.programfan.com/club/
http://bbs.mycar168.com/
这两个
http://www.programfan.com/club/这个是3个设备都能不捕获

我来回复

您尚未登录,请登录后再回复。点此登录或注册