【问题标题】:C# How to preserve data between class instances [closed]C#如何在类实例之间保存数据[关闭]
【发布时间】:2017-12-02 08:41:28
【问题描述】:

所以我之前曾问过这个问题,并认为我得到了答案,不幸的是,答案并没有像我需要的那样,所以我再次询问并进一步解释我想要得到的行为。

这是我上一个问题的链接:C# how can I preserve data between class instances?

问题描述如下:

给定 A 类

如果 A 类包含一个列表,我如何保留该列表中的数据,以便对象 B 和 C(A 类的实例)可以访问列表中的数据(即使 B 和 C 都新建了自己的实例A类)?

** 我应该注意,这是针对我尝试使用对象数据源实施的报告解决方案。

我认为以下代码可以解决我的问题

[DataObject]
public class Product
{
    public string Name {get; set;}
    public string Category {get; set;}
    public int ID {get; set;}

    // this method let's calling code add an instance of this class to the 
    // to the ProductList
    public void AddItemsToList()
    {
        ProductList.Add(this);
    }

    // static list allows me to preserve the list data
    public static List<Product> ProductList =
        new List<Product>();

    // This method is used to return an IEnumberable object to my reporting 
    // solution (Telerik Reports)
    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<Product> GenerateReport()
    {
         return ProductList;
    }

}

上述代码的问题在于,每次我用实例更新静态列表时,它都会覆盖之前调用 List.Add() 的数据。因此,如果我添加该产品类的 5 个实例(每个实例都设置了不同的属性值),我的列表将包含 5 个项目,所有项目都具有最近设置的属性值。

我需要什么:我需要我的列表不仅要保留我的数据(以某种方式),还要确保我的列表包含每个实例的副本(不仅仅是添加到列表中的最后一个实例的 5 个副本)。

如有必要,我可以提供更多详细信息,如果需要,我可以测试代码。任何想法都会非常有帮助。

【问题讨论】:

  • 如果您实际上添加了 5 个不同的项目,那么您将拥有 5 个不同的项目。如果您的列表有 5 个相同项目的副本,那是因为您添加了 5 个相同项目的副本。也就是说,整个事情似乎是一个非常糟糕的主意。你不应该有这样的静态列表。任何代码都需要一个列表,其中一些项目应该有列表,并根据需要添加项目。
  • 对……这很有道理。仅仅因为我多次调用 AddItemToList 并不意味着我将我的类的新实例添加到列表中(duh),我只是添加具有更新属性的相同实例。我会让我的调用代码在一个新实例中发送,看看是否有效。
  • 如果您的问题涉及类ABC,为什么您的代码示例没有显示这些?坦率地说,这个问题根本不清楚。我怀疑单身人士会在这里有所帮助。但是,您需要更好地解释您尝试了什么以及为什么没有奏效。解释为什么类BC 有它们自己的A 实例,但由于某种原因需要访问A 的某个other 实例所拥有的列表对象。您将得到的只是死胡同的答案,直到您能够更具体并以更清晰、更易于理解的方式提出您的问题。
  • 你是对的。我想我在这里真的只处理 A 类和 A 类的多个对象,我想我应该说的是 B 和 C 或 A 类的对象。但是由于对象是 A 类的实例,它们有自己的副本,我需要对象 B 和 C 可以访问相同的底层数据,因此静态方法开始发挥作用。我将更新我的问题以更准确地反映问题所在。现在虽然看起来 Servy 让我走上了正轨,因为我的列表现在包含不同的副本。
  • @Servy 你肯定让我走上了正确的道路。我的列表现在包含不同的副本(我添加了同一实例的 5 个副本)。所以现在事情正在按我的预期工作,但我的报告现在有一些问题。不过,我可能会为此提出一个新问题。另外,我同意这可能不是我应该这样做的方式......我会看看我是否可以通读我正在使用的报告 API 并找到一种更合适的方法来从对象数据源将数据添加到我的报告中.谢谢!

标签: c# list static instance-variables


【解决方案1】:

因此,您将在每个实例中获得相同的属性值,因为您将 same 实例添加到列表中。该列表有 5 个条目都指向同一个对象。

要解决此问题,您可以克隆 ProductList 的当前实例(或创建具有正确属性值的新实例)并将其添加到列表中,而不是添加实际的当前实例。这样,列表中的每个条目都将指向不同的对象,更新当前对象不会影响它们。

【讨论】:

  • 谢谢,是的,这正是问题所在。它现在似乎正在工作。现在我还有其他问题要解决,因为这都与我正在尝试实施的使用对象数据源的报告解决方案有关。
  • 由于我无法将Servy的评论标记为答案,因此我将其标记为答案,因为它确实是问题和解决方案。我将具有该实例正确属性的类的新实例添加到我的列表中。
【解决方案2】:

您应该使用单例模式,因此您将只有一个 A 类实例,并且可以从应用程序中的任何位置访问它。因此 A 类中的数据将被共享,并且可以从 B 类和 C 类以及任何其他类中访问。

【讨论】:

  • 不幸的是,我以前从未实现过单例模式,希望它不难学习,因为听起来现在是学习的好时机。我会仔细看看的。谢谢。
  • 这很容易,你将你的构造函数标记为私有,你将创建一个属性来获取你的类的已经定义的实例。您可以查看此链接msdn.microsoft.com/en-us/library/ff650316.aspx
【解决方案3】:

似乎您在追求单例模式。 John Skeet 有一个很好的article,关于 C# 中 Singleton 的各种实现。您可以选择一款适合您的需求。

【讨论】:

  • 谢谢,我去看看。
猜你喜欢
  • 2017-11-29
  • 2011-05-18
  • 2013-05-21
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多