- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑 TranslateAllCoords
静态函数:
static class CoordinateTransformation
{
public static void TranslateAllCoords(ref int x, ref int y, ref int z,
int amount)
{
x+=amount;
y+=amount;
z+=amount;
}
}
然后,稍后在代码中,您有:
int x=0, y=0, z=0;
...
CoordinateTransformation.TranslateAllCoords(ref x, ref y, ref z, 5);
...
但是,通过调用 TranslateAllCoords,您实际上是在修改值类型(即整数坐标),并且通常值类型应该是不可变的。这里是否违反了一些规则,或者这是一个完全有效的构造,它通过仅修改内置值类型来绕过“值类型应该是不可变的”构造?
最佳答案
值 是不可变的。包含值类型的变量是可变的。变量各不相同,这就是它们被称为“变量”的原因。
值类型应该是不可变的设计指南本质上是说您不应该尝试只更改变量的一部分。当你说
struct Point { public int X; public int Y; public int Z; }
...
Point p = new Point();
p.X = 123;
那么你所说的是“只改变变量 p 的一部分”。这令人困惑。变量p在逻辑上应该代表一个点,一个点就是一个值。如果你想改变 p,那么通过给它分配一个新的点从逻辑上改变整个事物。不要将一个点突变为另一个点。
但即使我们让点不可变:
struct Point { public int X { get; private set; } ... etc }
那么该类型的变量仍然可以变化!
Point p = new Point(123, 456, 789);
p = new Point(100, 200, 300);
但现在很明显,整个变量正在改变到一个新的点,而不是我们试图改变变量的特定部分。
使用不可变值类型,您可以更明智地进行转换:
static Point Translate(Point p, int offset)
{
return new Point(p.X + offset, p.Y + offset, p.Z + offset);
}
...
Point p = new Point(100, 200, 300);
p = Translate(p, 5);
再一次看到,p 发生了变异,但它是一次性全部变异的,而不是一次一点一点地变异。
关于c# - 值类型的可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166691/
我遇到了 python 问题..我有一个二叉树节点类型: class NODE: element = 0 leftchild = None rightc
这个问题已经有答案了: Local (?) variable referenced before assignment [duplicate] (3 个回答) 已关闭 4 年前。 我有一些来自初学者编
class TestClass(object): def __init__(self): self.value = 100 self.x = lambda: s
谁能解释为什么下面的代码会编译,但如果我注释掉一行,那么它不会,即使代码本质上在做同样的事情? struct OtherStruct { x: i32, } struct Inner { bl
我有一个在同一主机上运行的 TCP 客户端和服务器。客户端发送消息,服务器确认该消息,然后客户端发送下一条消息。在任何时刻,都只有一条未处理的未确认消息。消息大小为 1KB。家庭计算机运行CentOs
我是 Panda 的 Dataframe 的新手,如果有人可以通过以下示例向我简要讨论 DataFrame 的可变性,我将不胜感激: d1=pd.date_range('1/1/2016',perio
在 C++ 编程语言第 4 版的第 16.2.9.4 节“通过间接实现的可变性”中,有一个使用间接代替 mutable 关键字进行惰性求值的示例的草图。 struct cache { bool
我对 Haskell 了解不多,但从我读到的关于计算的可变性(例如:函数返回函数、复杂的 monad 和函数等)的内容来看,你似乎可以做很多元编程,即使在运行时。 如果像函数和 monad 这样的一切
在 Python 中,globals() 返回全局符号表的表示,而 locals() 返回本地状态的表示。虽然两者都返回字典,但对 globals() 的更改会在全局符号表中生效,而对 locals(
我正在关注斯坦福算法 MOOC 并尝试使用 Haskell 解决问题。许多算法需要大量的数据处理,纯解决方案的运行速度比人们为命令式语言引用的基准要慢得多。所以我觉得我需要使用可变数据结构。 大多数
在 react 井字游戏中 tutorial ,为什么他们必须使用 Array.slice()? handleClick(i) { const squares = this.state.square
在 react 井字游戏中 tutorial ,为什么他们必须使用 Array.slice()? handleClick(i) { const squares = this.state.square
在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中有更多信息附加到枚举值,而不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如以下简单示例所示: public se
我是一名优秀的程序员,十分优秀!