是否可以仅指定自动属性的一个操作(获取/设置)并使另一个实现?

use*_*166 0 c# properties

我对C#很陌生,并且完全是自学成功的试验和(很多)错误,所以如果这是一个愚蠢的问题,请提前道歉.

到目前为止,在创建类时,我几乎只是公开了每个变量,所以我可以用它们做我想做的事.

在阅读了很多关于为什么这是一个坏主意(不是我完全理解它)之后,我现在倾向于写道:

public string name { get; set; }
Run Code Online (Sandbox Code Playgroud)

而不是我之前使用的:

public string name;
Run Code Online (Sandbox Code Playgroud)

我理解这是简单的简写(我可以看出为什么它对插入断点很有用,并且使用如下公式字符串{get; private set;}.

但是,以下是什么简写:

private double _grip;
public double grip
{
    get
    {
        return _grip;
    }
    set
    {
        if (value > 100) { _grip = 100; }
        else if (value < 0) { _grip = 0; }
        else { _grip = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我想在变量上添加条件时,必须声明一个私有变量似乎有点笨拙.

我想写的是这样的:

public double grip
{
    get;
    set
    {
        if (value > 100) { grip = 100; }
        else if (value < 0) { grip = 0; }
        else { grip = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦get和set最小化,就可以整齐地放在一条线上.然而,这不起作用(虽然我确实得到了我的第一个堆栈溢出错误,这很有趣).

所以 - 上面有一个简短的手?我试图搜索和阅读很多信息,getters并且setters找不到这样做的东西.

Sel*_*enç 5

不,如果您为自己的某个方法(gettersetter)提供自定义实现,则您的属性不再是自动实现的属性.因此,您需要继续使用此版本:

private double _grip;
public double grip
{
    get
    {
        return _grip;
    }
    set
    {
        if (value > 100) { _grip = 100; }
        else if (value < 0) { _grip = 0; }
        else { _grip = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的原因是因为您无权访问支持自动属性的编译器生成的私有成员,因此`grip = value`不起作用. (2认同)