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

时间:2009-07-30 07:36:26

标签: 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;
  }
}

5 个答案:

答案 0 :(得分:3)

没有办法做到这一点

答案 1 :(得分:2)

没有。该属性是用于控制对私有支持字段的访问的公开接口(不是C#interface)。 C#3中引入的特殊语法就是所谓的“语法糖” - 编译器实际上将它变成了一个私有字段,你从来没有看到过get / set属性来访问它。

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

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

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

答案 2 :(得分:1)

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

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

public String text {get; protected set}

只允许在您的类及其后代中进行公共读取访问和修改

答案 3 :(得分:0)

当您要应用自定义逻辑时,无法执行此操作。如果您有一个简单的属性,您可以这样做:

public int Foo { get; set; }

您还可以设置每个的可见性:

public int Foo { get; private set; }

答案 4 :(得分:0)

对于未定义支持字段的属性,您不能这样做。定义此类属性时,C#编译器会在MSIL中生成名为private的{​​{1}}字段。正如其他海报所指出的,最多可以调整属性上的访问修饰符。

关于这一点也有一些规则,主要是常识:

  • <PropertyName>k_BackingFieldget上的访问控制只能比属性更具限制性。即,您不能拥有私人PropertyName并为其指定set publicget
  • 当属性为set时,您无法确定getsetprivate。最多一个属性可以是public

但是,这是C#编译器提供的所有合成糖。您可以自己提供支持字段,并提供属性的get和set实现。您可以选择制作支持字段private

为两种情况生成的MSIL代码只有细微差别(生成的支持字段包含public属性。生成的System.Runtime.CompilerServices.CompilerGeneratedAttributeget方法也是如此)< / p>