在C#中,如何完成与a#define相同的任务

在C#中,如何完成与a#define相同的任务,c#,constants,C#,Constants,我来自C语言背景,习惯用以下方式定义缓冲区的大小: #define BUFFER_SIZE 1024 uint8_t buffer[BUFFER_SIZE]; 你将如何在C#中完成同样的事情 此外,全帽K&R款式是否适合普通C#Pascal/驼色外壳 public static readonly int BUFFER_SIZE = 1024; 与常量相比,我更喜欢此选项,因为具有常量值的(常量仅用于替换,因此更改该值不会在针对原始值编译的任何程序集中更改它)。不要使用#define 定义一

我来自C语言背景,习惯用以下方式定义缓冲区的大小:

#define BUFFER_SIZE 1024

uint8_t buffer[BUFFER_SIZE];
你将如何在C#中完成同样的事情

此外,全帽K&R款式是否适合普通C#Pascal/驼色外壳

public static readonly int BUFFER_SIZE = 1024;
与常量相比,我更喜欢此选项,因为具有常量值的(常量仅用于替换,因此更改该值不会在针对原始值编译的任何程序集中更改它)。

不要使用#define

定义一个常量:private const int BUFFER_SIZE or readonly变量:专用readonly int BUFFER_SIZE

const int BUFFER_SIZE = 1024;

不要使用“静态只读”,因为它会创建一个变量。“const”在构建时被替换,不创建变量。

我个人更喜欢常量:

private const int BUFFER_SIZE = 1024;
不过,如果它是公共的,并且您是一个框架,您可能希望它是一个只读的。在C#中,我决定这样做:

//C# replace C++ #define
struct define
{
    public const int BUFFER_SIZE = 1024;
    //public const int STAN_LIMIT = 6;
    //public const String SIEMENS_FDATE = "1990-01-01";
}

//some code
byte[] buffer = new byte[define.BUFFER_SIZE];

我支持这两个答案(ctacke,Megacan)。CamelCase只是一个编码约定。没有任何语义。是的,但我只是好奇C#程序员是否会定义BUFFER#u SIZE之类的常量,或者只是用BufferSize之类的Pascal大小写。我仍然倾向于对常量使用所有的大写。其中一个原因是,我做了很多互操作,从C头导入常量比将它们全部重命名更痛苦:)@Stu Mackellar:查看Resharper for refactoring。重命名没有问题。:)我认为这种形式很差。如果这是程序集A,而程序集B引用它,则可能导致意外行为。更改程序集A中的值并重新编译,旧值将继续在程序集B中使用,除非重新编译。@ctacke这与C头文件中的#define完全类似-如果其值更改,则使用它的每个模块都需要重新编译。我同意维尼希特的观点+1@ctacke:这就是为什么我对PRIVATE使用常量modifier@Stu麦凯拉:我同意卡塔克的观点。使用const是可以的,但必须确保不在程序集之间共享。如果您要公开,请确保您使用的是只读!参考:Effective C#:第2项-更喜欢只读而不是constesting-您更喜欢常量,即使知道其固有的危险?如果它是程序集专用的,则使用只读变量而不是常量没有好处。只有当常量暴露于其他程序集时才有危险。另外:很难想象你正在分发一个框架,框架的用户无论如何都不需要重新编译新版本。@ctacke-将常量私有化或内部化可以解决这个问题……我很少将常量公开为公共。除此之外,我不倾向于创建框架,所以我希望依赖程序集能够重新编译。这里有很多“难以想象”和“很少”的项目。如果经验没有教会我任何软件开发方面的东西,那么总是很少有bug咬我的屁股。养成使用静态只读的习惯意味着我永远不必考虑“如果”或者其他人改变范围。我同意。我从有效的C#:第2项中了解到这一点-宁愿只读也不要常量。