Null参照の例外... への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 y4yama  ()
投稿日時
2008/7/15 20:17:00
> それが最善策だと思います。
> VBではByRefしかないので、INPUT/OUTPUTの両方に使いたいのか、OUTPUTだけに使いたいのか明示する方法がありません。
以前から私も疑問でした。参考になりました。
やはり、s="" ですか。
ところで脱線したら申し訳ないですが、SubをFunctionにして、
Dim s As String = xyz()
というのも、ありですよね
複数のout引数はFunctionでは取れないから、そのときはクラスなりStructを返す・・とか。
Fortranなどでは当たり前だったin/out ですが、もしかして、引数にoutを渡すのは・・?(そういえば最近、全く使ってません)
> VBではByRefしかないので、INPUT/OUTPUTの両方に使いたいのか、OUTPUTだけに使いたいのか明示する方法がありません。
以前から私も疑問でした。参考になりました。
やはり、s="" ですか。
ところで脱線したら申し訳ないですが、SubをFunctionにして、
Dim s As String = xyz()
というのも、ありですよね
複数のout引数はFunctionでは取れないから、そのときはクラスなりStructを返す・・とか。
Fortranなどでは当たり前だったin/out ですが、もしかして、引数にoutを渡すのは・・?(そういえば最近、全く使ってません)
投稿者 よねKEN  ()
投稿日時
2008/7/15 09:00:00
> Dim s as string = ""や
> s = ""
> で初期化してやるば良いのは分かるのですが、他に方法はないんですか?
それが最善策だと思います。
C#だとVBのByRefに当たるrefキーワード以外にoutキーワードがあって、
メソッドの引数が出力専用であることを明示することができますが、
VBではByRefしかないので、INPUT/OUTPUTの両方に使いたいのか、OUTPUTだけに使いたいのか明示する方法がありません。
> s = ""
> で初期化してやるば良いのは分かるのですが、他に方法はないんですか?
それが最善策だと思います。
C#だとVBのByRefに当たるrefキーワード以外にoutキーワードがあって、
メソッドの引数が出力専用であることを明示することができますが、
VBではByRefしかないので、INPUT/OUTPUTの両方に使いたいのか、OUTPUTだけに使いたいのか明示する方法がありません。
投稿者 るきお  ()
投稿日時
2008/7/15 06:45:00
すいません、前の書き込みでAsiansさんの敬称「さん」を抜かしてしまいました。お詫びいたします。
投稿者 るきお  ()
投稿日時
2008/7/15 06:31:00
こんにちは。
一応、コンパイルの設定で「割り当て前の変数の使用」を警告なしに変更すれば警告はでなくなりますが、きっとお望みの解決法ではないですよね…。
構文的、コード的な対応はAsiansの方法以外私もわかりません。
伝統的にVBではよくある使い方だからこの警告は私も邪魔に感じています。
追加情報ある方よろしくフォローお願いします。
投稿者 Asians  ()
投稿日時
2008/7/15 03:10:00
はじめまして、いつも大変参考にさせて頂いております
例えば
Private sub (Byref ss As string)
:
:
End Sub
Dim s as string
xyz(s) <---- (A)
:
:
で(A)のところで
変数 's' は、値が割り当てられる前に参照によって渡されています。Null 参照の例外が実行時に発生する可能性があります。
と警告エラーが出ますよねぇ
これを防ぐには
Dim s as string = ""や
s = ""
で初期化してやるば良いのは分かるのですが、他に方法はないんですか?
例えば
Private sub (Byref ss As string)
:
:
End Sub
Dim s as string
xyz(s) <---- (A)
:
:
で(A)のところで
変数 's' は、値が割り当てられる前に参照によって渡されています。Null 参照の例外が実行時に発生する可能性があります。
と警告エラーが出ますよねぇ
これを防ぐには
Dim s as string = ""や
s = ""
で初期化してやるば良いのは分かるのですが、他に方法はないんですか?
るきおさんの言われる通りこういったケース場合にのみ警告させないよう
にしたいのです
C#だと色々細かく指定できるみたいですね
y4yamaさんの方法も試してみましたが例えば
Public Function (Byref Data as String) As Boolean
とかの場合はお手上げになってしまいました。
構造体の参照渡しも検討してみましたが大量の構造体が必要になりそうで...
クラスはまだ勉強中なのでよく意味が理解できませんでした
ちなみに配列の場合は
Public Sub xyz(Byval hh() As Integer)
:
:
Redim hh(n)
hh(0) = 5
:
End Sub
Dim h() As Integer
Redim h(0) <---- これを書かないと
xyz(h) <---- 警告がでる
ってなりますよね