C# 是否可以只指定自动属性的一个操作(get/set)并实现另一个操作?

C# 是否可以只指定自动属性的一个操作(get/set)并实现另一个操作?,c#,properties,C#,Properties,我对C#还很陌生,完全自学了尝试和(很多)错误,所以如果这是一个愚蠢的问题,请提前道歉 到目前为止,在创建类时,我几乎只是将每个变量都公开,这样我就可以随心所欲地使用它们 在阅读了很多关于为什么这是一个坏主意的文章后(我并不完全理解),我现在倾向于写: public string name { get; set; } 与我以前使用的不同: public string name; 当它这么简单的时候,我就理解了速记(我可以理解为什么它对于插入断点和使用公共字符串名称{get;private s

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

到目前为止,在创建类时,我几乎只是将每个变量都公开,这样我就可以随心所欲地使用它们

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

public string name { get; set; }
与我以前使用的不同:

public string name;
当它这么简单的时候,我就理解了速记(我可以理解为什么它对于插入断点和使用公共字符串名称{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; }
    }
}
private双夹;
公共双把手
{
得到
{
回握;
}
设置
{
如果(值>100){u grip=100;}
如果(值<0){u grip=0;}
else{u grip=value;}
}
}
每次我想对变量设置条件时都必须声明一个私有变量,这似乎有点笨拙

我想写的是这样的:

public double grip
{
    get;
    set
    {
        if (value > 100) { grip = 100; }
        else if (value < 0) { grip = 0; }
        else { grip = value; }
    }
}
公共双夹点
{
得到;
设置
{
如果(值>100){grip=100;}
如果(值<0){grip=0;}
else{grip=value;}
}
}
一旦get和set被最小化,就把它整齐地放在一行上。但是这不起作用(尽管我第一次遇到堆栈溢出错误,这很有趣)


那么-上面有没有简写的方法呢?我试着搜索和阅读了很多关于
getter
setter
的信息,但是找不到可以这样做的东西。

没有,如果您为其中一个方法(getter或setter)提供自定义实现的话您的属性不再是自动实现的属性。因此您需要继续使用此版本:

private double _grip;
public double grip
{
    get
    {
        return _grip;
    }
    set
    {
        if (value > 100) { _grip = 100; }
        else if (value < 0) { _grip = 0; }
        else { _grip = value; }
    }
}
private双夹;
公共双把手
{
得到
{
回握;
}
设置
{
如果(值>100){u grip=100;}
如果(值<0){u grip=0;}
else{u grip=value;}
}
}

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

private double _grip;
public double grip
{
    get
    {
        return _grip;
    }
    set
    {
        if (value > 100) { _grip = 100; }
        else if (value < 0) { _grip = 0; }
        else { _grip = value; }
    }
}
private双夹;
公共双把手
{
得到
{
回握;
}
设置
{
如果(值>100){u grip=100;}
如果(值<0){u grip=0;}
else{u grip=value;}
}
}

之所以如此,是因为您无法访问编译器生成的支持自动属性的私有成员,所以
grip=value
不起作用。@RobertHarvey之所以如此,是因为C#规范说/允许:|@user2864740:事实上,这是真的真正原因是beca使用编译器符合C#规范。该规范规定:“由于支持字段不可访问,因此只能通过[自动]属性访问器读取和写入,即使在包含类型中也是如此。”之所以如此,是因为您无法访问编译器生成的支持自动属性的私有成员,所以
grip=value
不起作用。@RobertHarvey之所以如此,是因为C#规范中说/允许:|@user2864740:实际上,之所以如此,是因为编译器符合C#规范。该规范规定:“由于支持字段不可访问,因此只能通过[automatic]属性访问器读取和写入,即使在包含类型中也是如此。”