首页 文章

我应该使用公共属性和私有字段或公共字段来获取数据吗?

提问于
浏览
55

在我看过的大部分代码中(在SO上,我都会在我自己的代码中使用codeproject.com),我已经看到为一个类包含的每个私有字段创建公共属性,即使它们是最多的基本类型 get; set; 喜欢:

private int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

我的问题是:这与以下方面有何不同:

public int MyInt;

如果我们应该使用属性而不是公共字段,为什么我们应该在这种特定情况下使用它们呢? (我不是在讨论更复杂的例子,其中getter和setter实际上做了一些特殊的事情,或者只有一个get或set(只读/写)而不是只返回/设置私有字段的值) . 它似乎没有添加任何额外的封装,只在IntelliSense中提供一个漂亮的图标,并放在类图中的特殊部分!

13 回答

  • 8

    实际上,如果你意识到字段不能设置静态资源,那么你将不得不使用一个属性(甚至访问 const ) .

    当我尝试时,我意识到了联合我在复合指导(PRISM)中使用的区域名称 .

    但是,这只是一种语言限制,除了 static / const 字段外,我总是使用属性 .

  • 0

    这个想法是你不应该意外/无意地改变外面的类私有字段的值 . 当您使用get和set时,这意味着您有意且有意地更改了类私有字段 .

  • 0

    原因有很多 .

    主要是:

    • 设置变量时可以执行其他一些功能

    • 您可以阻止设置并仅提供get

    • 某些'things'仅适用于属性(例如,DataBinding)

    • 您可以隐藏属性的实现[也许它是ASP.NET中的ViewState变量) .

  • 21

    关键是 - 如果你想要确保每次 myInt 被引用时都会发生一些特殊情况(写入日志文件,那么没有getter和setter就可以做到这一点 . 有时候为你做什么编程是明智的 . 可能需要,而不是你现在需要的东西 .

  • 0

    这取决于?

    我总是使用getter和setter,因为他们创建了这个快捷方式:

    public int Foo {get;组; }

    在编译时它被翻译 . 现在你无法想象它,但它就在那里,如果你需要得到想象,你只需稍后拼出来 .

    无论是公共的,私人的,受保护的...都是你希望能够调整数据的问题 . 我们经常使用继承,这对我们来说是一种非常常见的方法,所以只有孩子才能编辑某些属性 .

    protected _foo;  
    public Foo  
    {  
        get { return _foo; }
    } //lack of set intentional.
    
  • 5

    看这篇文章http://blog.codinghorror.com/properties-vs-public-variables/

    特别

    • 反射在变量与属性上的工作方式不同,因此如果依赖于反射,则更容易使用所有属性 .

    • 您无法对变量进行数据绑定 .

    • 将变量更改为属性是一个重大变化 .

  • 32

    三个原因:

    • 您不能像子属一样覆盖子类中的字段 .

    • 您最终可能需要更复杂的getter或setter,但如果它是一个字段,更改它会破坏API .

    • 公约 . 那完成了_1316679 .

    我确信有更多的理由我只是没想到 .

    在.Net 3.x中,您可以使用如下自动属性:

    public int Age { get; set; }
    

    而不是旧的学校方式自己像这样声明你的私人领域:

    private int age;
    
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    

    这使得它像创建一个字段一样简单,但没有突破性的变化问题(除此之外) .

  • 0

    当您创建私有字段 name 和实际获取并设置 name 字段值的简单公共属性 Name

    public string Name
    {
       get { return name; }
    }
    

    并且你在类之外的任何地方都使用这个属性,有一天你决定这个类的 Name 属性实际上会引用 lastName 字段(或者你想要返回一个字符串"My name: "名称),你只需更改属性中的代码:

    public string Name
    {
       get { return lastName; //return "My name: "+name; }
    }
    

    如果您在外部代码中的任何地方使用公共字段 name ,那么您必须在使用它的任何地方将 name 更改为 lastName .

  • 2

    那确实有所作为 . 可以在对象实例不知道的情况下更改公共数据 . 使用getter和setter,对象始终知道已经进行了更改 .

    请记住,封装数据只是迈向更好的结构化设计的第一步,它本身并不是最终目标 .

  • 0

    在以下情况下,您必须使用属性:

    • 当您需要将属性中的数据序列化为某种格式时 .

    • 需要覆盖派生类中的属性时 .

    • 使用某些逻辑实现get和set方法时 . 例如,当您实现Singleton模式时 .

    • 当您从接口派生时,声明了属性 .

    • 当您遇到与Reflection相关的特定问题时 .

  • 4

    将值设置为私有字段只会更改该字段,但在属性中将它们设置为可以处理其他参数,例如,您可以在设置值后调用方法

    private string _email;
    public string Email
    {
        get
        {
            return this._email;
        }
        set
        {
            this._email = value;
            ReplaceList(); //**
        }
    }
    
  • -1

    简单来说,回答你的问题是访问修饰符,即公共和私人 .

    如果您使用:

    public int myInt;
    public int MyInt 
    {
         get { return myInt; }
         set { myInt = value }
    }
    

    然后MyInt属性和myInt变量都可以在要修改的项目中使用 . 意思是,如果你的类假设A由类假设B继承,则myInt和MyInt都可用于修改,并且不能应用任何检查 . 假设您希望myInt值可以在某个特定条件通过时在derive类中设置 .

    这只能通过将字段私有和 property 公开来实现 . 因此,只有属性可用,并且可以基于此设置条件 .

  • 0

    我无法相信11个答案,没有人说过这个:

    并非所有私有字段都应作为公共属性公开 . 您当然应该将属性用于任何需要非私有的东西,但是您应该尽可能地保持您的类私有 .

相关问题