obj C#和vb中的引用

时间:2016-02-05 05:09:43

标签: c# vb.net

 Public Function DBToID(ByVal strValue As Object) As Integer
        If strValue Is DBNull.Value Then Return -1
        If strValue = "-1" Then Return -1
        Return CInteger(strValue)

    End Function

我正在尝试在C#中转换此代码,我这样做了

public static int DBToID(object strValue)
    {
        if (object.ReferenceEquals(strValue, DBNull.Value))
            return -1;
        if (object.ReferenceEquals(strValue,"-1"))
            return -1; 
        return CInteger(strValue.ToString());

    }

我只需要像以前一样知道我是否正确行事

 public static int DBToID(object strValue)
    {
        if (object.ReferenceEquals(strValue, DBNull.Value))
            return -1;
        if (strValue == "-1")
            return -1; 
        return CInteger(strValue.ToString());

    }

但是它说可能是非预期的参考比较它没有给出任何错误只是strValue ==“ - 1”下的绿线。所以请解释一下object.referenceequals是否正确。谢谢提前

4 个答案:

答案 0 :(得分:1)

当使用==运算符比较两个字符串时,将调用Equals方法,该方法检查字符串内容的相等性而不是引用本身。例如,“hello”.Substring(0,4)==“hell”为真,即使运算符两边的引用不同(它们引用两个不同的字符串对象,它们都包含相同的字符序列)。

请注意,如果运算符的两边都是编译时的字符串表达式,则运算符重载仅适用于此 - 运算符不是多态应用的。如果关于编译器,运算符的任何一方都是object类型,则将应用normal ==运算符,并将测试简单的引用相等性。

取自here

您编写的代码本身并没有错。链接的帖子/代码段应该有助于解决字符串的工作方式。除非您明确知道自己在做什么,否则使用ReferenceEquals是一个坏主意,我会使用其他一种按值检查方法。

答案 1 :(得分:1)

在C#中,当==运算符的第一个操作数被强制转换为引用类型(没有任何运算符重载)时,==运算符将映射到Object.ReferenceEquals运算。对于要执行的字符串相等操作,必须在编译时将两个操作数都知道为String个实例。

最简洁(和安全)的转换是这样的:

public Int32 DbToId(Object value) {
    Int32 ret;
    return value == DBNull.Value                                          ?  -1 :
           Int32.TryParse( CultureInfo.InvariantCulture, value, out ret ) ? ret :
           -1;
}

...这是一个较短的形式:

public Int32 DbToId(Object value) {
    if( Object.ReferenceEquals( value, DBNull.Value ) ) return -1;
    Int32 ret;
    if( Int32.TryParse( CultureInfo.InvariantCulture, value, out ret ) ) return ret;
    return -1; // fallback, base-case
}

通常,尽量避免在C#(如CInteger)或Convert.ToXXX方法中使用VB.NET函数,因为转换的工作原理和方式并不是很明显。出于同样的原因,也避免没有参数的ToString调用。优先考虑TryParse适当的IFormatInfo重载。

答案 2 :(得分:1)

public int DBToID(object strValue)
{
    if (strValue == DBNull.Value || Convert.ToString(strValue) == "-1")
        return -1;

    return Convert.ToInt32(strValue);
}

试试这个

答案 3 :(得分:0)

如果你打电话给' .ToString()'在对象上,那么你的第二个条件应该可以正常工作:

public int DBToID(object strValue)
{
    if (strValue == DBNull.Value)
        return -1;
    if (strValue.ToString() == "-1")
        return -1;

    return System.Convert.ToInt32(strValue);
}