我已经阅读了各地const和static readonly各个领域.我们有一些只包含常量值的类.用于我们系统中的各种事物.所以我想知道我的观察结果是否正确:
这些常量值是否应始终static readonly适用于所有公开的内容?并且仅const用于内部/受保护/私有值?
您有什么推荐的吗?我是否可能甚至不使用static readonly字段,而是使用属性?
我们有一个项目被编译成一个名为consts.dll的DLL,其中包含以下内容:
public static class Consts
{
public const string a = "a";
public const string b = "b";
public const string c = "c";
}
Run Code Online (Sandbox Code Playgroud)
我们有多个这样的项目,每个都编译成一个同名的DLL(consts.dll),我们根据需要替换它们.我们有另一个使用这些consts的类:
public class ConstsUser
{
string f() { return Consts.a; }
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,Consts.a优化为"a",所以即使我们替换Consts.dll实现,我们仍然得到"a"而不是正确的值,我们需要重新编译ConstsUser.反正有没有阻止优化器用它们的值替换const变量?
可能重复:
const和readonly有什么区别?
因此,从我读到的,在C#中,const并且static readonly在程序执行期间都会使值不可更改.
但是,const应该使用不太可能改变的数量(例如,pi,地球半径,每加仑的窝数等).
另一方面,static readonly应该使用当前不变但可能/将来会改变的值(例如软件版本,算法中的乘数等).
我做对了吗?
我有一个多线程应用程序,使用静态方法写入设置xml文件.我想避免文件同时更新两次(导致访问/写入异常).
我怎么做?
这不起作用:
namespace Program
{
public class Settings
{
private static void SetSettingsValue (string settings, string value)
{
// make this thread safe to avoid writing to a locked settings xml file
lock (typeof(Settings))
{
//write data to xml file
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有个问题.最近我发现自己使用了3种不同的代码行,经过仔细检查后看起来和感觉都一样.
public static class constant
{
public static readonly int val1 = 5;
public const int val2 = 5;
public static int val3 { get { return 5; } }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,它们是否相同,是否应该使用另一个?如果是这样.什么时候?
作为视觉工作室中的一个额外问题,为什么它们在intellisense中的表现方式不同?

在c#中,readonly成员可以简化为只读自动属性/表达式成员,对于不可变成员,表达式成员比使用readonly关键字更好吗?
使用readonly keywork:
public static readonly string COMPANY_NAME= "XYZ";
Run Code Online (Sandbox Code Playgroud)
使用表达身体的成员:
public static string COMPANY_NAME => "XYZ";
Run Code Online (Sandbox Code Playgroud)
我遇到过各种论坛和解决方案,建议表达身体的成员用于短手使用,我无法找到它在性能上的差异.
我想说:
public void Problem(DateTime optional = DateTime.MaxValue)
{
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨DateTime.MaxValue不是编译时常量.
DateTime.MinValue很简单,只需使用默认值(DateTime)
另请参阅" 如何在C#中将参数默认为Guid.Empty? "
我不想使用方法重载,因为我试图驯服的方法有101个参数!
为什么可以readonly使用反射修改字段的值而不是a的值const?
class Program
{
static void Main(string[] args)
{
Foobar foobar = new Foobar();
Console.WriteLine(foobar.foo); // Outputs "Hello"
Console.WriteLine(Foobar.bar); // Outputs "Hello"
var field = foobar.GetType().GetField("foo");
field.SetValue(foobar, "World"); // Ok
field = foobar.GetType().GetField("bar");
field.SetValue(foobar, "World"); // Throws FieldAccessException
Console.ReadKey();
}
}
public class Foobar
{
public readonly string foo = "Hello";
public const string bar = "Hello";
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这个答案,所以我明白它可以违反规则,readonly但为什么不能const这样呢?我确信这是一个很好的理由,但我无法弄清楚它可能是什么.
- 编辑 -
当我使用ildasm查看上面的代码时,该readonly字段的值在编译时设置.不是在字段本身,const而是在类的构造函数中.所以我不确定为什么可以"覆盖"而不是另一个.
我的意思是,即使const二进制文件中的"硬编码"值是不能修改框架本身的技术限制的原因,因为"它已经设置"或只是一个设计决策.我没有看到任何理由为什么某些地方没有某种"魔法"修改它 …
与仅使用私有变量的常规可修改字段相比,使用const或readonly字段是否有任何性能优势.
例如:
public class FooBaar
{
private string foo = "something";
private const string baar = "something more"
public void Baaz()
{
//access foo, access baar
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,您可以看到有两个字段:foo和baar.这两个都是在课堂之外无法进入的,所以为什么许多人更喜欢在const这里使用,而不仅仅是private.是否const提供任何性能优势?
此问题之前已被社群关闭,因为人们误解了这个问题:" 绩效const和readonly绩效之间有什么区别?" 这里已经回答:const和readonly有什么区别?.
但我的意思是,"通过使用const或readonly不使用其中任何一个,我能获得任何性能优势".
像在java我有:
Class.getSuperClass().getDeclaredFields()
Run Code Online (Sandbox Code Playgroud)
我如何知道并从超类中设置私有字段?
我知道这是强烈不推荐的,但我正在测试我的应用程序,我需要模拟一个错误的情况,其中id是正确的,而名称不是.但这个Id是私有的.
c# ×10
constants ×2
readonly ×2
reflection ×2
c#-4.0 ×1
c#-6.0 ×1
const ×1
inheritance ×1
locking ×1
optimization ×1
performance ×1
static ×1
superclass ×1