有没有办法在C#中将getter函数定义为像VB.NET一样的ReadOnly?

时间:2010-08-02 22:46:25

标签: c#

在C#中,可以通过不定义set函数来定义readonly getter函数:

private int _id;

public int Id
{

   get { return _id; }
   // no setter defined
}
在VB.NET中

Private _id as Integer
Public Readonly Property Id() As Integer
    Get
       Return _id
    End Get
End Property

是否可以像在VB .NET中一样标记readonly这样的函数,以便更加详细?

1 个答案:

答案 0 :(得分:10)

我不知道ReadOnly在VB中给你的是什么。我想你能得到的最明确的实际上不那么冗长:

public int Id { get; private set; }

在C#中,readonly表示在创建对象期间设置了字段的值,并且在构造函数退出后不可更改。你可以通过以下方式实现这一目标:

private readonly int _id; // note field marked as 'readonly'

public int Id
{
   get { return _id; }
}

不幸的是,自动属性(如我在第一个代码段中显示的)不允许为readonly。也就是说,您必须通过确保在构造函数退出后没有任何类的代码调用私有setter来自己强制执行只读语义。我想这与VB对ReadOnly的使用情况有所不同。

编辑正如托马斯指出的那样,没有吸气剂与拥有吸气剂不同。但是VB's usage of ReadOnly与C#one不同,至少与属性一起使用时是

' Only code inside class employee can change the value of hireDateValue.
Private hireDateValue As Date
' Any code that can access class employee can read property dateHired.
Public ReadOnly Property dateHired() As Date
    Get
        Return hireDateValue
    End Get
End Property

对于C#程序员,ReadOnly关键字似乎是多余的。事实上已经暗示不存在二传手。

就字段而言,C#和VB似乎是等价的。