C#中为啥使用字段封装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中为啥使用字段封装相关的知识,希望对你有一定的参考价值。

参考技术A

我先找来几篇我觉得比较有道理的解释

便于调试

保持字段不出现非法值

我觉得还有十分重要的一点,字段封装可以降低耦合。你可以发现,在接口中不可以定义字段,而可以使用属性。属性的访问器的实现方式是很自由的,你可以赋值之后直接保存到文件中,可以取值的时候通过一系列计算再返回值。而定义成字段后,对于这个类本身就什么都不知道了,而且它的子类也不能对其获取方式进行修改。(以及还有一点我没试过,如果我本身用的是字段,改成属性后,其他调用这个类库的项目会不会需要重新生成。)

参考技术B 对字段封装之后可以更好的去调用,就像一个属性一样。
而且封装之后对后期断点差错也有很大的帮助,因为你可以分开筛选,比如“这个字段什么时候被赋值了”,“这个字段什么时候被提取值了”本回答被提问者采纳

C# 自动属性来包装私有字段?

【中文标题】C# 自动属性来包装私有字段?【英文标题】:C# Automatic properties to wrap private fields? 【发布时间】:2013-07-09 11:50:49 【问题描述】:

我可以通过 C# 中的自动属性封装私有字段吗?当我使用 C# 属性时,我当然可以封装私有字段。

private string owner;
public string Owner

  get  return owner; 
  set  owner=value;

当我使用自动属性时会发生什么?

public string Owner  get; set; 

那样我只与属性本身交互,对吗?有没有办法使用自动属性来封装私有字段?它是如何工作的?

【问题讨论】:

如果你想减少输入然后创建私有字段并按'ctrl+r'和'ctrl+e' 【参考方案1】:

有没有办法使用自动属性来封装私有字段?

是的;这正是自动实现的属性。简单地说:编译器为你声明了这个字段——你永远不会直接看到这个字段。也许这里真正的问题应该是:

如果我使用自动实现的属性,我可以直接访问底层字段吗?

答案是:不;只需访问该属性。在 JIT 内联之后,您将永远不会知道其中的区别无论如何

【讨论】:

如果成员属于结构类型,或者代码需要将其作为ref 参数传递给任何对象,则差异可能很大。【参考方案2】:

没有办法按照你的要求去做。

自动属性定义了一个字段,但它是隐藏的,并在编译时创建。

如果问题是打字并且您正在使用 Visual Studio

只需在编辑器中键入 propfull 并双击 TAB,Visual Studio 将自动在其中创建一个属性和一个字段,其中包含您指定的名称。

【讨论】:

【参考方案3】:

私有字段是在编译时创建的,具有唯一的名称,它在幕后使用。实现了自动属性,因此如果您在 setter 上添加验证,您的类型接口不会改变。然后,在您的班级中,您应该引用公共财产。这样,当您将验证添加到 setter 时,您的类将没有特权来通过验证过程(如果要实现的话)。

【讨论】:

【参考方案4】:

C# 中的默认属性编译为具有公共 getter 和 setter 的私有字段。

这个

public string Nameget;set;

编译成这样:

private string name
public string Name

    get
    
        return name;
    
    set
    
        name = value;
    

(其实并没有,变量名不同,使用了accessor/mutators,但本质上是一样的)

【讨论】:

【参考方案5】:

对象向外界呈现的方式有所不同,具体取决于值是否公开为:

    public string Owner  get; set; 

这是一个属性,或者

    public string Owner;

这是一个字段。

如果您有一个私有变量,则不需要自动属性,因为它是类中的字段还是属性对您来说并不重要。如果您以后确实想在外部公开它,那就是您开始编写如下代码的时候:

    private string myPrivateValue;

    public string myPrivateValueAsProperty 
        get  return myPrivateValue; 
        set  myPrivateValue = value; 
    

【讨论】:

【参考方案6】:

您提供的两段代码都是相同的,并且在您的情况下具有相同的效果。但是,可以使用本地私有属性或者更确切地说带有支持字段的属性来提供默认值。

private string owner = "I am the Owner";
public string Owner

  get  return owner; 
  set  owner=value;

此外,如果要在内部进行任何验证,则使用支持字段。

private string owner = "I am the Owner";
public string Owner

  get  return owner; 
  set 
   
        if(!string.IsNullOrEmpty(value))
              owner=value;
  

它们有时也用于通知财产。

private string owner = "I am the Owner";
public string Owner

  get  return owner; 
  set 
   
       owner=value;
       NotifyPropertyChanges("Owner");
  

希望对你有帮助。

【讨论】:

【参考方案7】:

有趣。顺便说一句,在 VB.NET 中,您还可以从简写的属性声明中获得自动生成的私有字段,但是您可以直接访问它们并与之交互(如果你想要/需要的话):

...
    Public Property PropertyName As Object = Nothing

    Sub New()
        _PropertyName = "123"
    End Sub
...

自动生成的私有字段名称是总是带有下划线前缀的属性名称。 (注意:它不是 _camelCased,它与 _PropertyName 的大小写相同。)

【讨论】:

以上是关于C#中为啥使用字段封装的主要内容,如果未能解决你的问题,请参考以下文章

c#封装和类的属性课堂上机练习

C# PropertyGrid 简单使用

C# 自动属性来包装私有字段?

C#封装字段

C# 类属性封装字段的详解

为啥 Type.GetFields() 不返回基类中的支持字段?