C# 中的自定义自动属性
Custom auto properties in C#
我有以下 class 具有自动属性:
class Coordinates
{
public Coordinates(int x, int y)
{
X = x * 10;
Y = y * 10;
}
public int X { get; set; }
public int Y { get; set; }
}
正如您从构造函数中看到的那样,我需要将值乘以 10。
有没有办法在不删除自动属性的情况下做到这一点?
我尝试了以下方法,没想到它会导致递归,然后一切都变得很糟糕
public int X { get {return X;} set{ X *= 10;} }
我想给 X 和 Y 乘以 10 赋值。
Coordinates coords = new Coordinates(5, 6); // coords.X = 50 coords.Y = 60
coords.X = 7; // this gives 7 to X but I would like it to be 70.
为了使 setter 像那样工作,您需要使用支持字段:
class Coordinates
{
public Coordinates(int x, int y)
{
X = x;
Y = y;
}
private int _x;
public int X
{
get { return _x; }
set { _x = value * 10; }
}
private int _y;
public int Y
{
get { return _y; }
set { _y = value * 10; }
}
}
以你的例子为例:
Coordinates coords = new Coordinates(5, 6); // coords.X = 50 coords.Y = 60
coords.X = 7; // this gives 70
但是,我不建议您使用这样的 setter,因为它可能会导致混淆。最好有一个专门的方法来做这样的乘法。最后,您的代码将更具描述性和直观性。
你得到一个递归,因为你再次调用相同的 属性,它又调用相同的 属性,而后者又调用相同的 属性...你得到重点。
public int X { get {return X;} set{ X *= 10;} }
自动属性如何工作?
在幕后 属性实际上是方法,这意味着它们实际上并不存储数据。那么谁来保存数据呢? AutoProperties 生成私有后端字段来保存数据。
所以在auto的简单声明中属性
int X { get; set; }
编译器将其翻译成类似的东西
private int <X>k__BackingField;
public int X
{
[CompilerGenerated]
get
{
return <X>k__BackingField;
}
[CompilerGenerated]
set
{
<X>k__BackingField = value;
}
}
因此,无论您将其用作自动属性还是简单 属性,它们都是相同的。
现在,用意译来回答你的问题,"How do i return the value multiply with 10"
您可以通过两种方式解决:
1.通过保存数据乘以10(setter实现)
2.通过return将数据乘以10(getter实现)
我不会详细说明您应该使用哪一个,因为对于这种简单的场景,两者都是完全有效的。
我只想说选择的一些因素将是微(微微微)性能,真实状态存储。
这是 setter 实现
private int _x;
public int X
{
get
{
return _x;
}
set
{
return _x*10;
}
}
我有以下 class 具有自动属性:
class Coordinates
{
public Coordinates(int x, int y)
{
X = x * 10;
Y = y * 10;
}
public int X { get; set; }
public int Y { get; set; }
}
正如您从构造函数中看到的那样,我需要将值乘以 10。 有没有办法在不删除自动属性的情况下做到这一点?
我尝试了以下方法,没想到它会导致递归,然后一切都变得很糟糕
public int X { get {return X;} set{ X *= 10;} }
我想给 X 和 Y 乘以 10 赋值。
Coordinates coords = new Coordinates(5, 6); // coords.X = 50 coords.Y = 60
coords.X = 7; // this gives 7 to X but I would like it to be 70.
为了使 setter 像那样工作,您需要使用支持字段:
class Coordinates
{
public Coordinates(int x, int y)
{
X = x;
Y = y;
}
private int _x;
public int X
{
get { return _x; }
set { _x = value * 10; }
}
private int _y;
public int Y
{
get { return _y; }
set { _y = value * 10; }
}
}
以你的例子为例:
Coordinates coords = new Coordinates(5, 6); // coords.X = 50 coords.Y = 60
coords.X = 7; // this gives 70
但是,我不建议您使用这样的 setter,因为它可能会导致混淆。最好有一个专门的方法来做这样的乘法。最后,您的代码将更具描述性和直观性。
你得到一个递归,因为你再次调用相同的 属性,它又调用相同的 属性,而后者又调用相同的 属性...你得到重点。
public int X { get {return X;} set{ X *= 10;} }
自动属性如何工作?
在幕后 属性实际上是方法,这意味着它们实际上并不存储数据。那么谁来保存数据呢? AutoProperties 生成私有后端字段来保存数据。
所以在auto的简单声明中属性
int X { get; set; }
编译器将其翻译成类似的东西
private int <X>k__BackingField;
public int X
{
[CompilerGenerated]
get
{
return <X>k__BackingField;
}
[CompilerGenerated]
set
{
<X>k__BackingField = value;
}
}
因此,无论您将其用作自动属性还是简单 属性,它们都是相同的。
现在,用意译来回答你的问题,"How do i return the value multiply with 10"
您可以通过两种方式解决: 1.通过保存数据乘以10(setter实现) 2.通过return将数据乘以10(getter实现)
我不会详细说明您应该使用哪一个,因为对于这种简单的场景,两者都是完全有效的。 我只想说选择的一些因素将是微(微微微)性能,真实状态存储。
这是 setter 实现
private int _x;
public int X
{
get
{
return _x;
}
set
{
return _x*10;
}
}