C#,是否可以避免定义私有字段而仍然在公共字段上使用set/get?

C#,是否可以避免定义私有字段而仍然在公共字段上使用set/get?,c#,C#,像这样: public String text {get; set{ // here comes some setter checking / setter logic // finally assign the value to the var without using the setter <is_there_a_"without_setter"_keyword?> text = value; } } 公共字符串文本{get;set{ //下面是一

像这样:

public String text {get; set{
    // here comes some setter checking / setter logic
    // finally assign the value to the var without using the setter
    <is_there_a_"without_setter"_keyword?> text = value;
  }
}
公共字符串文本{get;set{
//下面是一些setter检查/setter逻辑
//最后,不使用setter将值分配给var
文本=值;
}
}

不,没有办法做到这一点

不,没有办法做到这一点

不。属性是用于控制对私有备份字段的访问的公开接口(不是C#
接口
)。C#3中引入的特殊语法被称为“语法糖”——编译器实际上会将其转换为一个私有字段,您永远不会看到它,并使用get/set属性访问它

编辑:属性本身不存储数据。它们只是控制对存储在别处的数据的访问,其中一个常见情况是在私有字段中

另一个编辑:这是我指的sugar语法:

// When this is compiled, it actually creates a private 
// field for you, which the property accesses.
public int MyProperty
{
    get;
    set;
}
否。该属性是用于控制对私有备份字段的访问的公开接口(不是C#
接口
)。C#3中引入的特殊语法被称为“语法糖”——编译器实际上会将其转换为一个私有字段,您永远不会看到它,并使用get/set属性访问它

编辑:属性本身不存储数据。它们只是控制对存储在别处的数据的访问,其中一个常见情况是在私有字段中

另一个编辑:这是我指的sugar语法:

// When this is compiled, it actually creates a private 
// field for you, which the property accesses.
public int MyProperty
{
    get;
    set;
}

如果为setter定义自定义代码,无论多么简单,如果需要,还必须定义get方法

如果不编写此自定义代码,则可以走得更远

public String text {get; protected set}

它只允许在类及其子类中进行公共读取访问和修改

如果为setter定义自定义代码,无论多么简单,如果需要,还必须定义get方法

如果不编写此自定义代码,则可以走得更远

public String text {get; protected set}

它只允许在类及其子类中进行公共读取访问和修改,如果要应用自定义逻辑,则无法执行此操作。如果您有一个简单的属性,则可以执行以下操作:

public int Foo { get; set; }
您还可以设置以下各项的可见性:

public int Foo { get; private set; }

当您要应用自定义逻辑时,没有办法做到这一点。如果您有一个简单的属性,则可以执行以下操作:

public int Foo { get; set; }
您还可以设置以下各项的可见性:

public int Foo { get; private set; }

对于未定义支持字段的属性,不能执行此操作。定义此类属性时,C#编译器会在MSIL中生成一个名为
k#u BackingField
private
字段。正如其他海报所指出的,最多可以调整属性上的访问修饰符

关于这一点也有一些规则,这些规则大多是常识:

  • get
    set
    的访问控制只能比对属性的限制更严格。i、 e.您不能拥有私有PropertyName并为其指定一个
    public
    get
    set
  • 当属性为
    public
    时,不能将
    get
    set
    都定义为
    private
    。最多一个属性可以是
    private
然而,这些都是C#编译器提供的合成糖。您可以自己提供支持字段,并为属性提供get和set实现。您可以选择将支持字段
公开


为这两种情况生成的MSIL代码只有一个微小的区别(生成的支持字段包括
System.Runtime.CompilerServices.CompilerGeneratedAttribute
属性。生成的
get
set
方法也是如此)

对于未定义支持字段的属性,无法执行此操作。定义此类属性时,C#编译器会在MSIL中生成一个名为
k#u BackingField
private
字段。正如其他海报所指出的,最多可以调整属性上的访问修饰符

关于这一点也有一些规则,这些规则大多是常识:

  • get
    set
    的访问控制只能比对属性的限制更严格。i、 e.您不能拥有私有PropertyName并为其指定一个
    public
    get
    set
  • 当属性为
    public
    时,不能将
    get
    set
    都定义为
    private
    。最多一个属性可以是
    private
然而,这些都是C#编译器提供的合成糖。您可以自己提供支持字段,并为属性提供get和set实现。您可以选择将支持字段
公开

为这两种情况生成的MSIL代码只有一个微小的区别(生成的支持字段包括
System.Runtime.CompilerServices.CompilerGeneratedAttribute
属性。生成的
get
set
方法也是如此)