2013-10-13 128 views
58

考慮以下代碼:爲什麼字符串Remove()方法允許char作爲參數?

var x = "tesx".Remove('x'); 

如果我運行此代碼,我得到這個異常:

的startIndex必須小於字符串長度。

爲什麼我可以傳遞一個字符而不是int到這個方法? 爲什麼我沒有收到編譯錯誤?

enter image description here

爲什麼編譯器有這樣的行爲?

+1

語法:'刪除(INT的startIndex,INT長度)' –

+3

人們也許期望這是一個重複的,像我一樣,但我不能找到一個,令人驚訝。有人會認爲這是之前提出的。 – 11684

回答

92

你嘗試刪除聲明爲char的x,x等於120

.Remove只需要2個參數類型int開始和(可選)計數到rem從字符串中刪除。

如果你傳遞一個字符,它將被轉換爲整數表示。意思是如果你通過'x' - > 120大於字符串的.Length這就是爲什麼它會拋出這個錯誤!

+55

爲了澄清,這是一個在C#語言中做出的設計決定,它認爲'char'可以隱式轉換爲'int'(C的剩餘部分)。 – Joey

+0

...作爲重載解決方案的一部分,由設計決定進行訪問檢查。這使得定義一個私有'.Remove(Char)'沒有意義。 – MSalters

10

Remove在字符串內爲索引創建一個int參數以開始刪除字符,請參閱msdn。 remove調用必須自動將char轉換爲它的ASCII整數索引,並嘗試從字符串中刪除該索引處的字符,而不是試圖刪除該字符本身。

如果你只是想刪除其中x字符串中發生的任何情況下,這樣做:

"testx".Replace("x",string.Empty); 

如果你想刪除x的字符串中的第一個索引做:

var value = "testx1x2"; 
var newValue = value.Remove(value.IndexOf('x'), 1); 
+4

爲什麼downvotes? –

+0

最初的答案建議'.Replace('x','');'不會編譯。它從那以後被糾正了。 –

+0

不是我的downvote,但刪除和替換是不同的。替換替換所有的出現,這在語義上做不同的事情 –

3

由於您在函數中傳遞了一個字符,並且該值在運行時轉換爲int,因此您會收到運行時錯誤,因爲運行時字符的值大於字符串的長度。您可能會嘗試這一點: -

var x = "tesx"; 
var s = x.Remove(x.IndexOf('x'), 1); 

var s = x.Replace("x",string.Empty); 

.Remove需要整型作爲參數。刪除需要兩個參數。第一個是你想要開始的字符串中的什麼位置。 (計數從零開始。)第二個參數是您要刪除的字符數,從您指定的位置開始。

在一個側面說明:

從MSDN:

此方法(卸下襬臂)不修改當前實例的值。 而是返回一個新字符串,其中count參數指定的字符數 已被刪除。在由startIndex指定的位置刪除字符 。

+0

刪除和替換是不同的。替換替換所有的出現,這在語義上做不同的事情 –

+0

@SriramSakthivel: - 是的,這是正確的。更新我的答案與刪除功能也。謝謝! –

22

沒有的Remove過載,需要一個char,因此該字符被隱式轉換爲intRemove方法試圖使用它作爲一個指數到字符串,即字符串以外的方式。這就是爲什麼你得到運行時錯誤,而不是編譯時錯誤,說錯誤的參數類型。

要使用Remove刪除字符串的一部分,你首先需要找到字符串中的那部分。例如:

var x = "tesx"; 
var x = x.Remove(x.IndexOf('x'), 1); 

這將移除的'x'第一次出現的串英寸如果有可能比一個多次數,而且要刪除所有,使用Replace更高效:

var x = "tesx".Replace("x", String.Empty); 
+0

爲什麼我們可以通過char而不是int? –

+0

@ShahroozJefriㇱ當然,有一個從'char'到'int'的隱式轉換。 –

+1

@ShahroozJefriㇱ:某些類型可以隱式轉換爲其他類型,例如當int類型的值可以使用'byte'時是必要的。一個'char'也可以隱式轉換爲'int',在某些情況下這很方便,但也可能會造成混淆。 – Guffa

-1

問:爲什麼我可以傳遞一個字符,而不是一個int的這種方法?

答:因爲它沒有在C#中實現!

問:爲什麼我沒有收到編譯錯誤?

答:因爲字符「X」隱式轉換爲int下面線當量120

使用

var s = x.Replace("x",string.Empty); 
28

Implicit conversion可以編譯該代碼,因爲焦炭可被轉換爲int,並且不需要顯式轉換。這也將編譯和答案是600 (120*5) -

 char c = 'x'; 
     int i = c; 
     int j = 5; 
     int answer = i * j; 

MSDN,隱式轉換總結如下 -

Implicit conversion

至於其他的都表示,你可以使用ReplaceRemove與有效輸入。

0

您可以使用擴展方法爲已有的類創建自己的方法。考慮下面的例子:

using System; 
using MyExtensions; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      const string str1 = "tesx"; 
      var x = str1.RemoveByChar('x'); 
      Console.WriteLine(x); 
      Console.ReadKey(); 
     } 
    } 
} 

namespace MyExtensions 
{ 
    public static class StringExtensions 
    { 
     public static string RemoveByChar(this String str, char c) 
     { 
      return str.Remove(str.IndexOf(c), 1); 
     } 
    } 
} 
相關問題