主题: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();
}
}
}
* 我已经尽量地把无关的成员变量和函数给拿掉了。烦请各位走过路过的大侠赐招.
这段程序的问题,各位只要用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();
}
}
}