【问题标题】:Struct vs static class for a shared resource?共享资源的结构与静态类?
【发布时间】:2010-10-12 01:41:45
【问题描述】:

我有一个产品图像类。这是一个具有重用潜力的对象,可用于处理图像的一般工作(例如,用于产品、处理图像时的 CMS 等)。它可以让我设置文件的标题,并使用标准 .NET 类以简单的方式编辑图像。

我可以使用一个结构,这意味着如果我在 5 个不同的地方使用该结构,那就是 5 个不同的内存位置,但都是相互独立的。更改其中一个内存位置的状态不会影响其他内存位置(这是所需的行为)。请求对象时会被框起来。

对象是基于实例的。因此,每个产品都会使用产品对象并使用图像(例如编辑其标题等)。

如果我创建一个静态类,那就是五个不同的位置引用一个对象。所以我需要处理线程同步。我不能只写入一个变量,因为另一个访问可能会覆盖该变量,无论我如何同步对该共享资源的访问。所以我总是需要返回新的变量。此外,如果我使用许多不同调用方法使用的静态类,则会导致队列访问共享资源。因为实用程序类是静态的,而且它们就是这样——实用程序——它们将被我的代码库中的许多类使用。在这种情况下使用静态类可能不明智吗?

正如 MSDN 文档所解释的,我只会将静态类用于全局实体。所以一个封装了我的代码库细节的类——只有一个代码库,这个类将包含关于行数等的细节。这不是基于实例的,就像一个订单类(1个客户-1个订单-1个或更多订单) )。

在这种情况下,改用结构体是否是一个好的设计决策?

【问题讨论】:

    标签: c#


    【解决方案1】:

    在我看来,担心性能问题的时间是在遇到性能问题之后。在那之前,担心使代码工作和可维护。否则,您会发现自己在追求微不足道的性能提升,或者可能解决了错误的性能问题。

    【讨论】:

      【解决方案2】:

      我不太清楚你想用这个类型做什么,但听起来最好是创建一个不可变的引用类型。在 .NET 中创建自己的结构很少适合(尤其是“产品”结构听起来几乎肯定是错误的选择),并且静态类通常不应该有任何可变状态,除非可能用于计数器之类的东西。

      你有什么理由不去参加正常的课程吗?如果您希望能够在多个“父母”之间共享单个实例而不必担心任何父母会更改内容,请使其不可变 - 添加额外的方法,这些方法会根据旧实例返回一个新实例,但会以某种方式进行更改,就像 @ 987654322@ 可以。

      【讨论】:

      • 嗨。我打算制作一个标准的图像类。要求是电子商务引擎,但我可以立即看到重用的潜力。我没有选择引用类型的唯一原因是因为当 1 ref 更改时我会更改所有引用。我想它应该是不可变的和 ref 类型。
      • 是的,听起来像是不可变引用类型适用于何处的一个很好的例子。
      • 是的。该对象将被系统的各个子系统使用,因此不可变是要走的路。似乎使用结构的原因是基于场景而不是性能。如果我错了,请纠正我。为了防止装箱,我可以使用结构并创建一个方法来请求值类型参数。
      • 不使用结构的原因更具哲学性,IMO。这听起来不像数字或字母那样是一种原子的、自然不变的值。在 .NET 中编写自己的结构非常罕见,IME。但是,很难真正解释我对它的直觉。
      • 很公平。此链接对我有帮助 - msdn.microsoft.com/en-us/library/aa664655(VS.71).aspx。似乎结构在设计 3d 建模应用程序时非常有用,我将在其中设计使用点等的程序化 3d 模型。在那种情况下我应该记住这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多