【发布时间】:2020-07-16 06:58:27
【问题描述】:
我来自 C++,发现 C++ 和 C# 中的指针之间的行为非常不同。
我惊讶地发现这段代码可以编译......甚至......完美运行。
class C
{
private readonly int x = 0;
unsafe public void Edit()
{
fixed (int* p = &x)
{
*p = x + 1;
}
Console.WriteLine($"Value: {x}");
}
}
这让我很困惑,即使在 C++ 中我们也有保护const 对象的机制(C++ 中的const 与C# 中的readonly 几乎相同,而不是C# 中的const),因为我们没有'没有足够的理由通过指针任意修改 const 值。
进一步探索,我发现在 C# 中没有与 C++ 的 低级 const 指针 等效的东西,类似于:
readonly int* p
如果有的话,在 C# 中。
那么p只能读取指向的对象,不能写入。
对于const 对象,C# 禁止尝试检索其地址。
在 C++ 中,任何修改 const 的尝试都是编译错误或未定义行为。在 C# 中,我不知道我们是否有可能利用它。
所以我的问题是:
- 这种行为真的很明确吗?虽然我知道在 C# 中没有像 C++ 中的 UB 这样的概念
- 如果是这样,我应该如何使用它?还是从不使用?
注意:在评论部分:C++ 中抛弃const 与这个问题无关,因为它只有在指向的对象本身不是const 时才有效,否则它是UB。另外,我基本上是在谈论 C# 和编译时行为。
如果您不完全理解问题,可以要求我提供更多详细信息。我发现大多数人都无法正确理解这一点,也许是我没有说清楚。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c# c++ pointers language-lawyer readonly-attribute