你如何使类方法自我修改?

时间:2013-05-15 20:02:24

标签: asp.net class c#-4.0

asp.net C#4 我有一个简单的类来处理查询字符串。

像这样创建一个新实例:

        public QueryString(string querystring)
    {
        try
        {
            _table = new Hashtable();
            if (querystring.Length > 0)
            {
                foreach (string pair in querystring.Split('&'))
                {
                    string[] item = pair.Split('=');
                    _table.Add(item[0].ToLower(), item[1]);
                }
            }
        }
        catch (Exception)
        {
        }
    }

我想为此添加一个删除键值对的方法。我不希望它返回一个新的查询字符串,我只是想让它从当前实例中删除该对。不知道怎么做,因为它说我不能给'this'

赋值
        public void Remove(string key)
    {

        String querystring = this.ToString();
        try
        {
            _table = new Hashtable();
            if (key.Length > 0)
            {
                foreach (string pair in querystring.Split('&'))
                {
                    string[] item = pair.Split('=');
                    if (item[0] != key)
                    {
                        _table.Add(item[0].ToLower(), item[1]);
                    }

                }
                this = _table;
            }
        }
        catch (Exception)
        {
        }
    }

3 个答案:

答案 0 :(得分:2)

你的事情太复杂了。由于您的班级状态由_table字段组成,因此您需要做的就是从该字段中删除具有给定键的项目。

以下示例将强类型字典替换为无类型Hashtable。我还选择使用LINQ语句初始化字典,但如果您愿意,可以保留旧代码。

public class QueryString
{
    private readonly Dictionary<string, string> _table;

    public QueryString(string querystring)
    {
        if (querystring.Length > 0)
        {
            var pairs = 
                from pair in querystring.Split('&')
                let item = pair.Split('=')
                select new {key = item[0], value = item[1]};
            _table = pairs.ToDictionary(p => p.key, p => p.value);
        }
    }

    public void Remove(string key)
    {
        _table.Remove(key);
    }
}

答案 1 :(得分:0)

您无法为this分配值,因为它是reference to the object itself

但是,如果您删除行this = _table;,那么事情是否正常?我猜你的ToString()有点使用哈希表生成一个“打印机友好”的QueryString,如果是这种情况,就像我看到的那样,你的Remove()方法应该正常工作(因为你要更换)包含新_table的{​​{1}}变量不包括您要排除的键值对。

答案 2 :(得分:0)

您正在将一个查询字符串传递给该类,因此原始查询字符串 IS 完好无损。

但是,然后您将查询字符串分解为键/值对的Hashtable。如果你想保持 THAT 完整,你需要克隆HashTable并在克隆上执行删除。

在任何情况下,保留您传入的查询字符串作为成员变量中的构造函数参数以保证安全是个好主意。