gpt4 book ai didi

c# - 使用 StringBuilder 反射的无垃圾字符串类未正确初始化

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:01 25 4
gpt4 key购买 nike

我正在尝试根据评论创建自定义 StringBuilder 类 here .

这是我当前的代码:

class MyStringBuilder
{
public StringBuilder stringBuilder;
public String linkToStringBuilderString;

public MyStringBuilder(int maxCapacity)
{
stringBuilder = new StringBuilder(maxCapacity, maxCapacity);

linkToStringBuilderString = (String)stringBuilder.GetType().GetField("m_StringValue", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stringBuilder);
}
};

但是,应该获得到内部 StringBuilder 字符串的永久链接的构造函数的最后一行给我一个空引用编译错误,我不明白为什么。

最佳答案

让我们分解失败的行。

我是认真的。字面上地。正如您所发现的,它做的太多了,很难调试。所以让我们重写它。

linkToStringBuilderString = (String)stringBuilder.GetType().GetField("m_StringValue", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stringBuilder);

这会做很多事情。让我们将每个操作放在自己的行中:

var type = stringBuilder.GetType();
var field = type.GetField("m_StringValue", BindingFlags.NonPublic | BindingFlags.Instance);
var value = (String)field.GetValue(stringBuilder);

现在 Visual Studio 应该可以让您更清楚地了解抛出异常时失败的原因。

当我运行这段代码时,我在这一行得到了一个NullReferenceException:

var value = field.GetValue(stringBuilder);

这意味着 field 为空。为什么会这样?那么,如果您请求的字段实际上不存在,GetField() 将返回 null。当您依赖 BCL 类的内部实现细节时,就会发生这种情况。

在 dotPeek 中打开 StringBuilder 类(在 mscorlib 中),我没有看到名为 m_StringValue 的成员。字符串使用一系列动态分配的数组存储;它似乎没有以字符串形式缓存。

查看 mscorlib 的 2.0 版,我发现那里曾经是一个具有此名称的字段。所以当 .NET 4 出来时,这个类显然被重构了。同样,这些都是依赖于内部实现细节的问题。

another article在您链接的网站上详细说明了这个问题。希望这个答案能帮助您在未来指明正确的方向。

关于c# - 使用 StringBuilder 反射的无垃圾字符串类未正确初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com