此代码的任何性能问题

时间:2010-11-10 05:53:14

标签: c#

这可能会超过顶部,但我在一个函数之后,如果数据库中的值不为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());
}

5 个答案:

答案 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,如果是

则什么都不做

您可以稍微澄清一下:

  1. 如果数据库中的值为null,则不执行任何操作
  2. 否则,请将值分配给我的类属性
  3. 所以现在你已经对你想要的功能做了一个简洁明了的定义。如果您的实现遵循该描述,则可能是简单正确,这是一个很好的起点。

    所以试试吧:

    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);
}