与字段相比,属性的简写版本是相同的

时间:2011-02-21 19:41:45

标签: c#

从API /向后兼容性的角度来看,这两个类之间是否有任何区别:

案例A:

class Employee
{
    public string Title { get; set; }
}

案例B:

class Employee
{
    public string Title;
}

我可以在没有制动后向兼容性的情况下从案例B改为案例A吗?

案例C:

class Employee
{
    public string Title { get { return T; } set { T = value; } }
    private string T;
}

我是否可以在不破坏向后兼容性的情况下从案例B更改为案例C?

8 个答案:

答案 0 :(得分:4)

在A和C之间切换很好。从公众的角度来看,它们是完全相同的。自动属性仍然是正常属性。它只是让您省去了手动定义getter,setter和backing字段的工作。

B与两者都不同,因为字段不是属性。

特别是反射区分它们(列出属性与列表字段)。例如,典型的属性编辑器或某些序列化程序仅列出属性,但不列出公共字段。

当然,只有字段可以作为refout参数传递。因此,当您切换到属性时,此类代码会中断。

对于普通代码,它们通常是源兼容的,但不兼容二进制。即如果你在字段和属性之间进行更改而不重新编译依赖程序集,它将会中断。但是,如果你重新编译它们,大多数情况都会有效。

这意味着公共字段在应用程序代码中并没有那么糟糕(但我仍然会避免使用它),但对于库代码,您应该使用属性。

答案 1 :(得分:2)

案例A和C是相同的(如果备用字段由编译器自动生成)。

不能在不破坏向后兼容性的情况下将B从B更改为A或C,因为您要将字段更改为proerties。

答案 2 :(得分:1)

没有,一般情况下你不能。

例如,您无法将对属性的引用传递给字段(您无法通过引用传递属性值)。如果使用该类的一些代码使用了反射,那么也是不同的。

答案 3 :(得分:1)

它们不相同:B使用公共字段,A使用公共属性。如果你班级的任何消费者使用反射来到现场或通过引用传递公共字段,它们将会中断,C也是如此。

答案 4 :(得分:0)

你的两个例子不一样。以下两个 相同:

class Employee
{
    public string Title {get; set;}
}

class Employee
{
    private string _title;
    public string Title
    {
        get {return _title;}
        set {_title = value;}
    }
}

答案 5 :(得分:0)

如果保持名称相同,则不应破坏向后兼容性。

所有调用都是相同的语法。

如果向后执行,可能会出现问题。如果你有一个私有变量和一个属性,私有变量可能已经在某个类的类中被调用。

答案 6 :(得分:0)

我想明确表示其他人似乎在掩饰。虽然从B更改为C不会破坏解决方案,但这仅适用于一起编译的内容。如果要创建要在其他项目中引用的API或库,并且您不打算在解决方案中包含该API或库(例如,您将dll文件分发给客户端),则从B更改为C将破坏客户端使用从A更改为C时的API不会。

答案 7 :(得分:0)

是的,你可以,因为你宣布这三个类是私有的:-): - )

开玩笑吧。现在......如果你使用StyleCop(或其他类似的“程序”),它们会将所有公共(和受保护的)(非readonly或const)字段标记为“坏事”。这是因为在不破坏兼容性的情况下,您无法更改其中的任何内容。使用公共字段的“正确”事情不是使用它,而是使用属性(由私有字段支持,或者可能是内部字段(但我不确定))。现在...... A和C对于类的“表现良好”的用户是“等效的”(类的“表现良好”的用户只使用公共“接口”并且不使用反射)。

命名A和B之间的差异。您可以传递ref并退出字段。你不能为房产做这件事(这是“主要”的区别)。在字段和属性上使用反射是不同的(可以通过反射使用公共字段和属性)...