c# - 返回新对象的 C# 属性 getter 是最佳实践吗?

标签 c# object properties instance getter

我经常编写在属性 getter 中创建新对象的类,但我读到这不一定是最佳实践。例如:

public class Board
{
    public float Width { get; }
    public float Height { get; }
    public CGSize Size { get { return new CGSize(this.Width, this.Height); } }

    public Board(float width, float height)
    {
        this.Width = width;
        this.Height = height;
    }
}

这有什么问题吗?

参见此处:Is object creation in getters bad practice?各种赞成的人建议这是不好的做法,例如:“是的,这是不好的做法。理想情况下, setter/getter 不应该改变或创造任何东西”。并且两次读取一个属性应该产生相同的结果(而每次创建一个新对象都会不同。)

(我注意到在 C# 中,System.Drawing.Rectangle 类有一个 Size 属性,它每次都会返回一个新对象。)

最佳答案

创建新对象是一种很好的防御策略,可以防止修改对象的内部结构。

但是,只有当您返回的对象是可变的,而不是 struct(它无论如何都应该是不可变的 [why?] )时才应该应用它。

CGSize 是一个struct,所以您在这里创建了一个新的值类型对象。当您不存储 Size 时,这正是您应该做的。

关于c# - 返回新对象的 C# 属性 getter 是最佳实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48607606/

相关文章:

c# - 更改 Windows 8.1 应用程序中的全局应用程序字体

c# - 如何从 Blazor 服务器端应用程序中的本地 Active Directory 实现身份验证?

javascript - 我可以从 js 对象中调用函数吗?

python - python中的属性文件(类似于Java Properties)

c# - 什么时候通过代码优化属性 "inlined"

c# - .NET Web API - 添加日志记录

c# - 在 .net 中使用 OracleCommand 时,机器上是否必须安装 OracleClient,或者 .net 是否涵盖了这一点?

javascript - 如何在通过 inDesign 的 createTOC 函数生成后定位目录

java - 如何从 java 类中获取 scala 中定义的对象中的特征类?

ios - Objective C 半只读属性