2016-02-05 73 views
0
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#這個代碼,我做了我該像以前OBJ參考在C#和VB

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是事先正確與否.Thanks

回答

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

    return Convert.ToInt32(strValue); 
} 

試試這個

+1

'IsEmptyOrNull'需要'String'類型的參數,因爲'strValue'是一個'Object'實例,所以你的代碼不會被編譯。你的代碼也不檢查'DBNull.Value'值。 – Dai

+0

哦,是的..糾正它 –

+0

@raghav這聽起來很愚蠢,但我也只是檢查空,DBNull.Value和null之間有區別。此外,如果你編程許可證,我會改變它,所以它迫使你提供實際的類型,而不是接受對象。 – Seabizkit

1

當使用==運算符比較兩個字符串時,將調用Equals方法,該方法檢查字符串內容的平等性,而不是引用本身。例如,「hello」.Substring(0,4)==「hell」是真實的,儘管運算符兩邊的引用是不同的(它們指向兩個不同的字符串對象,它們都包含相同的字符序列)。

請注意,運算符重載只適用於此處,如果運算符的兩邊都是編譯時的字符串表達式 - 運算符不是多態應用。如果運算符的任何一邊是編譯器所關心的類型對象,則將應用normal ==運算符,並且將測試簡單的引用相等性。

here

你寫的代碼兩者是沒有錯的本身。鏈接的帖子/片段應該有助於解決字符串如何工作的困惑。除非你明確知道你在做什麼,否則使用ReferenceEquals是個不錯的主意,我會使用其他按值檢查方法之一。

+0

老好人約翰飛碟雙向! – Codexer

0

如果調用「的ToString()」的對象,那麼你的第二個條件應該很好地工作:

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

    return System.Convert.ToInt32(strValue); 
} 
+0

嗨,但給.ToString()在這裏顯示綠色的行與該消息可能意想不到的參考比較 – raghav

+0

我使用VS 2015,我沒有得到綠線 - 我們可能有不同的選項設置。 –

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 
} 

一般情況下,儘量避免使用VB.NET在C#中的功能(如CInteger)或Convert.ToXXX方法,因爲它不是立即明確轉換將如何工作或如何工作。出於同樣的原因,也避免使用ToString調用時不帶參數。優選TryParse和適當的IFormatInfo重載。