我不是Java程序员.我阅读了关于"final"的文档,并将其理解为"变量的值可以设置一次且只能设置一次".
我正在将一些Java翻译成C#.代码未按预期执行.我试图找出原因,并发现最终的一些用途没有意义.
代码段1:
final int[] PRED = { 0, 0, 0 };
...
PRED[1] = 3;
Run Code Online (Sandbox Code Playgroud)
PRED [1]会是0还是3?
代码段2:
final int[] PRED = new int[this.Nf];
for (int nComponent = 0; nComponent < this.Nf; nComponent++) {
PRED[nComponent] = 0;
}
...
PRED[1] = 3;
Run Code Online (Sandbox Code Playgroud)
肯定PRED [0]将保持为0?
我认为final当它应用于Java中的数组时,您对关键字语义有误解.
在两个Java示例中,数组将保持不变,但其元素可能会更改.您的所有分配都将正确执行,并且存储在数组中的值将会更改.但是,如果你试试
final int[] PRED = new int[this.Nf];
// some other code
PRED = new int[123]; // <<== Compile error
Run Code Online (Sandbox Code Playgroud)
你会看到一个编译错误.
将代码转换为C#时,您可能需要将其转换final为sealed(当应用于a时class)或as readonly(当应用于成员时).readonlyC#中的数组语义和finalJava中的数组是相同的:您的程序无法重新分配数组,但它可以自由地修改其元素.
最后,有一个特定于Java的情况,当final你在C#中根本不需要它时:当你需要在Java中的匿名本地类的方法中使用变量时,你必须创建该变量final.由于C#没有匿名本地类,因此您需要使用其他内容(也许使用匿名委托)来翻译该段代码.此类委托不限于使用只读变量.