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

时间:2009-02-19 10:37:51

标签: java c#

在C ++中,如果我在调用方法之后声明它,则无法使用方法。

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

12 个答案:

答案 0 :(得分:28)

方法的声明顺序在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#中以文本顺序进行,但是当您有多个文件对同一个类做出贡献时,该顺序没有完全定义。

毋庸置疑,尽可能避免这种情况!

答案 1 :(得分:26)

不。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

方法的声明是通过其实现完成的。您还不需要跟踪文件包含,这样只要它们位于同一名称空间中,类就会相互了解。

答案 4 :(得分:1)

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

  

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

它不在C#中。

答案 7 :(得分:0)

既不是C#也不是Java。

答案 8 :(得分:0)

变量应该在使用它的方法中可访问。如果在使用之前或之后宣布它无关紧要。

答案 9 :(得分:0)

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

  

$ 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;
    a.f();
}

答案 10 :(得分:0)

在某些极端情况下,方法/构造函数的顺序在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> T bar() { return null; }
}

答案 11 :(得分:0)

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

   final List<int[]> intArrays = Arrays.stream(testarray).collect(Collectors.toList());
   final List<Integer> integers = intArrays.stream().flatMap(z -> 
                  Arrays.stream(z).boxed()).collect(Collectors.toList());

unless you add comments like:
final List<int[]> 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<Integer> 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. 
像我说的那样,代码基本上都是乱码。无论您使用何种语言,都可以帮助自己和其他可能查看代码并以逻辑顺序编写代码的人。 (再次,请使用评论!你以后会感谢我。)