这可能会超过顶部,但我在一个函数之后,如果数据库中的值不为null,则为我的类属性赋值,如果是,则不执行任何操作。我可以用if语句做到这一点,但我是在一个班轮后。我希望这在我的代码中到处都是,但在此之前我只是想知道这是否是正确的方法来考虑性能。感谢。
调用代码:assign(变量,值)
Utils.Assign(dataSet.Tables[0].Rows[0]["Assigned"], ref this.Assigned);
Utils功能:
public static void Assign(object value, ref Boolean variable)
{
if (IsRealString(value)) // Check
{
switch (IsBoolean(value.ToString())) { case true: variable = Convert.ToBoolean(value); break; }
}
}
public static Boolean IsBoolean(String s)
{
Boolean bit;
if (Boolean.TryParse(s, out bit))
return true;
else
return false;
}
public static bool IsRealString(object s)
{
return s != null && !String.IsNullOrEmpty(s.ToString());
}
答案 0 :(得分:2)
没什么大不了的,但是你将value
转换为布尔值两次并使用switch
语句作为if
语句。这里真正的问题是可读性,而不是性能。我建议简化:
public static void Assign(object value, ref bool variable)
{
if (value == null) return;
bool result;
if (Boolean.TryParse(value.ToString(), out result))
{
variable = result;
}
}
答案 1 :(得分:1)
你有什么理由在布尔类型上做一个switch语句吗?这就是if语句的用途。我认为这里没有性能敏感的代码可以担心。去解决真正问题的更大问题并停止追逐鬼魂。
答案 2 :(得分:1)
如果出现任何性能问题,您应该可以使用分析器进行测量。在不测量它们之前,不要试图提高性能。在封装此代码时,您仍然可以轻松地改进它。
但是请注意,如果你有一个数据库,数据库将是你的瓶颈而不是这部分代码。 Definitly!
您不应该尝试加速代码的原因是因为它通常会降低代码的可读性。但是,您可以按照其他人的建议(如果不是切换,简化IsRealString())并考虑是否真的需要IsBoolean()或者只是从Assign()调用Boolean.TryParse,因为这会提高可读性!
答案 3 :(得分:1)
代码存在一些问题,远远超出性能。首先,担心正确性和可读性,然后你可以担心性能 - 这应该通过测量/分析来完成。这种代码不太可能成为瓶颈,所以从这里“优化”开始不太可能值得花时间。
请注意,IsRealString
不会返回可靠的答案。该方法接受一个对象,因此任何对象的默认ToString
将给出一些非空字符串,它将返回true。
你说你想要:
一个函数,如果值为我的类属性赋值 来自数据库不是null,如果是
则什么都不做
您可以稍微澄清一下:
所以现在你已经对你想要的功能做了一个简洁明了的定义。如果您的实现遵循该描述,则可能是简单和正确,这是一个很好的起点。
所以试试吧:
public static void Assign(object value, ref bool variable)
{
if (value == null) return;
// We're assuming that a valid value will always be a string. If this is not the
// case, then we need to handle other types
string valueString = value as string;
bool result;
if (bool.TryParse(valueString, out result))
{
variable = result;
}
}
注意:这与Greg的示例相同,但我不会调用ToString()
,因为我们不知道对象的实现是做什么的。
我们还发现了“规范”定义的一个问题。你(和我的)代码中的假设是,如果值是“set”,它将始终设置为字符串。您可以拥有一个数据集,其中值不是字符串。例如,如果值为boolean
,则解析valueString
将无法提供有效结果。这实际上取决于数据集包含的内容。
答案 4 :(得分:0)
我会写IsRealString
方法如下:
public static bool IsRealString(object s)
{
return String.IsNullOrEmpty(s);
}
但当然这在速度方面没有带来真正的改善:)
和第二个功能:
public static Boolean IsBoolean(String s)
{
Boolean bit = false;
return Boolean.TryParse(s, out bit);
}