将空对象实例公开为属性

时间:2009-01-08 02:04:47

标签: c# coding-style

今天我正在从Nikhil Kothari的Facebook.NET API中查看一些代码。我只想看看他是如何在那里做一些事情的想法。

我遇到的其中一件事是对我来说似乎很奇怪的财产。

检查一下:

FacebookRequest.cs定义了一个属性,并将它在构造函数中设置为自定义类的新实例:

    public FacebookRequest(FacebookSession session) {
        ....
        _parameters = new FacebookRequestParameterList();
    }

私人领域:

私人FacebookRequestParameterList _parameters;

和财产:

    public FacebookRequestParameterList Parameters {
        get {
            return _parameters;
        }
    }

现在FacebookRequestParameterList实际上是一个通用词典,因为它继承了&扩展词典:

public sealed class FacebookRequestParameterList : Dictionary<string, string> {
...
}

确实如此,当您实例化FacebookRequest时,它会自动附带一个自动实例化的FacebookRequestParameterList类实例。所以Property实际上是返回一个FacebookRequestParameterList的实例。

这是正常的吗?我不认为我见过那么多。似乎偷偷摸摸地对我或这是这个标准的东西?这似乎是一种奇怪的方式。我不会发布这篇文章让他失望,但要明白这是标准还是偷偷摸摸/邪恶。

在我看来,要求开发人员通过FacebookRequest的构造函数传递FacebookRequestParameterList的实例会更好。然后通过在构造函数初始化后设置私有字段_parameters来处理它。为什么我认为这更好?因为那时开发人员确切地知道发生了什么。他们知道该类需要预先设置参数列表。只是通过适当的方式向我展示这样的实例似乎很奇怪。

我离开基地吗?

5 个答案:

答案 0 :(得分:3)

我认为这根本不奇怪。它为客户端省去了必须实例化FacebookRequestParameterList实例的麻烦,FacebookRequest类保证_parameters包含FacebookRequestParameterList类的有效实例,并且isn' t null

客户端的方便性和类本身的对象有效性。

没有什么可看到的,人们,继续前进。

(编辑:澄清了第一段中的具体实例)

答案 1 :(得分:2)

用法完全有效。该类仅在内部使用Dictionary<string,string>并将其作为属性公开。大概没有必要将预先编写的字典传递给构造函数。

更好的方法是将其公开为IDictionary<string,string>而不是具体类的实例。

答案 2 :(得分:0)

你曾经使用过DataTable吗?实例化新的DataTable时,会自动拥有行和列的集合。是否必须实例化DataTable然后在您自己的行和列集合中传递它是否有意义?显然不是。他们已经在你身边,你可以根据自己的需要为他们添加东西。

(我刚刚选择了一个DataTable,因为我觉得这很容易理解。我相信还有很多其他的例子。)

答案 3 :(得分:0)

我这是正常的,而且不是偷偷摸摸的。由于公开的集合属性是只读的(您不能一次替换整个集合),它会向您保证您有一个要使用的实例(除非拥有的类使用它做了一些时髦的事情)。

我同意它可能是一个更好的设计,但我不知道API的其余部分,所以我无法评论在该上下文中是好还是坏 。一般来说,我同意,参数应该传入(并坦率地复制到另一个字典,因为会话对象似乎有某种生命周期)。

答案 4 :(得分:0)

我认为它没有任何问题。然后,您可以以非常直观的方式执行fbreq.Parameters["param"]="value"之类的操作,同时要求在构造时提供字典可能会更加混乱(或分散注意力),并且您甚至可能在创建请求之前甚至都不知道所有参数。 / p>