Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写修改c#集合的方法时,好的做法是什么_C#_Coding Style - Fatal编程技术网

编写修改c#集合的方法时,好的做法是什么

编写修改c#集合的方法时,好的做法是什么,c#,coding-style,C#,Coding Style,我正在重构一些代码,并且我已经编写了一个修改字典并返回它的方法。这比使用out参数更好吗?在这种情况下,我真的不想创建一个扩展方法,因为它会将该方法添加到Dictionary类中,这对于它的用途来说太过分了。请不要指出我不应该使用动态sql,这是重构的另一个阶段,目前不得不推迟 private static Dictionary<int, string> FindMatches(Dictionary<int, string> records,

我正在重构一些代码,并且我已经编写了一个修改字典并返回它的方法。这比使用out参数更好吗?在这种情况下,我真的不想创建一个扩展方法,因为它会将该方法添加到Dictionary类中,这对于它的用途来说太过分了。请不要指出我不应该使用动态sql,这是重构的另一个阶段,目前不得不推迟

private static Dictionary<int, string>
            FindMatches(Dictionary<int, string> records,
                        string queryFormat,
                        string region,
                        string type,
                        string label)
{
    var query = string.Format(queryFormat, SqlSvrName, SqlDbName, SqlSchemaName,
                                                             region, type, label);
    using (var dr = DataRepository.Provider.ExecuteReader(CommandType.Text, query))
    {
        if (dr != null && !dr.IsClosed)
        {
            while (dr.Read())
            {
                var assetID = (int)dr.GetDouble(0);
                if (!records.ContainsKey(assetID))
                    records[assetID] = dr.GetString(1);
            }
        }
    }
    return records;
}

我相信对C#中所有复杂对象的引用都是通过引用传递的。因此,如果通过方法中的引用修改字典,则不需要返回它或指定out/ref关键字。它将在方法的作用域之外更改。

为什么您的方法要修改现有词典?它似乎没有使用现有的键/值,所以让这个方法只返回一个新的
字典

专用静态字典
FindMatches(字符串查询格式,
弦区,
字符串类型,
字符串标签)
{
var records=newdictionary();
var query=string.Format(queryFormat、SqlSvrName、SqlDbName、,
SqlSchemaName、区域、类型、标签);
使用(var dr=DataRepository.Provider.ExecuteReader)(CommandType.Text,
查询(
{
if(dr!=null&!dr.IsClosed)
{
while(dr.Read())
{
var assetID=(int)dr.GetDouble(0);
//如果数据库中的每个assetID都是不同的,则
//这里不需要“如果”,因为你知道字典
//一开始是空的
如果(!records.ContainsKey(assetID))
{
记录[assetID]=dr.GetString(1);
}
}
}
}
退货记录;
}

然后,您还可以编写一个单独的方法,以特定的方式合并两个词典,或者返回一个新词典,它是合并两个现有词典的结果。。将这两个问题分开。

由于您在方法中没有实际使用字典(除了填充它之外),因此我将从输入参数中删除它,并只返回它

如果出于某种原因必须将字典作为参数传入,我将返回一个void并重命名该方法,以确保它对输入参数有明显的副作用,例如

void PopulateRecordsWithMatches(Dictionary<int, string> records...)
void populateRecordswithMatch(字典记录…)

既然您正在修改字典,我认为最好将其作为一个ref参数来明确:

private static void
            FindMatches(ref Dictionary<int, string> records,
                        string queryFormat,
                        string region,
                        string type,
                        string label)
{
    var query = string.Format(queryFormat, SqlSvrName, SqlDbName, SqlSchemaName,
                                                             region, type, label);
    using (var dr = DataRepository.Provider.ExecuteReader(CommandType.Text, query))
    {
        if (dr != null && !dr.IsClosed)
        {
            while (dr.Read())
            {
                var assetID = (int)dr.GetDouble(0);
                if (!records.ContainsKey(assetID))
                    records[assetID] = dr.GetString(1);
            }
        }
    }
}
私有静态无效
查找匹配项(参考字典记录,
字符串查询格式,
弦区,
字符串类型,
字符串标签)
{
var query=string.Format(queryFormat、SqlSvrName、SqlDbName、SqlSchemaName、,
区域、类型、标签);
使用(var dr=DataRepository.Provider.ExecuteReader(CommandType.Text,查询))
{
if(dr!=null&!dr.IsClosed)
{
while(dr.Read())
{
var assetID=(int)dr.GetDouble(0);
如果(!records.ContainsKey(assetID))
记录[assetID]=dr.GetString(1);
}
}
}
}

返回它或将其用作out参数都意味着您正在创建一个新字典,但事实并非如此。另一方面,明确地将其设为ref参数则明确表示您打算作为副作用修改字典。

一个
out
参数意味着您传入一个空字典。那没有道理。您可能指的是
ref
参数


但正如Kon所说,您可以在方法中修改对象的内容。

不,对象不是通过引用传递的。引用是按值传递的。对象本身根本不会被传递。这有很大的区别。See Kon我想你的观点是,如果我将字典作为参数传入,我可以直接修改字典,而不必将其作为方法调用的结果返回。我理解这一点,但我想明确说明字典是通过该方法修改的。
ref
还有一个完整的其他含义。此处的
records
的实际值不会发生任何更改(以引用其他字典)-这是
ref
参数的含义。
ref
表示您更改了参数所指向的字典。这并不意味着您要更改现有的字典。确实,ref是用来让您交换字典的,这在这里是不需要的,所以严格来说没有必要。然而,用它来表示意图是否有害处?它不会害处。但它并没有表明你认为它表明的意图
ref
表示要使变量引用另一个对象。无法指示您修改对象的内容。如果有一种方法可以指示对象的内容是否会被修改,那就太好了。是的,因为这种指示是完全不同的意图——即,你要替换Dictionary的实例,而不是像往常一样修改它的内容Jon,谢谢。在添加新条目之前,该方法会检查字典是否已经包含该键。我在原始问题中忽略了更广泛的上下文,即使用不同的查询字符串多次调用此方法。不过,我接受你关于分离关注点的观点。
void PopulateRecordsWithMatches(Dictionary<int, string> records...)
private static void
            FindMatches(ref Dictionary<int, string> records,
                        string queryFormat,
                        string region,
                        string type,
                        string label)
{
    var query = string.Format(queryFormat, SqlSvrName, SqlDbName, SqlSchemaName,
                                                             region, type, label);
    using (var dr = DataRepository.Provider.ExecuteReader(CommandType.Text, query))
    {
        if (dr != null && !dr.IsClosed)
        {
            while (dr.Read())
            {
                var assetID = (int)dr.GetDouble(0);
                if (!records.ContainsKey(assetID))
                    records[assetID] = dr.GetString(1);
            }
        }
    }
}