我正在学习属性,我不确定以下内容:
class X
{
private int y;
public X(int number)
{
this.Y=number; // assign to property
OR
this.y=number //?
}
public int Y;
{
get; set;
}
}
答案 0 :(得分:1)
使用自动属性(get; set;
或其变体)时,无法访问支持变量。在大多数情况下,这些可以被视为简单的变量,尤其是内部变量。
如果您需要在mutator中执行自定义验证或变异逻辑,或者需要显式支持变量,则不能使用自动属性,但必须写入存根get
和set
方法你自己。
答案 1 :(得分:1)
他们做不同的事情;我会Y = number;
和删除(未使用的)字段y
。在自动实现的属性中,编译器创建它自己的字段(在C#中无法看到可怕的名称) - 您不需要提供自己的字段。所以:
class X
{
public X(int y)
{
Y = y;
}
public int Y { get; set; }
}
其他要点:将number
更改为y
以使调用者更清楚,而且您不需要this.
,因为它不含糊不清(字段与参数等)
答案 2 :(得分:1)
仅分配给表示该字段的属性内的字段(private int y)(public int Y {get; set})。否类中的其他位置应将后备字段分配给直。总是通过属性来做...即使在构造函数中也是如此。它源于不重复自己( DRY )的原则。
这是推荐的,因为以后您希望将某些行为与该分配相关联时,您只有一个地方(设置访问者)将代码写入....并非所有场地被分配到的地方!!
class X
{
private int y; //not strictly necessary but good for documentation
public X(int number)
{
Y = number;
}
public int Y { get; set; }
}
答案 3 :(得分:0)
当您使用autoproperties时:
public int Y;
{
get; set;
}
你不需要私有财产,因为它是自动生成的。所以你的课程将是:
class X
{
public X(int number)
{
Y = number;
}
public int Y // no semicolon here, comment added for edit length
{
get; set;
}
}
希望这有帮助
答案 4 :(得分:0)
您有两种选择:
class X
{
private int y;
public int Y
{
get { return y; }
set { y = value; }
}
public X(int number)
{
Y = number;
//equivalent to
y = number;
// but you should use the public property setter instead of the private field
}
}
或使用自动属性,它甚至更简单:
class X
{
private int y;
public int Y
{
get; set;
}
public X(int number)
{
Y = number;
}
}
答案 5 :(得分:0)
当不使用自动属性时,我总是使用属性设置器,因为在我需要执行的setter中可能存在或将存在代码。此代码可以是域检查或引发诸如PropertyChanged之类的事件。
答案 6 :(得分:0)
我通常会尝试访问支持变量:
有时,公共getter可能包含复杂的数据验证,引发属性更改事件或某些外部代码更改其值时触发的其他复杂代码。
当更改内部(来自类内)时,如果您的目的是跳过来自公共设置器的所有验证和事件,则直接使用支持变量可能是一个有效点。这就像说“我是班级实例,我知道我在做什么”。通过这种方式,公共安装人员就像一只守护狗,消毒外部输入,而我仍然可以在内部将财产设置为我需要的任何东西。
class X
{
private int y; //not strictly necessary but good for documentation
public X(int number)
{
y = GetYValueFromDB(); //we assume the value from DB is already valid
}
public int Y {
get{ return y};
set {
if (ComplexValidation(value)
{
RaiseOnYPropertyChanged();
y = value;
}
}
}