【问题标题】:Adding a Non-Static Class to a static List将非静态类添加到静态列表
【发布时间】:2014-03-09 23:24:46
【问题描述】:

我有一个包含许多属性的非静态类

private static List<FileClass> FileClassList = new List<FileClass>();
internal void AddFile(Alphaleonis.Win32.Filesystem.FileInfo finfo)
   {
       this.FileID = FileIDCounter;
       this.Name = finfo.Name;
       this.FullName = finfo.FullName;
       this.Attributes = GetFileAttributes(finfo);
       this.CreationTime = finfo.CreationTime;
       this.Extension = finfo.Extension;
       this.isReadOnly = finfo.IsReadOnly;
       this.LastAccessTime = finfo.LastAccessTime;
       this.LastWriteTime = finfo.LastWriteTime;
       this.Length = finfo.Length;

       Interlocked.Increment(ref FileIDCounter); // As a Static value this is shared amongst all the instances of the class
       // Interlocked.Increment is the Thread Safe way of saying FileIDCounter ++;

       FileClassList.Add(this);
       if (FileClassFileAdded != null) FileClassFileAdded(this);

   }

虽然添加了类FileClassList.Add(this);最终结果是一个 FileClassList,其中填充了类的最后一个实例,而不是 this.Properties 值。

那么,如何将 FileClass 的当前实例添加到 FileClassList 中,以便 FileClassList 的内容包含 FileClass 的不同实例。

【问题讨论】:

  • 您能说明一下您是如何尝试使用该列表的吗?
  • 您希望您的列表包含什么? this.Properties 在您的 sn-p 中的任何地方都没有提到,所以我对您的列表没有它并不感到惊讶...
  • @Ben 可能,this.Properties 是 this.FileID、Name 等。所以可以像 FileClassList[i].Name 一样访问它们...
  • @JleruOHeP 如果是这样,那么 FileClass 的实例就可以了;没有更多信息,就不可能确切知道要问什么。

标签: c# list class static instance-variables


【解决方案1】:

这是您最有可能遇到的问题...

有这个:

  internal void AddFile(Alphaleonis.Win32.Filesystem.FileInfo finfo)

你可能会做的地方:

 MyClassWhichAddsAFile cls = new MyClassWhichAddsAFile();
 cls.AddFile(fileInfo1);
 cls.AddFile(fileInfo2);
 cls.AddFile(fileInfo3);

当你需要做的时候(在这个设计下):

 MyClassWhichAddsAFile cls1 = new MyClassWhichAddsAFile();
 cls1.AddFile(fileInfo1);
 MyClassWhichAddsAFile cls2 = new MyClassWhichAddsAFile();
 cls2.AddFile(fileInfo2);
 ........

再一次,我不是在这里讨论您的设计或如何正确地做它。我告诉你,你的问题很可能来自这种情况

【讨论】:

  • 是的 - 我没有重新实例化课程 - 很好!
【解决方案2】:

我认为你的设计有点歪斜。我不认为 AddFile 应该是 FileClassList 的一部分。 然而,没有其他地方可以容纳它。我会说这样做:

   internal static void AddFile(Alphaleonis.Win32.Filesystem.FileInfo finfo, FileClass theClass)
   {
       theClass.FileID = FileIDCounter;
       theClass.Name = finfo.Name;
       theClass.FullName = finfo.FullName;
       theClass.Attributes = GetFileAttributes(finfo);
       theClass.CreationTime = finfo.CreationTime;
       theClass.Extension = finfo.Extension;
       theClass.isReadOnly = finfo.IsReadOnly;
       theClass.LastAccessTime = finfo.LastAccessTime;
       theClass.LastWriteTime = finfo.LastWriteTime;
       theClass.Length = finfo.Length;

       Interlocked.Increment(ref FileIDCounter); // As a Static value this is shared amongst all the instances of the class
       // Interlocked.Increment is the Thread Safe way of saying FileIDCounter ++;

       FileClassList.Add(theClass);
       if (FileClassFileAdded != null) FileClassFileAdded(theClass);

   }

更好的方法是在 FileClass 上创建一个构造函数,它接受一个 FileInfo 并填充这些属性并像这样调用它:

var someFileClass = new FileClass(theFileInfo);
FileClass.AddFile(someClassFile);

而 AddFile 将是:

   internal static void AddFile(Alphaleonis.Win32.Filesystem.FileInfo finfo, FileClass theClass)
   {

       Interlocked.Increment(ref FileIDCounter); // As a Static value this is shared amongst all the instances of the class
       // Interlocked.Increment is the Thread Safe way of saying FileIDCounter ++;

       FileClassList.Add(theClass);
       if (FileClassFileAdded != null) FileClassFileAdded(theClass);

   }

即便如此,我认为 AddFile 应该是调用者而不是被调用者的方法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2021-03-28
    相关资源
    最近更新 更多