所以我有一个Point类。它有x,y和z字段。 我已经实现了我的重载构造函数:
public Point(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
大写字母是我自动实施的属性。
public int X { get ; set; }
public int Y { get ; set; }
public int Z { get ; set; }
所以这就是问题所在。当我实例化一个Point对象
时Point p = new Point(2, 3, 4);
并输出我得到的X,Y和Z属性,它们都是零!所以我更改了构造函数以直接更改_z字段而不是使用属性。 我用一个断点跑了视觉工作室并看到了
_x = 0
_y = 0
_z = 0
X = 2
Y = 3
Z = 4
我对自动属性的作用缺少什么? 这与我每次使用自动属性时都不会使用字段的警告有关,对吗?
注意:我是否正确使用了术语字段?我有一个适度的c ++知识,他们和私人数据成员一样吗?!
编辑: Thanx家伙的反馈和抱歉不够清楚。
private int _x, _y, _z;
public Point(int x, int y, int z)
{
X = x;
Y = y;
Z= z;
}
所以这些是我的字段(假设字段表示私有数据成员) 和我重载的构造函数。 以前的visual studio输出是在我更改构造函数之前(对不起abt那个) 现在当我改变构造函数以直接更改_z时
public Point(int x, int y, int z)
{
X = x;
Y = y;
this._z= z;
}
这是输出
_x = 0
_y = 0
_z = 4
X = 2
Y = 3
Z = 0
答案 0 :(得分:2)
您正在检查从未使用过的字段,它们与您的属性无关。
因此要么不使用自动实现的属性,要么使用支持字段
private int _x;
private int _y;
private int _z;
public Point(int x, int y, int z)
{
_x = x;
_y = y;
_z = z;
}
public int X
{
get { return _x; }
set { _x = value; }
}
public int Y
{
get { return _y; }
set { _y = value; }
}
public int Z
{
get { return _z; }
set { _z = value; }
}
或删除字段并仅使用自动实现的属性
public int X { get ; set; }
public int Y { get ; set; }
public int Z { get ; set; }
我总是使用前一种方法,因为后者需要经常更改,例如,如果我想添加逻辑或更改访问权限。
答案 1 :(得分:1)
如果您想在属性中使用私有字段,请实现以下属性:
public class Point
{
private int _x;
private int _y;
private int _z;
public Point(int x, int y, int z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public int X
{
get { return this._x; }
set { this._x = value; }
}
public int Y
{
get { return this._y; }
set { this._y = value; }
}
public int Z
{
get { return this._z; }
set { this._z = value; }
}
}