C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: System.Number.ParseInt64とは?


(過去ログ 123 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■73263 / inTopicNo.1)  System.Number.ParseInt64とは?
  
□投稿者/ さかもと (1回)-(2014/09/04(Thu) 19:12:37)

分類:[ASP.NET (C#)] 

初めまして。よろしくお願い致します。

自作クラスのメソッドで、System.ArgumentNullExceptionが発生しています。
該当箇所のログを抜粋します。

-------------------------------------------------------------
System.ArgumentNullException: 値を Null にすることはできません。
パラメータ名: String
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 MyClass.MyMethod(ClassA id, String str, ClassB lastUpdated)
-------------------------------------------------------------

MyClass.MyMethodの中でInt64.Parseを実行している箇所があり、
こいつの引数がNullなのだろうと予想しました。
そこで、引数にNullを入れてみたところ、ログは

-------------------------------------------------------------
System.ArgumentNullException: 値を Null にすることはできません。
パラメータ名: String
   場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   場所 System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
   場所 System.Int64.Parse(String s)
   場所 MyClass.MyMethod(ClassA id, String str, ClassB lastUpdated)
-------------------------------------------------------------

のように、MyClass.MyMethodとSystem.Number.ParseInt64の間に、
System.Int64.Parseが挟まるようになりました。
System.Number.ParseInt64はInt64.Parseから呼ばれていますが、
前者のログでは自作メソッドから直接呼ばれているように見えます。

System.Number.ParseInt64とは、何でしょうか?

ちなみにMyMethodは下記のようになっております。
(以下省略)となっている箇所まで処理が進めば必ずログに表示されるはずですが、
それが無いため、恐らく下記の範囲内で例外が発生しています。
-------------------------------------------------------------
public ClassC MyMethod(ClassA id, String str, ClassB lastUpdated)
{
	_logger.Method("MyMethod").Enter(id, str, lastUpdated);

	ClassC res = new ClassC (); //ClassCのコンストラクタは特に定義されていません。

	ClassD updateAfter = ClassD.Parse(Int64.Parse(lastUpdated.StringValue), lastUpdated.IntValue);
(以下省略)
-------------------------------------------------------------

引用返信 編集キー/
■73264 / inTopicNo.2)  Re[1]: System.Number.ParseInt64とは?
□投稿者/ tinq (18回)-(2014/09/04(Thu) 20:15:03)
No73263 (さかもと さん) に返信
ReferenceSourceでソースを見られますので、眺めてみると、System.Int64.ParseはNumber.ParseInt64を呼び出しています。
http://referencesource.microsoft.com/#mscorlib/system/int64.cs#aa76bf9458630289#references
System.Numberはinternalなので外部からはアクセスできませんし、ドキュメント化もされていません。

ASP.NETは使ったことがないのですが、ブレークポイントを使うとか、処理を分けてみるとかで場所を絞り込めると思います。
しかし、直接呼び出せるメソッドではないので、最適化がかかっているとかでしょうか・・・?
引用返信 編集キー/
■73265 / inTopicNo.3)  Re[1]: System.Number.ParseInt64とは?
□投稿者/ 魔界の仮面弁士 (113回)-(2014/09/04(Thu) 21:04:36)
2014/09/04(Thu) 21:36:30 編集(投稿者)

No73263 (さかもと さん) に返信
> MyClass.MyMethodの中でInt64.Parseを実行している箇所があり、
TryParse の方が安全だと思いますよ。


> こいつの引数がNullなのだろうと予想しました。
「Null」とメッセージには表記されいますが、要するに
「null」のことですね、C# 的には。


> そこで、引数にNullを入れてみたところ、ログは
Int64.Parse に null を渡すと ArgumentNullException になるということは
ドキュメントでも触れられています。
http://msdn.microsoft.com/ja-jp/library/3b6b4bx3.aspx


> System.Number.ParseInt64とは、何でしょうか?
10進整数化するための処理かな?

No73264 でも触れられている“RefereceSource”を読めば推測できるかも
知れませんが、ここではそうした内部実装を気にする必要は無く、
どのような入力値を渡したのかに着目するべきかと思います。


とりあえず、エラー発生時に「lastUpdated.StringValue」の値が何になっているか、
再度トレースしなおしてみてください。

そこに null が来る可能性があるのなら、ClassD.Parse の前に if 判定が必要ですし、
そもそもここに null が渡されること自体が想定外なのであれば、
ClassC.MyMethod の呼び出し元を調査するべきであろうかと思います。


> 前者のログでは自作メソッドから直接呼ばれているように見えます。
RefereceSource を見る限りでは、Int64.Parse(string s) は、単に
 「return Number.ParseInt64(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);」
を呼び出しているだけのようです。

そのため、わざわざ Int64.Parse を経由させる必要は無いということで
呼び出しが最適化されていたのだと思います。
引用返信 編集キー/
■73269 / inTopicNo.4)  Re[2]: System.Number.ParseInt64とは?
□投稿者/ さかもと (2回)-(2014/09/05(Fri) 11:32:07)
tinqさん
魔界の仮面弁士さん

ご回答いただき、ありがとうございました。

恥ずかしながら、RefereceSourceを知りませんでした。
ソースを見て、理解できたように思います。

また、呼び出しの最適化というのも知りませんでした。
調べてみます。

> とりあえず、エラー発生時に「lastUpdated.StringValue」の値が何になっているか、
> 再度トレースしなおしてみてください。
>
> そこに null が来る可能性があるのなら、ClassD.Parse の前に if 判定が必要ですし、
> そもそもここに null が渡されること自体が想定外なのであれば、
> ClassC.MyMethod の呼び出し元を調査するべきであろうかと思います。

nullが渡されるのは想定外なので、呼び出し元の調査はしているのですが、原因を特定できておりません。
どうしてもわからない場合は、Int64.TryParseを使い、変換できない時の対処を入れる方向で考えようと思います。

どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -