声明的顺序在Java / C#中是否重要?

在C ++中,如果我在调用方法之后声明它,我就不能使用它。

此订单是否与Java或C#等其他语言相关?

方法的声明顺序在C#或Java中永远不重要。 同样,在它使用的变量之前或之后声明方法也无关紧要。

变量的声明顺序可能很重要,但是,当它们被初始化时,它们取决于另一个变量。 例如(C#):

using System; class Test { static int x = 5; static int y = x; static void Main() { // Prints x=5 y=5 Console.WriteLine("x={0} y={1}", x, y); } } 

但:

 using System; class Test { static int y = x; static int x = 5; static void Main() { // Prints x=5 y=0 Console.WriteLine("x={0} y={1}", x, y); } } 

Java可以防止出现这种情况,但很容易模仿:

 public class Test { static int y = getInitialValue(); static int x = 5; public static void main(String args[]) { System.out.println("x=" + x + " y=" + y); } static int getInitialValue() { return x; } } 

在C#中,当涉及到部分类时,事情会变得更加混乱。 初始化在C#中以文本顺序发生,但是当您有多个文件对同一个类做出贡献时,该顺序未完全定义。

不用说,尽可能避免这种情况!

不。

不,编译器会执行两次传递。

在Java和c#中都没有单独的方法声明。

该方法的声明是通过其实现完成的。 您也不需要跟踪文件包含,以便类知道彼此,只要它们在同一名称空间中。

对于Java,权威的答案隐藏在Java语言规范的第1章(简介)中(“JLS”,第3版,可在线免费查看):

声明顺序仅对局部变量,本地类以及类或接口中字段的初始化顺序有重要意义。

我不确定c#,但在java中你可以。

它不在C#中。

既不是C#也不是Java。

变量应该在使用它的方法中可访问。 如果在使用之前或之后声明它并不重要。

有一个棘手的情况,在词法上,要调用的函数可以在调用点之后声明,但不能在语义上声明。 这是因为该类被认为是在类成员函数的主体中完全定义的。

$ 9.2.2 – “类在类别说明符的结束时被认为是一个完全定义的对象类型(3.9)(或完整类型)。在类成员规范中,该类在函数体内被视为完整,默认参数和构造函数ctor-initializers(包括嵌套类中的这类东西)。否则它在自己的类成员规范中被认为是不完整的。“

 struct A{ void f(){g();} // OK to call 'g' even if the compiler has not seen 'g' as yet void g(){}; }; int main(){ A a; af(); } 

在某些极端情况下,方法/构造函数的顺序在Java中很重要:

 class Callee { private static void bar(int i) { } // compilation error if first public static void bar(String s) { } // ok if this method is first } class Caller { private void foo() { Callee.bar(bar()); } private  T bar() { return null; } } 

这些答案是相互矛盾的,这使得事情难以理解。 最佳实践是按照常识时间顺序声明您的方法,变量等,这样就不存在混淆,这是所有编程语言的。 你的主要始终是第一个,所以CAN可以在开头或结尾,但是,你应该从main开始,当你在main中调用一个方法时,它应该是main之后的下一个方法,依此类推。 至少对我而言,这是最有意义的,并且使代码最具可读性(评论也有很多帮助,因为让我们面对它,代码真的是胡言乱语)。 我不是编码专家,但我知道任何算法的最佳实践是将其分解为所需的许多简单步骤(请注释)。 这没有意义:

  final List intArrays = Arrays.stream(testarray).collect(Collectors.toList()); final List integers = intArrays.stream().flatMap(z -> Arrays.stream(z).boxed()).collect(Collectors.toList()); unless you add comments like: final List intArrays = Arrays.stream(testarray).collect(Collectors.toList()); // this makes a List (of ints) variable type that cannot be changed based on the stream of //(the testarray in this case) and uses the Collector method to add the ints //to intArrays (our variable name) final List integers = intArrays.stream().flatMap(z -> Arrays.stream(z).boxed()).collect(Collectors.toList()); // I would have to look this up, because I honestly have no clue what it does exactly. 

就像我说的,代码基本上都是胡言乱语。 无论您使用何种语言,都可以帮助自己和其他可能查看您的代码并以逻辑顺序编写代码的人。 (再次,请使用评论!稍后你会感谢我。)