c# - C# 中的 AddressOf 替代方案

标签 c# address-operator

任何人都可以帮我解决 C# 中关于 VB6 中的 AddressOf 运算符 的替代解决方案吗? AddressOf 返回一个长值。我可以通过什么方式获取 C# 中的输出?

最佳答案

扩展 Harper Shelby 的回答,是的,它可以完成,但在 .NET 中这样做通常是一种代码味道。

要在 C# 中获取变量的地址,可以使用 C 风格的指针 (*)/地址 (&)/解引用 (->) 语法。为此,您必须使用/unsafe 编译器开关来编译应用程序,因为一旦您开始直接处理内存地址,就会跳出托管代码的安全网。

来自 MSDN 的示例说明了大部分情况:

int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());

这会将 number 变量的地址分配给指向 int p 的指针。

这有一些问题:

  1. 必须初始化您要获取其地址的变量。对于默认值类型来说不是问题,但对于引用类型来说是个问题。
  2. 在 .NET 中,变量可以在您不知情的情况下在内存中移动。如果你需要处理一个变量的地址,你真的要使用fixed将变量固定在 RAM 中。
  3. & 只能应用于变量,不能应用于常量或值。 (换句话说,您不能使用像 int* p = &GetSomeInt(); 这样的结构)
  4. 同样,您的代码必须在不安全模式下编译,这会标记 CLR 您将使用托管代码“安全网”之外的功能。

一般来说,我在这个世界上的建议是认真考虑为什么您认为您需要在 .NET 世界中这样做。 .NET 的使命之一是保护开发人员免于违背金属,而此功能与该使命背道而驰。它存在于那些需要它的(罕见的)场景中;如果您只是因为可以而随意使用它,那么您可能误用了它并引入了代码味道。

尽可能避免使用它,但如果绝对必须知道如何使用它。

关于c# - C# 中的 AddressOf 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280953/

相关文章:

c# - .Net RegularExpressionValidator 与 Regex 类的匹配方式不同

c++ - 将静态方法作为参数传递,不需要地址运算符?

c - C 中 mymethod(i) 和 mymethod(&i) 有什么区别?

c++ - 在 C(也是 C++)中, '&' 运算符如何同时用作地址运算符和按位运算符?由于 C 不支持运算符重载

c++ - address of operator 可以初始化一个指针但是填充的值是垃圾

c# - "".All(char.IsNumber) 返回 True

c# - 按可以为 null 的父对象对 IList<Person> 进行排序

c# - 在C#中使用PHP的Webservice

c# - 如何将 IEnumerable<object> 转换为 List<IFoo>,其中每个对象都是一个 IFoo?