C#getter vs readonly

jia*_*103 33 c#

以下是否有任何区别?

class C
{
    // One:
    public static readonly int ValueAsAMember = 42;

    // Two:
    public static int ValueAsAProperty { get { return 42; } }
}
Run Code Online (Sandbox Code Playgroud)

我习惯于以第一种方式编写常量(除非它们是私有/内部的,在这种情况下我使用const关键字),但我最近看到了第二种形式.

在可读性,约定,性能或其他方面,是否有任何优势?

pes*_*ino 32

你有三个选择:

  • public static readonly int Value = 42;
  • public static int Value { get { return 42; } }
  • public const int Value = 42;

选择static readonly值是否在运行时不会更改,但在将来的代码版本中可能会更改.

如果值可能在运行时更改,请选择属性.当然,如果您使用给定的代码,它将不会改变.

选择const值是否真的是一个在将来版本中甚至不会改变的常量(类似于Math.PI或者int.MinValue).当然,使用const受到价值类型的限制.

const和之间的区别static readonly是该const值将在呼叫站点上被替换.如果const在将来的版本中更改a的值,则需要使用新值重新编译依赖于类的所有程序集.

该属性需要方法调用(调用getter是方法调用).因此,如果值在运行时是常量,则不需要这样.


O. *_*per 13

是的,有一个优点:

如果值在将来的任何时候都可以更改(例如,在代码的未来版本中),例如,与时间相关,您可以在只读属性中支持该值而不更改公共你班级的界面.

如果必须readonly用属性替换字段,则必须重新编译使用该类的任何其他程序集.

  • 但请记住,`readonly`字段只能在`class`的`constructor`中更改 (3认同)

Ben*_*son 8

有两个主要区别:

第一个是字段不能在接口上,而属性可以.因此,如果要在界面中使用它,则必须使用该属性.

第二个更有趣的是,readonly可以修改字段,同时构建对象.请使用以下代码:

public class MyTestClass
{
    public readonly int MyInt = 1;

    public MyTestClass()
    {
        MyInt = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果打电话的话

new MyTestClass().MyInt
Run Code Online (Sandbox Code Playgroud)

它们将得到2.对于静态readonly字段的静态构造函数也是如此.