2010-01-12 80 views
7

什么是使一个类属性“一次写入,多次读取”的最佳方法是让你只能设置属性一次?如何在VB.NET中创建一个属性“Write Once Read Many”?

我知道我可以通过在构造函数中的所有属性,使他们只读,但在案件有很多的属性,我不想有20多个参数的构造函数。

而且,我知道我可以“推出自己的”制定者,但不得不这样做,对于每一个属性,似乎像一堆冗余编码。

有没有干净的方式在2008年.NET 3.5 VB做到这一点?

+2

相关:http://stackoverflow.com/questions/1079292/should-i-use-set-一次变量/ 1079316 – peterchen 2010-01-12 15:50:09

回答

2

追记属性永远不会是“干净”。

我建议创建一个生成器/工厂类,以避免20 PARAM构造函数。 (是的,我知道这是相当长的一段打字)

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

[编辑]此外,即使你坚持,我没有看到另一种选择不是滚动您自己制定者,这是打字也很多。

+0

谢谢。你链接的帖子解释了很多,我同意你的“最小惊喜”原则。使用建造者可能是最好的解决方案。 – 2010-01-12 16:01:43

+0

使用暴露setter的一次写入属性并不干净,但这种属性与使用“CompareExchange”的TrySet方法相结合可以具有有用的线程安全特性。例如,在链表清单队列实现中,给定项目的“下一个”指针将是“null”(用于最后一个项目)或指向另一个项目。想要追加到队列的代码可能会尝试写入最后一项的“下一个”指针;如果失败,它必须遵循'next'指针,直到找到新的最后一个项目,然后重试。 – supercat 2012-11-20 18:26:49

+0

@supercat:表示同意,但是setter应该是一个单独的方法(如TrySet),而不是proeprty setter。所以我认为“这不是真正的一次写入性质”。 – peterchen 2012-11-21 13:08:13

0

“最干净”的办法是不要做它在所有并使用自动属性。我也没有看到它的需要。他们只能写一次真的很重要吗?如果是这样,我肯定会去一个构造函数,它将所有属性的值作为参数。

+0

我将使用此属性的一个示例是“ID”属性,它是该类的唯一标识符。这不是生死关头,但它可以确保“身份证”不会被其他代码所改变。 我不是那么熟悉汽车性能,除了知道他们不支持我正在使用的VB版本。是否有可能让他们写一次阅读许多? – 2010-01-12 15:36:39

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; } 
} 
+3

欢迎来到StackOverflow!你应该尝试解释你为什么认为你的解决方案更好。 – nalply 2012-10-04 17:52:45

相关问题