创建自定义防御副本的正确方法 Class
Correct Way of Creating a Defensive Copy of Custom Class
我有以下 class:
public class FolderAgent
{
public string directoryName {get; private set; }
public int numberofdirectories {get; private set; }
public int numberofFiles {get; private set;}
public DirectoryInfo [] directories {get; private set;}
public FileInfo [] files {get; private set;}
public FolderAgent(string directoryName, int numberofdirectories, int numberofFiles, DirectoryInfo [] listDir, FileInfo [] listFiles)
{
this.directoryName = directoryName;
this.numberofdirectories = numberofdirectories;
this.numberofFiles = numberofFiles;
Array.Copy(listDir, directories, listDir.Length);
Array.Copy(listFiles, files, listFiles.Length);
}
}
我有另一个 class 将 folderagent 作为构造函数中的参数,这是创建 Folderagent 对象的防御副本的正确方法吗?
public class FolderKey
{
public FolderAgent folder {get; private set;}
public int returnValue {get; private set;}
public FolderKey(FolderAgent folder, int returnValue)
{
this.folder = new FolderAgent(folder.directoryName, folder.numberofdirectories, folder.numberofFiles, folder.directories, folder.files);
this.returnValue = returnValue;
}
}
您基本上想要数组所有元素的副本。请注意,FileInfo
和 DirectoryInfo
使用缓存数据,这些数据会在您第一次访问任何 file/directory 属性时进行初始化。
所以你也可以重新创建对象,而不是制作副本......类似(未测试):
public FolderAgent(string directoryName, int numberofdirectories,
int numberofFiles, DirectoryInfo [] listDir,
FileInfo [] listFiles)
{
this.directoryName = directoryName;
this.numberofdirectories = numberofdirectories;
this.numberofFiles = numberofFiles;
directories = new DirectoryInfo[listDir.length];
for(var i = 0; i < listDir.length; i++)
directories[i] = new DirectoryInfo(listDir[i].FullName);
files = new FileInfo[listFiles.length];
for(var i = 0; i < listFiles.length; i++)
files[i] = new FileInfo(listFiles[i].FullName);
}
我有以下 class:
public class FolderAgent
{
public string directoryName {get; private set; }
public int numberofdirectories {get; private set; }
public int numberofFiles {get; private set;}
public DirectoryInfo [] directories {get; private set;}
public FileInfo [] files {get; private set;}
public FolderAgent(string directoryName, int numberofdirectories, int numberofFiles, DirectoryInfo [] listDir, FileInfo [] listFiles)
{
this.directoryName = directoryName;
this.numberofdirectories = numberofdirectories;
this.numberofFiles = numberofFiles;
Array.Copy(listDir, directories, listDir.Length);
Array.Copy(listFiles, files, listFiles.Length);
}
}
我有另一个 class 将 folderagent 作为构造函数中的参数,这是创建 Folderagent 对象的防御副本的正确方法吗?
public class FolderKey
{
public FolderAgent folder {get; private set;}
public int returnValue {get; private set;}
public FolderKey(FolderAgent folder, int returnValue)
{
this.folder = new FolderAgent(folder.directoryName, folder.numberofdirectories, folder.numberofFiles, folder.directories, folder.files);
this.returnValue = returnValue;
}
}
您基本上想要数组所有元素的副本。请注意,FileInfo
和 DirectoryInfo
使用缓存数据,这些数据会在您第一次访问任何 file/directory 属性时进行初始化。
所以你也可以重新创建对象,而不是制作副本......类似(未测试):
public FolderAgent(string directoryName, int numberofdirectories,
int numberofFiles, DirectoryInfo [] listDir,
FileInfo [] listFiles)
{
this.directoryName = directoryName;
this.numberofdirectories = numberofdirectories;
this.numberofFiles = numberofFiles;
directories = new DirectoryInfo[listDir.length];
for(var i = 0; i < listDir.length; i++)
directories[i] = new DirectoryInfo(listDir[i].FullName);
files = new FileInfo[listFiles.length];
for(var i = 0; i < listFiles.length; i++)
files[i] = new FileInfo(listFiles[i].FullName);
}