0

私はこの署名を持つ ac# 関数を持っています:

public XmlNode getName(int a, double b){}

問題は、変数が常に有効な int であるとは限らないことです (ユーザーはそれを null またはスペースのままにしておくことができます。これらの場合、関数は失敗します (驚くべきことではありません))関数?


編集:

関数は Web サービス (asmx ファイル) の WEBMETHOD であるため、ユーザーは任意の値を a. 問題は、誰かが int の代わりに文字列を入力すると Web サービスがクラッシュすることであり、それは私が避けたいことです。

4

3 に答える 3

1

ユーザーがその関数にスペースやnullを渡すことはありません。あなたは。あなたはそれにintの署名を与えました、あなたがそれをnullまたはスペースを引き起こす何かでそれを呼び出そうとするとそれはコンパイルされません。

渡す入力が文字列であることを意味する場合、それはintに対してのみ有効です。これらの2つの入力で何をしたいですか。おそらくそれはnullを返します。そうでない場合は私を責めないでください。

public XmlNode getName(String a, double b)
{
   int someval;
   if (int.TryParse(s, out someval))
   {
       // do whatever you were going to in here, but using someval not a
   }
   else
   {
      return null;
   }  
}
于 2013-03-04T08:35:51.227 に答える
1

現在、有効な int をメソッドに渡す必要があります。たとえば、次のように呼び出すことはできません。

getName("", 3);

最初の引数が type ではないため、コンパイル エラーが発生しますint

したがって、次の 2 つのオプションがあります。

  1. 呼び出し元がユーザー入力を に変換できるようにしintます。
  2. stringobjectまたはのタイプを受け入れるようにメソッド シグネチャを調整しますNullable<int>

Nullable<int>メソッドの呼び出し元が を通過できるようにしますnull。を使用a.HasValueして、ユーザーが合格したnullか有効なint. ( MSDN ドキュメント)

.NET Framework で値を変換するには、他に 3 つのオプションがあります。

int.パース

このメソッドは文字列パラメーターを受け取り、それをint. 変換が失敗した場合、またはstringがである場合null、例外がスローされます。

int.TryParse

このメソッドは、stringおよび出力パラメータを取り、変換を試みます。失敗した場合、例外はスローされません。代わりに、このメソッドは Falls を返し、何をすべきかを決定できます。

Convert.ToInt32

このメソッドはオブジェクト型の引数を取ります。null をスローしませんが、デフォルト値を返します (int の場合、これは 0 です)。それ以外は、内部で int.Parse を使用します。

あなたの場合、次のようなことができます:

public XmlNode getName(string a, double b)
{
   if ( string.IsNullOrWhiteSpace(a))
   {
      // Handle null case
   }

   int result;
   if (!int.TryParse(a, out result)
   {
     // handle invalid int case
   }

   // Use result to get your XmlNode
}
于 2013-03-04T08:32:38.780 に答える
0

ユーザー入力を解析してint. 失敗した場合は、関数を呼び出さないでくださいgetName

            var isAInt = "1";
            var isNotAnInt = "f";
            String nothing = null;
            int tmp;
            var res1 = Int32.TryParse(isAInt, out tmp); // true
            var res2 = Int32.TryParse(isNotAnInt, out tmp); // false
            var res3 = Int32.TryParse(nothing, out tmp); // false
于 2013-03-04T08:27:36.650 に答える