考慮以下代碼:爲什麼字符串Remove()方法允許char作爲參數?
var x = "tesx".Remove('x');
如果我運行此代碼,我得到這個異常:
的startIndex必須小於字符串長度。
爲什麼我可以傳遞一個字符而不是int到這個方法? 爲什麼我沒有收到編譯錯誤?
爲什麼編譯器有這樣的行爲?
考慮以下代碼:爲什麼字符串Remove()方法允許char作爲參數?
var x = "tesx".Remove('x');
如果我運行此代碼,我得到這個異常:
的startIndex必須小於字符串長度。
爲什麼我可以傳遞一個字符而不是int到這個方法? 爲什麼我沒有收到編譯錯誤?
爲什麼編譯器有這樣的行爲?
Remove在字符串內爲索引創建一個int參數以開始刪除字符,請參閱msdn。 remove調用必須自動將char轉換爲它的ASCII整數索引,並嘗試從字符串中刪除該索引處的字符,而不是試圖刪除該字符本身。
如果你只是想刪除其中x字符串中發生的任何情況下,這樣做:
"testx".Replace("x",string.Empty);
如果你想刪除x的字符串中的第一個索引做:
var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);
爲什麼downvotes? –
最初的答案建議'.Replace('x','');'不會編譯。它從那以後被糾正了。 –
不是我的downvote,但刪除和替換是不同的。替換替換所有的出現,這在語義上做不同的事情 –
由於您在函數中傳遞了一個字符,並且該值在運行時轉換爲int,因此您會收到運行時錯誤,因爲運行時字符的值大於字符串的長度。您可能會嘗試這一點: -
var x = "tesx";
var s = x.Remove(x.IndexOf('x'), 1);
或
var s = x.Replace("x",string.Empty);
.Remove需要整型作爲參數。刪除需要兩個參數。第一個是你想要開始的字符串中的什麼位置。 (計數從零開始。)第二個參數是您要刪除的字符數,從您指定的位置開始。
在一個側面說明:
從MSDN:
此方法(卸下襬臂)不修改當前實例的值。 而是返回一個新字符串,其中count參數指定的字符數 已被刪除。在由startIndex指定的位置刪除字符 。
刪除和替換是不同的。替換替換所有的出現,這在語義上做不同的事情 –
@SriramSakthivel: - 是的,這是正確的。更新我的答案與刪除功能也。謝謝! –
沒有的Remove
過載,需要一個char
,因此該字符被隱式轉換爲int
和Remove
方法試圖使用它作爲一個指數到字符串,即字符串以外的方式。這就是爲什麼你得到運行時錯誤,而不是編譯時錯誤,說錯誤的參數類型。
要使用Remove
刪除字符串的一部分,你首先需要找到字符串中的那部分。例如:
var x = "tesx";
var x = x.Remove(x.IndexOf('x'), 1);
這將移除的'x'
第一次出現的串英寸如果有可能比一個多次數,而且要刪除所有,使用Replace
更高效:
var x = "tesx".Replace("x", String.Empty);
爲什麼我們可以通過char而不是int? –
@ShahroozJefriㇱ當然,有一個從'char'到'int'的隱式轉換。 –
@ShahroozJefriㇱ:某些類型可以隱式轉換爲其他類型,例如當int類型的值可以使用'byte'時是必要的。一個'char'也可以隱式轉換爲'int',在某些情況下這很方便,但也可能會造成混淆。 – Guffa
問:爲什麼我可以傳遞一個字符,而不是一個int的這種方法?
答:因爲它沒有在C#中實現!
問:爲什麼我沒有收到編譯錯誤?
答:因爲字符「X」隱式轉換爲int下面線當量120
使用
var s = x.Replace("x",string.Empty);
Implicit conversion
可以編譯該代碼,因爲焦炭可被轉換爲int,並且不需要顯式轉換。這也將編譯和答案是600 (120*5)
-
char c = 'x';
int i = c;
int j = 5;
int answer = i * j;
從MSDN,隱式轉換總結如下 -
至於其他的都表示,你可以使用Replace
或Remove
與有效輸入。
您可以使用擴展方法爲已有的類創建自己的方法。考慮下面的例子:
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);
}
}
}
語法:'刪除(INT的startIndex,INT長度)' –
人們也許期望這是一個重複的,像我一樣,但我不能找到一個,令人驚訝。有人會認爲這是之前提出的。 – 11684