相关疑难解决方法(0)

静态只读与const

我已经阅读了各地conststatic readonly各个领域.我们有一些只包含常量值的类.用于我们系统中的各种事物.所以我想知道我的观察结果是否正确:

这些常量值是否应始终static readonly适用于所有公开的内容?并且仅const用于内部/受保护/私有值?

您有什么推荐的吗?我是否可能甚至不使用static readonly字段,而是使用属性?

c# constants

1349
推荐指数
14
解决办法
37万
查看次数

如何阻止C#用它们的值替换const变量?

我们有一个项目被编译成一个名为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变量?

c# optimization

61
推荐指数
2
解决办法
3621
查看次数

const与静态只读

可能重复:
const和readonly有什么区别?

因此,从我读到的,在C#中,const并且static readonly在程序执行期间都会使值不可更改.

但是,const应该使用不太可能改变的数量(例如,pi,地球半径,每加仑的窝数等).

另一方面,static readonly应该使用当前不变但可能/将来会改变的值(例如软件版本,算法中的乘数等).

我做对了吗?

c# static const readonly

20
推荐指数
1
解决办法
8009
查看次数

Lock()在静态方法中

我有一个多线程应用程序,使用静态方法写入设置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)

c# locking

19
推荐指数
2
解决办法
3万
查看次数

const,readonly和get in static class之间的区别是什么

我有个问题.最近我发现自己使用了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#

19
推荐指数
1
解决办法
4329
查看次数

c#中readonly关键字/表达式成员之间的区别,哪个更好?

在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)

我遇到过各种论坛和解决方案,建议表达身体的成员用于短手使用,我无法找到它在性能上的差异.

c# c#-6.0

17
推荐指数
3
解决办法
1021
查看次数

如何在C#中将参数默认为DateTime.MaxValue?

我想说:

public void Problem(DateTime optional = DateTime.MaxValue)
{
}
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨DateTime.MaxValue不是编译时常量.

DateTime.MinValue很简单,只需使用默认值(DateTime)

另请参阅" 如何在C#中将参数默认为Guid.Empty? "

我不想使用方法重载,因为我试图驯服的方法有101个参数!

c# optional-parameters c#-4.0

11
推荐指数
2
解决办法
5372
查看次数

为什么可以使用反射更改只读字段的值而不是const的值?

为什么可以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二进制文件中的"硬编码"值是不能修改框架本身的技术限制的原因,因为"它已经设置"或只是一个设计决策.我没有看到任何理由为什么某些地方没有某种"魔法"修改它 …

c# reflection

8
推荐指数
1
解决办法
167
查看次数

在c#中的字段上使用const或readonly修饰符有什么性能优势?

与仅使用私有变量的常规可修改字段相比,使用constreadonly字段是否有任何性能优势.

例如:

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)

在上面的例子中,您可以看到有两个字段:foobaar.这两个都是在课堂之外无法进入的,所以为什么许多人更喜欢在const这里使用,而不仅仅是private.是否const提供任何性能优势?


此问题之前已被社群关闭,因为人们误解了这个问题:" 绩效constreadonly绩效之间有什么区别?" 这里已经回答:const和readonly有什么区别?.
但我的意思是,"通过使用constreadonly不使用其中任何一个,我能获得任何性能优势".

c# performance constants readonly

7
推荐指数
2
解决办法
4773
查看次数

我可以使用反射更改C#中的私有只读继承字段吗?

像在java我有:

Class.getSuperClass().getDeclaredFields()
Run Code Online (Sandbox Code Playgroud)

我如何知道并从超类中设置私有字段?

我知道这是强烈不推荐的,但我正在测试我的应用程序,我需要模拟一个错误的情况,其中id是正确的,而名称不是.但这个Id是私有的.

c# reflection inheritance superclass

5
推荐指数
1
解决办法
2121
查看次数