如何为字典编写getter和setter?

如何为复杂数据类型(如字典)定义getter和setter?

public Dictionary Users { get { return m_Users; } set { m_Users = value; } } 

这会返回整个字典吗? 你能编写setter来查看是否存在特定的键值对,然后如果不存在,则添加它。 否则更新当前的键值对? 对于get,您可以返回特定的键值对而不是整个字典吗?

不可能以仅涉及属性的方式进行。 理论上你可以编写一个setter,但对于getter,你需要指定一个你想要检索的键。 这是不可能的,因为属性不接受参数。 实现你想要的自然方式是使用方法:

 private Dictionary users = new Dictionary(); public void Set(string key, string value) { if (users.ContainsKey(key)) { users[key] = value; } else { users.Add(key, value); } } public string Get(string key) { string result = null; if (users.ContainsKey(key)) { result = users[key]; } return result; } 

或者,正如其他人已经说过的那样,你可以使用索引器,但我总是发现它们有点麻烦。 但我想这只是个人偏好的问题。

而且为了完整起见,这就是setter的样子,尽管拥有这样一个属性非常不寻常和反直觉:

 public KeyValuePair Users { set { Set(value.Key, value.Value); } } 

在内部,它使用我之前代码段中的Set方法。

使用索引器属性( MSDN ):

 public class YourClass { private readonly IDictionary _yourDictionary = new Dictionary(); public string this[string key] { // returns value if exists get { return _yourDictionary[key]; } // updates if exists, adds if doesn't exist set { _yourDictionary[key] = value; } } } 

然后使用像:

 var test = new YourClass(); test["Item1"] = "Value1"; 

您将无法使用酒店进行此操作。 您需要使用方法,或者为您的类添加索引器。 get方法不能接受参数(键)。

另一种选择,如果您希望某人能够轻松地向字典添加/删除密钥但阻止他们设置一个全新的密钥,那么将使该属性成为只读属性,该属性返回在构造函数中创建的字典。 它比添加get / set方法更不灵活,但在通常的简单情况下,它可以做得很好。

看起来你想要一个“命名索引器”。 这是(我的)使用C#实现这一目标的一种方法。

我的方法公开了一个返回一个对象(带有一个默认索引器)的属性,该对象将在给定lambdas的情况下执行索引到相应的字段。

您可能有或没有想要使用此方法的原因,但我会留给您。 🙂

使用setter可以这样做但是非常不推荐,并且使用getter是完全不可能的,因为它不需要参数来确定要获取什么。

对于setter,你必须传递一个Dictionary和一对,但它与你期望getter / setter通常做的一样,并完全停止你设置整个Dictionary。

更好的方法是使用一对方法,如果您愿意,可以命名为Get和Set。

 Dictionary param = new Dictionary(); public void SetYourParameter(string parametrName, string paramValue) { param[parametrName] = paramValue; } public string GetYourParameter(string parametrName) { // ContainKey ---> It returns value if the key was found if( param.ContainsKey(parametrName)) return param[parametrName]; else return null; }