在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;
}
}
当你涉及到部分类(partial classes)时,C#中的事情变得更加混乱。在C#中,初始化按照文本顺序进行,但是当多个文件为同一个类做出贡献时,这个顺序并没有被完全定义。
不用说,尽可能避免使用部分类!
在某些边角情况下,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; }
}
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.
有一种棘手的情况,即在词法上要调用的函数可以在调用点之后声明,但在语义上不行。这是因为类被认为在类成员函数的主体中完全定义。
$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();
}
我不确定C#,但是在Java中你可以。
这不是C#语言。