【问题标题】:How can I make a property "Write Once Read Many" in VB.NET?如何在 VB.NET 中创建属性“一次写入多次读取”?
【发布时间】:2011-01-04 05:33:29
【问题描述】:

使类属性“一次写入,多次读取”以使您只能设置一次属性的最佳方法是什么?

我知道我可以传递构造函数中的所有属性并将它们设为只读,但在具有大量属性的情况下,我不希望构造函数具有 20 多个参数。

另外,我意识到我可以“滚动我自己的”设置器,但必须为每个属性都这样做似乎是一堆冗余编码。

在 VB 2008 .NET 3.5 中是否有一种干净的方法可以做到这一点?

【问题讨论】:

标签: vb.net properties set readonly


【解决方案1】:

Write Once 属性永远不会“干净”。

我建议创建一个构建器/工厂类以避免 20 参数 CTor。 (是的,我知道这是相当多的打字)

这里有类似的讨论: Should I use set once variables?

[edit] 此外,即使您坚持我没有看到除了滚动您自己的 setter 之外的其他选择,这也需要大量输入。

【讨论】:

  • 谢谢。您链接的帖子解释了很多,我同意您的“最少惊喜”原则。使用构建器可能是最好的解决方案。
  • 带有暴露设置器的一次性写入属性并不干净,但这些属性与使用CompareExchangeTrySet 方法相结合可以具有有用的线程安全特性。例如,在链表队列实现中,给定项的“下一个”指针将是null(用于最后一项),或者指向另一个项。想要追加到队列的代码可能会尝试写入最后一项的next 指针;如果失败,它必须跟随next 指针直到找到新的最后一项,然后重试。
  • @supercat:同意,但是 setter 应该是一个单独的方法(如 TrySet),而不是 proeprty setter。所以我认为“这不是一个真正的一次性属性”。
  • @peterchen:我认为没有理由不应该将这个东西暴露为一个属性来阅读,因此可以被描述为一个属性。我不知道任何非笨拙的术语来描述只读属性,其值可以通过在同一级别公开的方法进行更改,其唯一目的是更改相关属性。从语法上讲,它是一个“只读”属性,但该术语通常意味着暴露该属性的对象无法更改它(即使它可以通过其他方式更改)。
  • @peterchen:可以将属性称为“更改一次”,尽管术语“更改”意味着该属性在更改之前可以具有任意值。 “设置一次”可能比“一次写入”好一点,除了术语“设置”与“属性设置器”密切相关。然而,属性可以改变的方式远没有这样一个事实重要,即如果它持有对某物的引用,它将总是引用同一事物。例如,考虑需要如上所述实现的队列的只读快照的代码。
【解决方案2】:

我知道已经快 3 年了,但这是我认为更好的解决方案:

public class Site
{
    private int miID;

    public Site(int iNewID, string sName)
    {
        miID = iNewID;
        Name = sName;
    }
    // The ID property can only be set once in the constructor
    public int ID
    {
        get { return miID; }
    }
    public string Name { get; set; }
}

【讨论】:

  • 欢迎来到 StackOverflow!您应该尝试解释为什么您认为您的解决方案更好。
【解决方案3】:

“最干净”的方法是根本不这样做并使用自动属性。我也看不到它的必要性。只能写一次真的那么重要吗?如果是这样,我肯定会使用一个将所有属性的值作为参数的构造函数。

【讨论】:

  • 我将使用它的属性示例是“ID”属性,它是类的唯一标识符。这不是生或死,但它会确保“ID”不会被其他代码更改。除了知道我正在使用的 VB 版本不支持它们之外,我对自动属性并不是很熟悉。是否有可能让它们一写多读?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多