VB.NET開発者にクイズです! ちゃんと正解を出せますか?

このエントリーをはてなブックマークに追加

VB.NETの開発者にクイズです。

是非とも、正解を出して下さい・・・ね。

出せなかった人は、VB.NETの基本から見直すことも必要かもしれませんよ。

 

それでは、クイズです。

先ずは下記のコードをお読みください。

Private Sub BTN_HUTU_Click(sender As Object, e As EventArgs) Handles BTN_FUTU.Click

  Dim l_SideA As Integer

  Dim l_SideB As Integer


  '■A側の変数に1000を代入
  l_SideA = 1000

  '■B側の変数にA側の値を代入
  l_SideB = l_SideA

  '■B側の変数の値を2000に変更
  l_SideB = 2000

  '■A側の変数の値を画面に表示
  MessageBox.Show("l_SideA側の値:" & l_SideA)

  '■B側の変数の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB)

End Sub

 

さて、このコードの最後に表示されるメッセージボックスに表示される値は何でしょうか?

なんて問題は、聞くまでもありませんね。

結果は、以下のように表示されます。

res_h_1

res_h_2

 

では、下記のコードの最後に表示される2つのメッセージボックスに表示される値は何でしょうか?

Private Sub BTN_OBJECT_Click(sender As Object, e As EventArgs) Handles BTN_OBJECT.Click

  Dim l_SideA As DataTable

  Dim l_SideA_AddRow As DataRow

  Dim l_SideB As DataRow


  '■A側のオブジェクト変数(DataTableの1行目)に1000を代入
  l_SideA = New DataTable
  l_SideA.Columns.Add("A", GetType(Integer))
  l_SideA_AddRow = l_SideA.NewRow
  l_SideA_AddRow("A") = 1000
  l_SideA.Rows.Add(l_SideA_AddRow)

  '■B側のオブジェクト変数にA型のオブジェクト変数を代入
  l_SideB = l_SideA.Rows(0)

  '■B側のオブジェクト変数の値を2000に変更 
  l_SideB.Item("A") = 2000

  '■A側のオブジェクト変数の値を画面に表示
  MessageBox.Show("l_SideA.Row(0)側の値:" & l_SideA.Rows(0).Item("A"))

  '■B側のオブジェクト変数の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB.Item("A"))

End Sub

 

正解を出して下さいよ~~。

(-_-)/~~~ピシー!ピシー!

【正解】はこちらになります。

res_o_1

res_o_2

 

皆さん、正しい正解をだせましたか?

もしかして「最初のメッセージボックス(l_SideA側)の値は、変更されないから初期設定のまま1000だよ。」なんて解答をした人いませんでしたか?

 

 

上記のコードのコメントを書き換えると以下のようになるわけです。

Private Sub BTN_OBJECT_Click(sender As Object, e As EventArgs) Handles BTN_OBJECT.Click

  Dim l_SideA As DataTable

  Dim l_SideA_AddRow As DataRow

  Dim l_SideB As DataRow


  '■A側のオブジェクト変数(DataTableの1行目)に1000を代入
  l_SideA = New DataTable
  l_SideA.Columns.Add("A", GetType(Integer))
  l_SideA_AddRow = l_SideA.NewRow
  l_SideA_AddRow("A") = 1000
  l_SideA.Rows.Add(l_SideA_AddRow)

  '■B側のオブジェクト変数にA型のオブジェクト変数のアドレスを代入
  l_SideB = l_SideA.Rows(0)

  '■B側のオブジェクト変数の値を2000に変更 → 同時にA側のオブジェクト変数も変更されてしまう。
  l_SideB.Item("A") = 2000

  '■A側の値を画面に表示 → B側の値に変更により、A側の値も変更されることを確認
  MessageBox.Show("l_SideA.Row(0)側の値:" & l_SideA.Rows(0).Item("A"))

  '■B側の値を画面に表示
  MessageBox.Show("l_SideB側の値:" & l_SideB.Item("A"))

End Sub

 

私見ですが、これはただのクイズで終わるような問題ではないと考えます。

VB.NETのビギナーであれば、まず間違いなく「最初のメッセージボックスの値は、1000だよ。」と解答してしまうのではないでしょうか?

無理もないかもしれません。コードを見る限りオブジェクト変数のl_SideA側を変更するような命令行を見つけることができませんから・・・

つまり、先輩プログラマが開発したソースコードをビギナープログラマーが誤って読み解いて、そのプログラムに対して誤ったメンテナンス作業を行ってしまう危険性がある考えます。

開発したシステムのライフサイクルとなる数年間(長ければ10年近く)の間、メンテナンス作業を行う度に、この問題記事のような誤った解釈によるコードが書かれることがないか心配してしまいます。

この問題記事の内容は、VB.NETを使用するすべてのプログラマーが認識し、かつ後輩プログラマに対して誤った解釈をしないように教育をしていく必要がある重要な事項と考えます。

 

もし、本記事のクイズに誤った解答を出してしまった方は、今後十分に注意して下さいね。

 

※本記事記載のVB.NETのソースコード(ソリューション一式)のダウンロードはこちらからどうぞ。