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

Should I use public properties and private fields or public fields for data?

在我看到的大部分代码中(在deproject.com上,我倾向于在自己的代码中这样做),我看到了为类包含的每个单独的私有字段创建的公共属性,即使它们是get; set;最基本的类型:

1
2
3
4
5
6
private int myInt;
public int MyInt
{
     get { return myInt; }
     set { myInt = value }
}

我的问题是:这与:

1
public int MyInt;

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


湖的文章blog.codinghorror.com http:/ /属性/ VS公共变量

特别

  • 她的作品在不同的变量和属性,如果你依赖上的反射,它更容易使用的所有属性。
  • 你不能对一databind变量。
  • 改变一个变量的变化是一个重大的物业。


三原因:

  • 你不能覆盖域中你可以subclasses样属性。
  • 你可能最终需要的更复杂的getter或setter,但如果这是一场改变API,它会打破。
  • 会议。这只是它的方式做的。
  • 我相信有更多的,我只是需要时间思考。

    在。NET中,你可以使用自动属性到样本:

    1
    public int Age { get; set; }

    "旧学院有自己的私人领域declaring单样本:

    1
    2
    3
    4
    5
    6
    7
    private int age;

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

    这使得它简单的创建一个场,但没有重大变化的问题(在其他的东西)。


    当你创建一个简单的私人和公共财产的字段名称的名字,名字是获取和设置的场值

    1
    2
    3
    4
    public string Name
    {
       get { return name; }
    }

    你使用这类物业是有一天你和你的感觉是,这个类的名称是指物业想靠近lastname场(或你想返回a串"我的名字:"+姓名),你可以改变的代码:在物业

    1
    2
    3
    4
    public string Name
    {
       get { return lastName; //return"My name:"+name; }
    }

    如果你是使用公共字段名称代码是外面然后你会更改名字lastname你到处使用它。


    因为它不会有所作为。公共数据可以改变的对象实例没有知道它。使用吸气和制定的对象是不断变化的意识到已经制造。

    记住,这是唯一的encapsulating数据第一步迈向更好的结构设计,它不向最终目标本身。


    在下列情况下必须使用属性:

  • 当需要将属性中的数据序列化为某种格式时。
  • 当需要重写派生类中的属性时。
  • 当您使用一些逻辑实现get和set方法时。例如,在实现单例模式时。
  • 当从接口派生时,其中声明了属性。
  • 当你有与思考有关的具体问题时。

  • 它……的依赖?

    我总是使用吸气&;制定的,因为他们创造了这个快捷方式:

    公共int foo {获得};集合;

    翻译为它是在编译时。现在你可以得到它的幻想,但它是在那里,如果你需要把它之后,你只是喜欢的拼写。

    然而,公共,私人,保护……它的所有的一物(来吧,可以调整的位置数据。我们使用的焊料和继承,这是一个美国的普通法,因此你一定chidren CAN编辑只读属性。

    1
    2
    3
    4
    5
    protected _foo;  
    public Foo  
    {  
        get { return _foo; }
    } //lack of set intentional.


    简单来说,您的问题的答案是访问修饰符,即public和private。

    如果使用:

    1
    2
    3
    4
    5
    6
    public int myInt;
    public int MyInt
    {
         get { return myInt; }
         set { myInt = value }
    }

    然后,myint属性和myint变量都可以在要修改的项目中使用。意思是,如果你的类假设A是由类假设B继承的,然后myint和myint都可以修改,不能应用任何检查。假设您希望在派生类中设置myint值(如果某个特定条件通过)。

    这只能通过使田地私有化和财产公开来实现。所以只有属性可用,并且可以基于该属性设置条件。


    设置一个私人场A值是只读的变化,但他们在现场制作,你可以把一个物业。例如,您可以设置呼叫后A A值法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private string _email;
    public string Email
    {
        get
        {
            return this._email;
        }
        set
        {
            this._email = value;
            ReplaceList(); //**
        }
    }


    一个是你不小心/ unintentionally改变价值的A级私人场外面。当你使用get和set,你是那类变化的均值和knowingly私人场故意。


    实际上,如果你使用Silverlight,你会意识到这是一场不能集和静态资源,因此你必须使用(A)A物业const访问)。

    我意识到,当我试图federate I区名称使用在复合制导(棱镜)。

    然而,这只是一个新的语言除了staticI / const场总是使用属性。


    点是如果你想继续下来的线,确保每一次myInt引用的东西发生(特别是写一个日志文件,它改变了42到等)?你不能做没有吸气和制定。有时它是一个明智的计划可能需要你,现在需要你所需要的。


    有许多原因为什么。

    问题:

    • 你可以做一些其他的函数当变量是集
    • 你可以设置为只读,防止和get
    • 我们只有一些属性(数据绑定的工作,例如)
    • 你可以隐藏外部物业(也许这是一个ASP.NET ViewState的变量)。

    我不敢相信,有了11个答案,就没有人说过:

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