画面の入力項目やファイルの読み込みやストリームからの読み込み等々。
通常は、各数値型の構造体メンバであるParseメソッドやConvertクラスにある変換用メソッドなどを使います。
どれが一番速いのかと検証し結果、以下のような実装が速かったのです。
string型からint型への変換
public static class StringExtensions
{
public static int ToInt32(this string value)
{
int ret = 0;
for(int n = 0; n < value.Length; n++)
{
ret = ret * 10 + (value[n] - '0');
}
return ret;
}
}
string型からdouble型への変換
public static class StringExtensions
{
public static double ToDouble(this string value)
{
double ret = 0;
double fraction = 1;
bool isFraction = false;
for (int n = 0; n < value.Length; n++)
{
char target = value[n];
if(value[n] == '.')
{
isFraction = true;
}
else
{
ret = ret * 10 + (value[n] - '0');
if (isFraction)
{
fraction = fraction * 10;
}
}
}
return ret / fraction;
}
}
以前別のブログで書いた記事なのですが、問題は3つあります。
1.ボックス化解除と何の関係もない
文字列は参照型で数値は値型なのでボックス化解除かと思ったんでしょうか。タイトルと内容が違う。恥ずかしい。
2.Double型の変換は小数点以下の桁数が多いとdouble.Parseメソッド等との計算結果に誤差が生じる。
2進数の問題ですね。少数以下15桁ぐらいで違ってきます。
3..NET Coreではパフォーマンスに差異がない。
.NET Framework4.8で検証すると上記の方式の方が数倍速いのですが、.NET Coreやその後継の.NET 5.0ではParseやConvertの処理速後が遜色なくなってました。
以上より、今後はこういう実装は不要です。標準ライブラリのメソッドを使いましょう。