我有一个可以接受Xml节点名称作为变量的Replace方法,将评估Replace Xml中的每一行在计算表达式之前获取节点的值。因此,如果一些 节点不存在,Replace将在null上进行评估。
鉴于这种情况,以下代码是否合理?
<chocolates>
<chocolate>
<name>Mars Bar</name>
</chocolate>
<chocolate>
<name>Bounty</name>
<type>Coconut</type>
</chocolate>
</chocolates>
Replace(type, 'C', 'c')
public string Replace(string a, string b, string c)
{
if (a == null) return null;
if (b == null || c == null) return a;
return a.Replace(b, c);
}
答案 0 :(得分:2)
代码可以简化:
// When designing public methods you'd rather give to the parameters more
// descriptive names than "a", "b", "c", e.g.
// "source", "toFind", "toReplace"
public string Replace(string a, string b, string c)
{
if ((a == null) || (b == null) || (c == null))
return a;
return a.Replace(b, c);
}
或者甚至在 trenary 运算符的帮助下进一步:
public string Replace(string a, string b, string c)
{
return ((a == null) || (b == null) || (c == null)) ? a : a.Replace(b, c);
}
您应该使用String
,例如电话:"c"
,"C"
而非Char
'C'
,'c'
:
// All three arguments should be strings
String type = ...
...
Replace(type, "C", "c");
答案 1 :(得分:0)
也许你应该通过以下方式调用你的函数:
Replace(type,"C","C");
(当然&#34;类型&#34;也需要是字符串值)
或尝试将此字符串与null进行比较:
if(a.Equals(null)) return null;
答案 2 :(得分:0)
我认为扩展方法看起来更整洁
public static class MyTestClass
{
public static string MyReplace(this string stringToSearch, string find, string replaceWith)
{
if(stringToSearch == null) return null;
if(string.IsNullOrEmpty(find) || replaceWith == null) return stringToSearch;
return stringToSearch.Replace(find, replaceWith);
}
}
然后你可以打电话
type.MyReplace('C','c');
编辑: 添加了扩展类的完整代码,并添加了isNullOrEmpty而不是仅仅对“find”进行空检查,因为您不想将空字符串传递给Replace调用
答案 3 :(得分:0)
您还需要检查b是否为空。否则将发生参数异常
Console.WriteLine(Replace("dsfa", "", ""));
// Define other methods and classes here
public string Replace(string a, string b, string c)
{
if (a == null) return null;
if (String.IsNullOrEmpty(b) || c == null) return a;
return a.Replace(b, c);
}