当前位置:  开发笔记 > 编程语言 > 正文

自动实现的getter和setter与公共字段

如何解决《自动实现的getter和setter与公共字段》经验,为你挑选了4个好方法。

我看到很多C#类的示例代码执行此操作:

public class Point {
    public int x { get; set; }
    public int y { get; set; }
}

或者,在旧代码中,具有显式私有支持值并且没有新的自动实现属性:

public class Point {
    private int _x;
    private int _y;

    public int x {
        get { return _x; }
        set { _x = value; }
    }

    public int y {
        get { return _y; }
        set { _y = value; }
    }
}

我的问题是为什么.在执行上述操作与仅将这些成员设为公共字段之间是否有任何功能差异,如下所示?

public class Point {
    public int x;
    public int y;
}

为了清楚起见,当您需要对基础数据进行一些翻译时,我理解了getter和setter的价值.但是,如果你只是传递价值观,那似乎是不必要的冗长.



1> Dexter..:

我倾向于同意(它似乎不必要地冗长),虽然这已成为我们团队尚未解决的问题,因此我们的编码标准仍然坚持所有类的详细属性.

杰夫阿特伍德几年前处理过这个问题.他回顾性地指出的最重要的一点是,从一个领域转变为一个属性是你的代码中的一个重大变化 ; 任何消耗它的东西都必须重新编译才能使用新的类接口,所以如果你控制之外的任何东西都在消耗你的类,你可能会遇到问题.


在C#中,具有get和set的属性编译为一对方法,如get_PropertyName()和set_PropertyName(type value).C#中的属性语法只是语法糖.属性可以执行代码,因此将它们编译为与字段相同的代码是没有意义的.
JIT编译器确实优化了一个属性,没有代码等同于一个字段,因此没有理由不使用C#3.0+中的简写语法来使用属性

2> Brad Wilson..:

稍后将其更改为更简单:

public int x { get; private set; }


我...甚至不知道你能做到这一点.
@Merus仅在C#3.0中

3> Joseph Daigl..:

它封装了这些成员的设置和访问.如果从现在起一段时间,代码的开发人员需要在访问或设置成员时更改逻辑,则可以在不更改类的合同的情况下完成.


@ Ajedi32从技术上来说他们不是*同一份合同.如果将其从字段更改为属性(或将属性更改为字段),则必须重新编译访问该成员的任何内容.因为在访问属性与字段时编译的IL不同.

4> Rob Pilkingt..:

我们的想法是,即使底层数据结构需要更改,也不必更改类的公共接口.

C#可以不同地处理属性和变量.例如,您不能将属性作为ref或out参数传递.因此,如果由于某种原因需要更改数据结构并且您正在使用公共变量并且现在需要使用属性,那么您的接口将不得不更改,现在代码访问属性x可能不再像它变量那样编译X:

Point pt = new Point();
if(Int32.TryParse(userInput, out pt.x))
{
     Console.WriteLine("x = {0}", pt.x);
     Console.WriteLine("x must be a public variable! Otherwise, this won't compile.");
}

从一开始就使用属性可以避免这种情况,您可以随意调整底层实现,而不必破坏客户端代码.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有