如何解决为什么我不能在 setter 中输入属性名称而不是“value”关键字?
当我通过 value
关键字在 setter 中分配一个值时,它起作用了。但是为什么当我尝试通过属性的名称分配值时它不起作用,它应该保持相同的分配值?
在下面的例子中,我在 setter 中使用了 value
关键字,它工作得很好,我得到了预期的输出 -
private int i = 1;
public int prop
{
get { return i; }
set { i = value }
}
public void Print()
{
Console.WriteLine(i)
}
static void Main ()
{
Program p = new Program();
p.prop = 5;
Console.WriteLine(p.prop); // outputs 5
p.Print(); // outputs 5
}
但在以下示例中,我使用属性名称 prop
而不是 value
关键字,并且它不会将新值分配给 i
变量 -
private int i = 1;
public int prop
{
get { return i; }
set { i = prop }
}
public void Print()
{
Console.WriteLine(i)
}
static void Main ()
{
Program p = new Program();
p.prop = 5;
Console.WriteLine(p.prop); // outputs 1
p.Print(); // outputs 1
}
那么,有什么区别呢?为什么我不能使用应该包含新值的属性名称而不是 value
关键字?
解决方法
因为不一样。这个二传手:
public int prop
{
get { return i; }
set { i = prop; } // here
}
将通过调用 prop
上一行的 getter 来读取 value
的 current 值。关键字 value
专门用于获取要设置的值,您不能将其替换为属性名称,因为这意味着其他含义。
见docs:
set 访问器类似于返回类型为 void 的方法。 它使用一个名为 {{1}} 的隐式参数,其类型是属性的类型。
[...]
当您为属性分配值时,将使用提供新值的参数调用 set 访问器。
,以下关于您的财产的假设 -
哪个应该保持相同的赋值
基本上是错误的。您的属性本身根本没有任何值,它只是返回变量 i
的值。
要获得清晰的图片,请记住,C# 属性只是一对方法的语法糖,并且对于您的属性 -
public int prop
{
get { return i; }
set { i = value }
}
幕后会生成两个方法,看起来像 -
public int get_prop()
{
return this.i;
}
public void set_prop(int value)
{
this.i = value;
}
如您所见,属性中的 value
关键字表示当您尝试为属性设置值时从外部传递的参数的通用名称。所以,当你做类似 -
p.prop = 5;
基本上调用 set_prop
方法时,参数 value
的值是 5。
现在,当您尝试使用您的财产时 -
public int prop
{
get { return i; }
set { i = prop }
}
生成的方法看起来像 -
public int get_prop()
{
return this.i;
}
public void set_prop(int value)
{
this.i = this.prop;
}
如您所见,这段代码完全忽略了从外部传递的 value
参数的值。
您的代码仍在设置该值。它正在调用 get 方法(返回 i
的值)并将已设置的 i
值再次设置为 i
。它只是没有使用传递给它的值。
“value”是传入的参数。
prop = 10 会将值 10 传入 setter,然后您可以抓取并分配给您自己的变量“i”
如果你不使用“value”,你的 setter 就不会真正做任何事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。