C#自动属性不访问这些字段

时间:2014-06-11 13:21:20

标签: c# properties

所以我有一个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

2 个答案:

答案 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; }
    }
}