【问题标题】:Does C# have a way of creating an alias of a local variable?C# 有办法创建局部变量的别名吗?
【发布时间】:2018-03-04 16:36:04
【问题描述】:

我知道这似乎微不足道,编译器可能会进行优化,但假设我有一段代码

for (i = 0; i < str.Length; ++i)
{
    Console.WriteLine(str[str.Length - i]);

}

我想这样写

for (int i = 0, n = str.Length; i < n; ++i)
{
    Console.WriteLine(str[n - i]);
}

但我不想从副本n = str.Length 中获得额外的内存。有什么方法可以让我简单地说n 指向str.Length 而不会创建任何额外的内存?

【问题讨论】:

  • 它需要存储在内存中的某个位置。在这种情况下,长度是一个整数,因此即使您使用指针,指针也会占用相同的空间。顺便说一句,在这两个版本中,您都会得到 index out of range 异常。
  • 我认为他的意思类似于预处理器定义。
  • 如果您负担不起int 的分配,您就没有在.net 中写作的能力。
  • 您的目标硬件是什么,其中一个临时 int 变量会产生任何影响?烤面包机?
  • @jdweng 这有什么关系?

标签: c# .net


【解决方案1】:

您可以执行以下操作,它允许您将多个指针指向单个原始值类型的引用。因此,这可以防止对象被克隆(它的值被复制和分配)。

unsafe{
   int targetValue = 200;
   int* ptr1 = &targetValue;
   int* ptr2 = &targetValue;
   targetValue = 400;
   Console.WriteLine("{0} {1}", *ptr1, *ptr2);
}

输出将是400 400

【讨论】:

  • 当然你只是分配了一个4/8字节的指针以避免分配一个4字节的int
  • @Rotem:没错,但我认为这是最接近问题的答案,因为标题要求为局部变量创建委托。
  • @oliver:我同意你的看法。重点只是为了证明在 C# 中您可以为我提到的局部变量创建委托。
  • 你不需要 unsafe 来做这个 - 在最近的 C# 版本中你可以使用“ref locals”:ref int n = ref targetValue; - 工作完成
  • @Transcendent 在 C# 7.0 及更高版本中
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 2020-12-30
  • 2023-04-07
  • 2012-01-11
  • 1970-01-01
  • 2011-11-26
  • 2022-06-16
相关资源
最近更新 更多