相关疑难解决方法(0)

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

我想知道,因为可以使用反射完成很多事情,我可以在构造函数完成执行后更改私有只读字段吗?
(注意:只是好奇心)

public class Foo
{
 private readonly int bar;

 public Foo(int num)
 {
  bar = num;
 }

 public int GetBar()
 {
  return bar;
 }
}

Foo foo = new Foo(123);
Console.WriteLine(foo.GetBar()); // display 123
// reflection code here...
Console.WriteLine(foo.GetBar()); // display 456
Run Code Online (Sandbox Code Playgroud)

c# reflection field readonly

111
推荐指数
5
解决办法
5万
查看次数

在.NET 4.5中更改了string.Empty(或System.String :: Empty)的行为

精简版:

C#代码

typeof(string).GetField("Empty").SetValue(null, "Hello world!");
Console.WriteLine(string.Empty);
Run Code Online (Sandbox Code Playgroud)

在编译和运行时,"Hello world!"在.NET 4.0及更早版本下提供输出,但""在.NET 4.5和.NET 4.5.1下提供.

如何像这样忽略对字段的写入,或者,谁重置该字段?

更长的版本:

我从来没有真正理解为什么string.Empty字段(也称为[mscorlib]System.String::Empty)不是const(aka.literal),请参阅" 为什么String.Empty不是常量? ".这意味着,例如,在C#中我们不能string.Empty在以下情况下使用:

  • switch表格中的陈述case string.Empty:
  • 作为可选参数的默认值,如 void M(string x = string.Empty) { }
  • 在应用属性时,例如 [SomeAttribute(string.Empty)]
  • 需要编译时常量的其他情况

这对于众所周知的"宗教战争"是否影响是否使用string.Empty"",请参阅" 在C#中,我应该使用string.Empty或String.Empty还是"来初始化字符串? ".

几年前,我Empty通过反射设置其他字符串实例来自娱自乐,看看BCL有多少部分由于它而开始表现奇怪.这是很多.并且Empty参考的变化似乎在应用程序的整个生命周期中持续存在.现在,有一天我试图重复那个小噱头,但后来使用的是.NET 4.5机器,我再也无法做到了.

(注意!如果您的计算机上安装了.NET 4.5,可能PowerShell仍然使用较旧版本的.NET,请尝试复制粘贴[String].GetField("Empty").SetValue($null, "Hello world!")到PowerShell中以查看更改此引用的一些效果.)

当我试图寻找原因时,我偶然发现了一个有趣的主题:" .NET 4.5 beta版本中FatalExecutionEngineError的原因是什么? ".在该问题的公认答案中,是否注意到通过版本4.0,System.String有一个静态构造函数.cctor,其中Empty设置了字段(在C#源中,当然可能只是一个字段初始化程序),而在4.5中没有静态构造函数存在.在这两个版本中,字段本身看起来都是一样的:

.field public …
Run Code Online (Sandbox Code Playgroud)

.net c# string readonly .net-4.5

40
推荐指数
2
解决办法
1506
查看次数

为什么我不能改变String.Empty的值?

虽然我明白改变价值String.Empty会是一个坏主意,但我不明白为什么我不能这样做.

为了得到我的意思,请考虑以下课程:

public class SomeContext 
{ 
    static SomeContext(){}
    public static readonly string Green = "Green";
    public static readonly SomeContext Instance = new SomeContext();

    private SomeContext(){}
    public readonly string Blue = "Blue";

    public static void PrintValues()
    { 
        Console.WriteLine(new { Green, Instance.Blue, String.Empty }.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个小的控制台应用程序,试图操纵这三个只读字段.它可以成功地将蓝色和绿色变成粉红色,但是Empty保持不变:

        SomeContext.PrintValues();
        ///  prints out : { Green = Green, Blue = Blue, Empty = }
        typeof(SomeContext).GetField("Blue").SetValue(SomeContext.Instance, "Pink");
        typeof(SomeContext).GetField("Green", BindingFlags.Public | BindingFlags.Static).SetValue(null, "Pink");
        typeof(String).GetField("Empty", BindingFlags.Public | BindingFlags.Static).SetValue(null, "Pink");
        SomeContext.PrintValues();
        ///  prints out : { …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection constants immutability

21
推荐指数
1
解决办法
802
查看次数

标签 统计

c# ×3

.net ×2

readonly ×2

reflection ×2

.net-4.5 ×1

constants ×1

field ×1

immutability ×1

string ×1