如何为字典编写getter和setter?

Mau*_*imo 20 c# dictionary getter-setter

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

public Dictionary<string, string> Users
{
    get
    {
        return m_Users;
    }

    set
    {
        m_Users = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*are 27

使用索引器属性(MSDN):

public class YourClass
{
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>();

    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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用像:

var test = new YourClass();
test["Item1"] = "Value1";
Run Code Online (Sandbox Code Playgroud)

  • 这仅在类不是静态的时才起作用,可能想为静态类提供替代方案... (2认同)

Nik*_*sev 18

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

private Dictionary<string, string> users = new Dictionary<string, string>();

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

public KeyValuePair<string, string> Users
{
    set
    {
        Set(value.Key, value.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 值得注意的是,您可以在技术上使用属性来设置值(只需具有'keyvaluepair'类型的属性).您无法使用`get`ter来获取密钥的值(或对),因为您无法指定密钥. (2认同)