在C ++中,如果我在调用方法之后声明它,则无法使用方法。
此订单是否与Java或C#等其他语言相关?
答案 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.
像我说的那样,代码基本上都是乱码。无论您使用何种语言,都可以帮助自己和其他可能查看代码并以逻辑顺序编写代码的人。 (再次,请使用评论!你以后会感谢我。)