文字列から安全に変換するためのヘルパー関数
-
05-07-2019 - |
質問
VB6 に戻ると、文字列の null と ''、数値の null と 0 などの違いを気にせずにコーディングできる関数をいくつか書きました。無関係なエラーを引き起こす可能性のあるデータを処理するために特殊なコードを追加することほど、コーディング時に生産性を損なうことはありません。9999/10000 数値として使用しているものが null の場合、実際には 0 として扱います。
私は現在 C# を使用していますが、VB6 と C# 2005 の違いは非常に大きく、新しいヘルパー関数のセットをどこから書き始めればよいのか、そもそもヘルパー関数を作成する必要があるのかさえわかりません。 。
したがって、文字列、データベースフィールド、リクエストフォーム/クエリフィールド、???を受け入れる関数を作成し、それをDoubleに変換して呼び出し元のプロシージャに返すためにできることはすべて実行する必要があります。 。
shorts、int16、int32、long、その他関心のあるすべてのものについてもこれを行う必要があります。
次に、文字列に対してこれを行います。そしてデイツ。
これは価値ある追求でしょうか?代わりに使用できるフレームワークまたは C# はありますか?他の関数を呼び出すときにデータをインラインで使用でき、一時変数などを作成する必要がないものが本当に欲しいです。
解決
数多くの変換関数が組み込まれています。しかし...どれもあなたが望んでいることを正確に行うかどうかはわかりません。一般に、.NET メソッドは、無効な入力が渡されると注意を払ってエラーを起こし、例外をスローします。
幸いなことに、数値、空の文字列、または null 文字列の文字列表現を任意の出力型に変換するユーティリティ メソッドを簡単に作成できます。
public static T SafeConvert<T>(string s, T defaultValue)
{
if ( string.IsNullOrEmpty(s) )
return defaultValue;
return (T)Convert.ChangeType(s, typeof(T));
}
使用:
SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;
このジェネリック メソッドは、2 番目の引数の型から戻り値の型を取得します。この型は、渡された文字列が null または空の場合のデフォルト値として使用されます。合格 0
そしてあなたは In32
戻る。合格 0L
, Int64
. 。等々...
他のヒント
C#では、ほとんどのデータ型はnull値を使用できません(数値、日付など)。文字列のみがnull値を使用できます。 DBからデータを取得している場合は、 Nullable 、またはその構文糖版、int?、double?、DateTime?など
すべてのnullableには、メソッドがあります。実際の値、またはnullの場合はデフォルト値。これにより、これらの関数の作成を回避できます。
文字列に関しては、String.IsNullOrEmpty(str)関数があります。
特別な場合は、拡張メソッドを追加することもできます。利用できない機能。コードで処理する限り、拡張メソッドはnull値に適用できることに注意してください。例:
public static string ValueOrDefault(this string str)
{
if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
else return str;
}
.NETライブラリにはConvertと呼ばれるクラスがあります。任意の基本型といくつかの一般的なクラス(DateTimeなど)から必要なものに変換できる関数があります。
基本的にConvert.ToInt32(val);のように動作します。
編集:私は本当にすべての単語を読むことを学ぶ必要があります。 nullについての心配をキャッチしませんでした...これのための演算子があります。 ??を使用できますただし、nullを確認し、デフォルトを提供して、動作する可能性があります。
LINQを調べたい場合もあります。LINQはそのようなマッピングの多くを処理します。
@ Shog9に似ていると思います。ユーザーの異常な入力を処理するために、try catchを追加します。入力を変換するタイプを送信し、入力をオブジェクトとして受け取ります。
public static class SafeConverter
{
public static T SafeConvert<T>(object input, T defaultValue)
{
if (input == null)
return defaultValue; //default(T);
T result;
try
{
result = (T)Convert.ChangeType(input.ToString(), typeof(T));
}
catch
{
result = defaultValue; //default(T);
}
return result;
}
}
次のように呼び出します
SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);