【问题标题】:Managed Pointer in a Structure C#结构 C# 中的托管指针
【发布时间】:2025-12-20 09:35:11
【问题描述】:

我正在尝试编写一个应该能够解析 xml 文件的通用函数

这里是代码

    public struct XmlArg
    {
        public string Name;
        public Type T;
        public object Value;
    };

    static bool ParseXmlArgs(XmlReader xml, params XmlArg[] args)
    {
        for (int i = 0; i < args.Length; ++i)
        {
            if (xml.MoveToContent() != XmlNodeType.Element || xml.Name != args[i].Name)
            {
                return false;
            }
            args[i].Value = xml.ReadElementContentAs(args[i].T, null);
        }
        return true;
    }

    static void Main(string[] args)
    {
        int a = 0;

        ParseXmlArgs(
            XmlTextReader.Create("C:\\Users\\Yazilim\\Desktop\\XML.xml"),
            new XmlArg[]{
                new XmlArg() { Name = "ErrorCode", T = typeof(int), Value = a}});
    }

我知道我应该将 a 的指针传递给 Value(它的类型当然应该是 object 以外的其他类型)

但我不希望它是非托管方式。

是否有任何托管方式在结构中使用变量的指针?

(函数可能有错或不正确,这不是重点)

【问题讨论】:

  • 我不明白为什么需要指针,C# 中的所有内容都已经是引用类型。请更好地解释您要达到的目标以及问题所在。

标签: c# pointers structure managed


【解决方案1】:

假设您希望 XmlArg.Value 指向a 而不是克隆它的值,那么答案就是“你不能”。 C# 中没有地址运算符,这是有充分理由的,因为您可以在堆栈上创建对变量的引用(就像您的 a 一样)。当您用完范围时,该变量包含垃圾,然后是 ZONK。

【讨论】:

  • 所以我应该使用不安全的上下文?
  • 这是可能的,但我真的不会这样做,因为它完全破坏了 .NET 运行时的安全性。目前我想不出一个简单的解决方案来解决你的问题:-(
  • 我建议你去this问题。有一些解决此限制的提示。例如,如果您的 a 不是值而是引用类型,那么您的代码就可以正常工作。
  • 谢谢,您提供的链接正是我想要的,但不幸的是没有简单的答案:(
【解决方案2】:

看看这个:Struct Pointer Initialization in C#

此外,来自 Microsoft 文档中关于 structs :Structs 还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果需要几个这样的成员,您应该考虑使您的类型一个类。

希望有帮助!

【讨论】: