为什么这在 C# 中不合法?
Why is this not legal in C#?
这行不通
public class Foo {
private int X { get; }
public Foo(string s) {
int.TryParse(s, out X);
}
}
但这行得通:
public class Foo {
private int X { get; }
public Foo(string s) {
int x;
int.TryParse(s, out x);
X = x;
}
}
两者有什么区别,因为out
参数不需要初始化。为什么 属性 不能作为输出参数传递?
我假设这是 C# 6.0,因为你有一个 get
-only 属性.
它不起作用,因为不能通过引用传递属性。在 C# 中采用 ref int
或 out int
参数的函数类似于在 C++ 中采用 int&
的函数。
但是 int
属性 而不是 只是某个地址的 int
。 属性 可以 运行 它想要在 get
和 set
中使用的任何代码。并且该语言不应将自动实现的 属性 视为特殊的。
如果我编写如下代码会怎样?
public class Foo {
private int X {
get { return 0; }
set { }
}
public Foo(string s) {
int.TryParse(s, out X);
}
}
根本没有任何 int
的地址可以传递给 TryParse
。代码是否允许的规则不允许查看get
和set
实现。
请注意,这工作正常:
public class Foo {
private int X;
public Foo(string s) {
int.TryParse(s, out X);
}
}
当您使用 out
时,在后台它实际上是一个内存地址,它被传递给您调用的函数。 属性 不是变量而是函数,您不能获取它的地址,因此不能传递 属性 来代替 out
参数。
成员变量(或局部变量)占用内存,编译器可以获取它们的地址并传递它,因此它适用于变量但不适用于属性。
这行不通
public class Foo {
private int X { get; }
public Foo(string s) {
int.TryParse(s, out X);
}
}
但这行得通:
public class Foo {
private int X { get; }
public Foo(string s) {
int x;
int.TryParse(s, out x);
X = x;
}
}
两者有什么区别,因为out
参数不需要初始化。为什么 属性 不能作为输出参数传递?
我假设这是 C# 6.0,因为你有一个 get
-only 属性.
它不起作用,因为不能通过引用传递属性。在 C# 中采用 ref int
或 out int
参数的函数类似于在 C++ 中采用 int&
的函数。
但是 int
属性 而不是 只是某个地址的 int
。 属性 可以 运行 它想要在 get
和 set
中使用的任何代码。并且该语言不应将自动实现的 属性 视为特殊的。
如果我编写如下代码会怎样?
public class Foo {
private int X {
get { return 0; }
set { }
}
public Foo(string s) {
int.TryParse(s, out X);
}
}
根本没有任何 int
的地址可以传递给 TryParse
。代码是否允许的规则不允许查看get
和set
实现。
请注意,这工作正常:
public class Foo {
private int X;
public Foo(string s) {
int.TryParse(s, out X);
}
}
当您使用 out
时,在后台它实际上是一个内存地址,它被传递给您调用的函数。 属性 不是变量而是函数,您不能获取它的地址,因此不能传递 属性 来代替 out
参数。
成员变量(或局部变量)占用内存,编译器可以获取它们的地址并传递它,因此它适用于变量但不适用于属性。