With ~ End With内で構造体の値を確認するには? への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 タカジィ  (社会人) 投稿日時 2020/11/13 20:05:12
魔界の仮面弁士さんから、ご回答などをいただきましたが、返事できずにいました。
※GoTo 四国 for 親の介護関連 …してました。旅費一切で、激安にビックリ。

・C#でのWith 情報ありがとうございました。
 VB以外でも(初期化じゃない方の)Withが使われることを祈りたいです。
 マイクロソフト社には、ワタシの当初の投稿の解決もよろしく…と言いたいです(笑)

・この投稿が「With 質問」→「Basic 懐古」に変化したようなので、これで終わりたいと思います。
 途中で出てきた「DoEvents(更に SyncLock )」の疑問は、整理してから(可能なら)投稿したいと思いますので、そのときはまた、よろしくお願いいたします。
 ※「並列処理」とは別に「並行処理」があったんですね…。

ありがとうございました。
タカジィ
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/11/6 22:06:52
>> C# には With がありませんし、あまり需要がない機能なのかもしれません。
> C# 版にも with が欲しいというニーズはあるのですが、反対意見も多くあります。

C# 9.0 の段階で、with キーワードが言語機能として追加されるようです。
(C# 9.0 と .NET 5 は、来週開催される .NET Conf 2020 のタイミングでリリースされる見込み)

ただし、VB でいうところの With ステートメント (タカジィさんが使っていたもの)ではなく、
下記の「オブジェクト初期化子」の With に近い式 (初期化用構文) ですけれどね。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/objects-and-classes/how-to-declare-an-object-by-using-an-object-initializer


C# 9.0 の with 式は record 型専用の初期化構文として実装されています。
C# 10.0 あたりでは、匿名型でも with が使えるようになるかもしれません。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/proposals/csharp-9.0/records#with-expression

using System;

// Point レコードの定義
public record Point(int X, int Y);

public class Program
{
    static void Main()
    {
        var p1 = new Point(1, 2);

        // 「with 式」によるレコードの初期化
        var p2 = p1 with { X = 3 };

        // p1 の内容が p2 にコピーされ、X プロパティだけ書き換わっている
        Console.WriteLine(p1); // Point { X = 1, Y = 2 }
        Console.WriteLine(p2); // Point { X = 3, Y = 2 }
    }
}
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/10/31 14:20:38
脱線雑談。

> 全然知らない名前なので、Webで見たら東芝パソピアなんですね。
> 私はビンボーだったので(今も昔も)「FM-7」(富士通=タモリが宣伝)でスタート。

パソピア(当時はパソコンではなくマイコンと呼ばれていた)は両親の持ち物ですね。
自分は小学校低学年でした。

プリンターとか、カセットデッキ、5.25" フロッピードライブとか、ROM カートリッジとか
各種ソフトウェアとか……すべて合わせるとどのくらいの金額だったのだろう?


> それにしても魔界の仮面弁士さんは「Professional」→「Enterprise」→「Subscription」…と、
> 快調に「おカネ持ち街道」をひた走り…されたことが、容易に想像できます。

いやもう……ほんっっとに高かったですねぇ……(深い溜息
コストパフォーマンスは度外視になっているので、道楽と言われればその通りです。

今なら、インターネットで情報を入手し放題だし、評価版 Server 製品を無償で入手できるし、
Express や Community Edition もあるので、うらやましい限りですよ。


'94 年当時、C++ と VB のどちらを買うか悩んで、慣れ親しんだ BASIC に近い VB を選択。
エディションの違いは分からないけれど、初心者なのでと、安い方の Standard を購入。

ところが……Visual Basic 2.0J Standard には必要最低限の機能しかありませんでした。

カスタムコントロールが全然付随されていないので、ファイル名を指定させるための
コモンダイアログを表示することすらできず、そのための同等機能を自作せねばならぬ有様。

API を使えば Common Dialog を呼び出せるとはいえ、Win16 API の知識なんてありませんし、
パソ通やインターネットで情報を得られる時代でもなく…学んでいくにつれ、とても後悔しました。
最初から Professional 版を買っておけばよかった!と。


差分製品となる Microsoft Visual Control Pack を追加もしましたが、
Windows API を知りたい! ヘルプファイルを作りたいから Help Compiler も必要!
といった強い欲求で、夏のアルバイト代を全部つぎ込んで、秋葉原ソフマップで見つけた
Microsoft Windows Software Development Kit 3.1 の大きな箱を購入し、その内容を読破しました。

SDK の分厚い何冊もの紙のリファレンスを読み解くにしても、C/C++ の知識なんて
持ち合わせていなかったため、図書館で C/C++ の本を借りながら読み進めつつも
その当時は 9 割は理解不能だったのですが…まぁ糧にはなったと思います。

…という経験もあって「(無償ならともかく)一番安い有償製品は、銭失いになるかもしれない」
「とりあえずドキュメントは、一通り目を通しておこう(理解は後回しで良い)」という方針。

オーバースペックと知りつつ、Enterprise Edition を購入したのも同じような理由です。(^_^;

MSDN Subscription も悩みましたが、1年間、Microsoft 製品が使い放題なら…ということで
思い切って購入。でも実は、Visual Studio を購入した後で MSDN を追加契約したので
その点は無駄だったなと、ちょっと反省。

MSDN によって、超大量の CD-ROM が自宅に届いても、流石に使いきれなかったわけですが、
個人だとあまり使わないような Server 系製品に趣味程度に触れておくことができたので、
就職後も、知識としてそこそこ役に立ちました。自己投資の一部だったと自分に言い聞かせています。


> 参考プログラムのURLがあったのでノゾいたら、驚愕。
あ。https:// じゃなくて http:// のまま掲載しちゃってました…まぁいいか。
投稿者 タカジィ  (社会人) 投稿日時 2020/10/30 17:55:52
再度の、魔界の仮面弁士さんのご回答、ありがとうございました。

●先にメールへの返信…のようなモノを書きます。
>1982年: OA-BASIC ※独学:最初に触ったプログラム言語
全然知らない名前なので、Webで見たら東芝パソピアなんですね。

私はビンボーだったので(今も昔も)「FM-7」(富士通=タモリが宣伝)でスタート。
当時ホントにビンボーで、買う前の1年間、キーボードの実物大写真(NHK入門講座の本に見開き付録)を机に広げ、練習してました(懐)
それにしても魔界の仮面弁士さんは「Professional」→「Enterprise」→「Subscription」…と、快調に「おカネ持ち街道」をひた走り…されたことが、容易に想像できます。

スレッドの件(なんとなく)わかりました。
新PCに変えたらバグがなくなる…なんてハズはないので、今後も注視していたいと思います(笑)


●さて、お二人に「With」の見やすさを例示して、最後に一矢、報いたいと思い…
見本になるモノは… 何かないかと… 探してたら~ ♪あった!
※ちょうど、さっきから、BGMがYouTubeで♪「悲惨な戦い/なぎらけんいち」(世代が違いますね)

↓るきお(管理者)さんのお手本(RPGSample>SoundComposer.vb)より引用 ※以降、動作はすべて未検証
Public Sub New(ByVal music As Musics)
  Select Case music
    Case Musics.A
      FileName = "button-22.wav"
    Case Musics.B
      FileName = "button-23.wav"
    Case Musics.Field
       :

↓With の使用例 ※私はこっちが見やすい(認識しやすい)と思うのですが…?
Public Sub New(ByVal music As Musics)
  With Musics
    Select Case music
      Case .A
        FileName = "button-22.wav"
      Case .B
        FileName = "button-23.wav"
      Case .Field
       :

↓さらに、私には(今では「絶対やめろ」と言われてる)「マルチ」のほうが、断然…
Public Sub New(ByVal music As Musics)
  With Musics
    Select Case music
      Case .A : FileName = "button-22.wav"
      Case .B : FileName = "button-23.wav"
      Case .Field  ←文字数が違うケースがあるとダメですね(笑)
       :
※上の文字数の違うケースのような場合、見やすくするためになら(文字数をムリにでも合わせるためなら)、私は日本語を使うことをいとわない(更なるガラパゴス化?;笑)
例:
With Cast(n敵ボス)
  Select Case course
    Case nt左へ : .X -= 1
    Case nt右へ : .X += 1
    Case nt上へ : .Y -= 1
   :
※上記「nt左へ」などは定数 ※Enumは使わない ※「n」はnmb=integer 「t」はテンキーで方向指示(左=4、右=6 … ←ガラパゴス化極まり?)


●反対に 業界の方が With を使う頻度が少なくなった(かも知れない)理由も一つ見つけました。
私の理解してる「構造体」と、通常に多用される(?)構造体とは、意味が違ってたみたい?
・私の知識の「構造体」は、VB6で「単純な変数を収納したモノ」→ .NET にそのまま移行し、配列などにして使用
・通常の構造体は Location とか Point など、関連性の高い変数をまとめたモノ(しかも階層的に?)(←あくまで私の解釈)

↓るきお(管理者)さんのお手本(RPGSample>FieldContextObject.vb)より引用
Public Sub PlayerUnit_Stepped(sender As Object, e As SteppedEventArgs)
  :
  Select Case Player.MapPoint
    Case New Point(32, 100)
      LoadMap("Home.map")
    Case New Point(105, 79)
      LoadMap("Teracotta.map")
    :

私は「Point」という名称が座標値(X,Y)関連とは、どうしても認識できない(英語がダメだから?)ので、無視してた(使えない)のでした(笑)
上のような使い方( Case New Point(32, 100) …等)は想像もつききませんでした。
このような比較では if文を使うことしか考えられなくて。
その上で「With」を使うと、見やすくなったのでした。
  With Player
      if .MapPointX = 32 AndAlso
         .MapPointY = 100 then
         :


●結論?
どうやら、最新のVBプログラミングを理解するためには、魔界の仮面弁士さんご指摘の「クラスと構造体の違い」を本格マスターする必要がありそうです。
別サイトの記事をチラと見たら、構造体の中で「set」すれば初期化できるみたいで、これも新発見(笑)
これを使うと「With」の使用頻度も少なくなりそう?

ありがとうございました。
(またもやダラダラと長文になってしまいました。お許しを)

タカジィ

今回も追伸を…
魔界の仮面弁士さんのお手本からも、何かないかと…さがしたのですが… なかった …どころか、またびっくりで。
投稿欄の、お隣さん(高校生みたい)への回答メールに、参考プログラムのURLがあったのでノゾいたら、驚愕。
 ttp://www.vb-user.net/junk/replySamples/2010.02.08.14.53/Clipping.txt
・この「参考プログラム」って、質問者の高校生が「試験が終わったら見てみる」ような(気楽な)レベルなの?
・これが理解できるって、最近の高校生のレベルって(昔の高校生のコトも知りませんが)こんなにスゴいの~? と、ア然。

私は、いまだ「Overrides」など使ったこともない。使うと、話が(プログラムが)更にややこしくなる気がして。
※Override=乗っ取り と、脳で日本語に変換できるのみ(笑)

また「doublebufferr」にもイヤな思い出が。
VB.NETに乗り換えた直後、画面の「バタつき」に困りはて、何か…とさがしたら… あった! のがコレ。
でも、どうプログラムしても「バタつき」が治らず、結局自前で考えたPictureBox2つを表裏切り替えるという方法で対処。
※結局、「doublebufferr」には、いまだ近寄ったことがない(笑)

私は、この高校生に「一つのコマンドが使えなくても(理解できなくても)、同じ処理ができる別の方法があるはずだから、投げないように」と言いたいですナ(笑)
…とヤケクソ気味に書いてはみたのですが、何度も魔界の仮面弁士さんのプログラムを見返してみて…
私の知らないテクニックを使うと、こんなに(恐ろしいぐらいの)短いプログラムで収まるのかと、ボー然としてるのも事実です。

「たし算」しか知らない者が、はじめて「かけ算」を目の当たりにしたような…。
※しかもタイムスタンプ(らしきモノ)からみると「2010.02」って、10年前から(普通のテクニックとして)あったの~?

どうやら「構造体の勉強」前に(高校生と一緒に)このプログラムの勉強から始めた方がよさそう(笑)

以上
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/10/29 21:53:52
> 若い頃(DOSーBASICの頃)、

自分の言語遍歴……どこまで「若い頃」に入るかな。(汗

1982年: OA-BASIC ※独学:最初に触ったプログラム言語
1984年: N88-BASIC ※数日間のプログラミング合宿
1993年: Turbo Pascal (バージョン失念) ※学校の講義
1994年: Visual Basic 2.0J Standard Edition ※以降はすべて独学
1995年: Visual Basic 4.0J Professional Edition
1997年: Visual Studio 97 Enterprise Edition ※VBAに触れたのもこの頃から
1998年: Visual Studio 6.0 Enterprise Edition with MSDN Subscription
2001年: Visual Basic .NET Beta 2
2002年: Visual Basic .NET (2002)
以下略


> ・「With~End With」は、VBでも使う人はごく少数
いえいえ! そんなことはないと思いますよ。個人の好みの問題でしょう。
本当に NG なら、GoSub のように廃止されていたと思います。

廃止されていたら、匿名型宣言やオブジェクト初期化子の With キーワードも、
もしかしたら別のキーワードに置き換わっていたかも知れませんね。

VB ユーザーに統計を取ったわけでは無いので、利用者数は分かりませんが、
私自身、Excel VBA などにおいては今でも With をよく使います。

それに今回の .nmb1 の件も、 とかのデバッガだと表示できませんが、
 あたりの古い環境であれば、問題無くデバッガに表示されます。

ただし、Stop 中にイミディエイト ウィンドウに「? .nmb1」と入力するような書き方は
 であっても許可されていません。(でも VBA ならば OK !)


With ステートメントに関する stackoverflow でのやりとりを、機械翻訳版と共に紹介しておきます。
https://stackoverflow.com/questions/283749/the-vb-net-with-statement-embrace-or-avoid
https://j.mp/31SVB8S


> それでも私は、Withの提案者に賛同し、激励したいと思います。

操作対象が 1 つだけの場合には、With でまとめると便利ですよね。

VB3 までは、オブジェクトはあってもクラスが無く、組み込みのオブジェクトを使うしかありませんでした。
VB4 以降でも、クラスを自作する人はそれほど多くありませんでしたので、纏めやすかったのだと思います。


> MSが認定した「Most ナンタラ」のはずだから、最もリッパな方だったのですね。
正確には認定制度では無くて、単年の表彰制度ですね。
過去 1 年間の個人の活動実績をもとに、その年の受賞審査が行われます。
https://mvp.microsoft.com/ja-jp/


> 自作プログラムを見て気づいたのですが…私はクラスを一つも使ってませんでした(笑)
とはいえ、Label や Button もクラスです。String だってクラスです。
沢山のクラスを既に扱っているわけですから、少しずつ歩んでいきましょう。


> ※フォーム以外、すべてモジュール「Friend Module Mdl_***」 ←Public も一切未使用(Friendのみ)
その「Public Class Form1」は Form そのものではなく、
「Form クラスを継承した自作の Form1 クラス」なわけで。


> 「Wingdings」ぐらいは、プロシージャ名に使えるようにして欲しい
表示だけの問題ですから、フォントは自由に選べますよ?
特定の文字だけを別のフォントで表示、というわけにはいきませんけれども。


> 「DoEvents」(Application.DoEvents) を使ってみたのですが、どうにも珍現象が続発。
DoEvents はシングルスレッドの処理なので、実はマルチスレッドとは無関係です。

「並行」処理のために DoEvents が使われることはありますが、
「並列」処理となると DoEvents では実現できません。


> 当時の解説本でも「DoEvents は危険」とあって、
マウスやキーボード系のイベントや、画面の描画などの処理という物は、
イベントが何も処理されていない「アイドル時」に行われます。

なので、高速でボタンを連打しても、Button1_Click の処理中に
Button1_Click のイベントが複数同時に走ったりすることはありません。
前のイベントが終わってから、次のイベントが発生します。

TextBox1.Text を書き換えると TextChanged イベントが発生する…といったイベント連鎖ならば
ありますが、それは同期的に起こる物であり、非同期的なものではありません。

DoEvents は、イベント処理中にアイドルタイムを用意することで、
そうした順序処理に割り込みをかけることになります。
「今は Button1_Click を処理している最中だけど、他のイベント処理も必要なら引き受けるよ!」
というのが DoEvents です。
これによって Button1_Click が再入するかもしれないし、Timer のイベントが発生するかもしれない。

そうした、予期せぬタイミングでのイベント処理があると、プログラムの流れが追いにくくなるので、
再現させにくい不具合を作りこんでしまいやすくなります。なので「無暗に多用するのは危険」ですが、
動作を理解して使う分には問題無いと思います。

とはいえ今となっては、DoEvents に頼るよりは、Appliation.Idle イベントを使ったり
Task クラスを使う方が健全かと思います。


> 本来の本格的なプログラム例(スレッドクラスのナンタラを使う…)などが紹介されてたのですが、
非同期プログラミングモデルも、
 APM (素の非同期プログラミングモデル) … VB.NET 2002/2003 世代
 EAP (イベント型非同期プログラミングモデル) … VB2005~2008 世代
 TAP (タスク型非同期プログラミングモデル) … VB2010 以降
のように遷移しているため、生の Thread クラスを使う機会は減ってきています。


> ※今春に「SyncLock」なるモノを見つけて、コレを組み込もうとしたのですが、する前から正常動作してる(笑)
この「正常動作」判定が、また難しい所なのですよね。

たとえば、Public Money As Integer という変数があって、それを複数のスレッドから
排他制御なしに Money += 1 するような単純な処理さえ NG となります。
(微妙な処理タイミングによって、+1 されない可能性があります)

この手の不具合は、数十万回連続実行した時に、数回だけ失敗するといった
再現性の低い問題を作りこむ危険性があります。そのため、スレッドセーフかどうかを
意識してコーディングできるだけの学習土台が求められます。体系立てて学ぶことが肝要な分野です。
投稿者 タカジィ  (社会人) 投稿日時 2020/10/29 14:03:14
魔界の仮面弁士さん、ご回答ありがとうございました。
管理人さん(るきおさん)、これからも頑張ってください。
※毎月初旬にある「Visual Basic 初級講座 [改訂版]」更新をいつも楽しみにしてます。

魔界の仮面弁士さんのご回答で、さらにショックが倍増しましたよ(笑)
・「With~End With」は、ものすごく前から存在してた
・「With~End With」は、VB以外では使わない(使えない)
・「With~End With」は、VBでも使う人はごく少数
春にコレの存在を知り、感動して全部の該当箇所を置き換えたのに、半年後にこんなコトになるとは…!

ご紹介いただいたサイトで、いちばんショックだったのは、次の記述(Webの自動翻訳を使用)
>C#言語の設計者を含む多くの人々は、「with」は読みやすさを損なうことが多く、祝福というよりは呪いであると信じています。
う~む…。それでも私は、Withの提案者に賛同し、激励したいと思います。
「あなたの感性は間違ってない。少なくとも私は、断然読みやすくなったと、自覚できましたよ」…と(笑)
※ご紹介サイトでの、いくつかの回答者に「魔界の仮面弁士 MVP」とあります。たしか「MVP」って、MSが認定した「Most ナンタラ」のはずだから、最もリッパな方だったのですね。

自作プログラムを見て気づいたのですが…私はクラスを一つも使ってませんでした(笑)
※フォーム以外、すべてモジュール「Friend Module Mdl_***」 ←Public も一切未使用(Friendのみ)
だから、「.」から始まる変数は、ほぼ構造体と認識できるわけですが、クラスを作ると混同する?
ご紹介サイトの一つ「クラスと構造体の使い分け」を今後熟読したいと思います。

ちょっと話はそれますが、私は乱視です。
生まれてすぐの事故で、片方の目は今もあまり見えなくて、良い方の目も乱視が残りコンタクトが必要。
医者からは、コンタクト装着自体が目に悪いので、なるべく使わないようにという指示。
乱視だと細い文字(フォントだと明朝系)はとても見にくく、ゴシック系(しかも等幅)を常用してます。
※例えば「は」「ば」「ぱ」の区別が、とても、つきにくいです(ゴシック系でも)。
…ということで、日常的に「パッと見」で内容を理解できる方法(意思を伝達する方法)を考えてしまうのでした。

VBの話題にもどりますね。
英字のプロシージャ名は、英語のダメな私には、苦痛でした(今でも)
日本語をローマ字で書いたモノ(例:goukei)は、さらに激痛(笑)

それで考えたのが、プロシージャ名に「処理の概略認識用に、絵文字風な1字を追加する」という方法。
そして、目に優しい「濃い文字」で絵文字風を…と探した結果が「■」「▲」など。

当初はプロシージャ名のアタマ1字を記号としてたのですが、それでも判別しにくいので(コメントなどと混同)、前後でサンドイッチにすると、とてもわかりやすい♪…となったのでした(笑)
例:単純な明示用→「Sub ■ShowScore■()」 ←「■」で(なんとなく)モニター画面を連想
  ユーザー選択→「Function ★SelectCourse★()」 ←「★」からキーの押下を連想
※今になって思うと、フローチャートの記号に似てる気もします(私だけ?)

今からでも、せめてマイクロソフト社謹製のフォント「Wingdings」ぐらいは、プロシージャ名に使えるようにして欲しい(笑)
 →孤独な乱視アマグラマーのスローガン「■すばやい認識には 表音文字より 表意文字!■」

下記追記も含め、なんだか「爺さんの戯言(たわごと)」(しかも長文)で終わってしまった気もします。
関係者様、ご不快になったとしたら、お許しを。

皆様、ありがとうございました。
タカジィ

追記1
管理人さん(るきおさん)から教えていただいた「ウォッチウィンドウ」ですが、目の悪い私にはチョット、キツいです。
※(プログラム文章とは)別の位置にある一覧表を見ることも、該当変数値を探し出すことも苦痛(情けない…)
でも慣れると、少しは気楽になるかも…で、いちおう常時表示に。

追記2
>この変数名は、不可視文字を含んだ 7 文字で構成されています。
久しぶりにマイフェスを使ってノゾいたら2文字目6文字目は「UCS-2=202EH」「UCS-2=202DH」とありました。
懐かしい記憶が復活。
昔、DOSーBASICの頃(フロッピーなどでソフト販売してた)、ファイル名の1字を不可視文字に書き換えて、コピープロテクトしてたはず。
※私は、もちろんユーザー側なので、それを「書きもどす」してた…かも(断言はマズい?)

追記3
自作プログラムを10年も放置してたのは、1点、どうしてもバグがとれなかったのです。
シロート(ワタシ)が無謀にもマルチスレッドしたくて…
 例:人物キャラが画面移動しながら、ときどき目パチしたり、口パクと同時に文字表示したり…
「DoEvents」(Application.DoEvents) を使ってみたのですが、どうにも珍現象が続発。
たぶん呼び出し側のプロシージャ間で「DoEvents を巻き込んだ お見合い状態」になってると推測したのですが、対処法が全然不明。
当時の解説本でも「DoEvents は危険」とあって、本来の本格的なプログラム例(スレッドクラスのナンタラを使う…)などが紹介されてたのですが、読むこと自体が苦痛で(すぐに眠れた)、プログラムもいっしょに休眠状態へ(笑)
今年PCを新調し、コロナでヒマなので久しぶりに作業再開したら、なぜか珍現象が消えてた(今のところ)。
※今春に「SyncLock」なるモノを見つけて、コレを組み込もうとしたのですが、する前から正常動作してる(笑)
…で、今に至ってるのです。

このまま「珍現象」が起きないよう祈りながら、プログラミングを楽しんでいきたいと思います。
ありがとうございました。

以上
投稿者 るきお(管理者)  (社会人) 投稿日時 2020/10/29 08:19:11
タカジィさん、感想ありがとうございます。
「業界の風のようなモノを感じる」というのが新鮮で、私が思ってもいなかったような視点でした。
そこまで読み取っていただけているんだなと嬉しく思います。

ちなみに私もVBを始めた頃はタカジィさんと同じような気持ちだったように思います。イベントドリブンも戸惑いましたし、行番号がいらないというのにびっくりしました。
VBの前はN88-BASICを少しかじっていたのですが、N88-BASICでユーザーからのキーボード入力を読み取る INPUT に相当する命令がなにかわからず、InputBox にたどり着いてこれだこれだと喜んでいました。GUIなので、TextBoxとかを使うのが流儀なんですよね。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/10/28 04:23:16
> 今回「With」を知り、これを使うと見やすくなると感激し、全部ソレにしたのです。
VB4 の頃は、With キーワードも持て囃されたのですけれどね。
当時はパフォーマンス面でのメリットもあったのですが…。


> ●本職の皆さんは、どういう方法を使ってるのでしょうか…?
.NET 世代の With は元々、デバッガとの相性があまり良くなかったこともあり、
.NET 版の With については、自分はほとんど使わなくなってしまいました。
オブジェクト初期化子の With ならば使いますけれどね。


> 変数値をチェックしようしても、値が表示されない?
ありますね、そういうこと。

VB2015 以降は、.NET Compiler Platform (いわゆる “Roslyn”) に置き換わったせいか、
開発環境の振る舞いが以前とは微妙に異なる点があったりして、個人的には使いにくい面も。
https://social.msdn.microsoft.com/Forums/ja-JP/1bd0b1c4-3189-40bf-b7e0-60f78ccd78d4/vs201712398124521253112486125221247512531124731239512388123561239?forum=vbgeneralja
https://social.msdn.microsoft.com/Forums/ja-JP/81c0ed52-6474-4c30-ab6c-28985cdf7c00/if259911239824460123981230012301123983535236848124181242812434?forum=vbgeneralja

今回の件以外でも、特定バージョン下における不具合によって、開発環境の動作が
不自然になったり、あるいは気づきにくい仕様変更が突然組み込まれたりと、
バージョンごとに細かい差異があったりします。
https://social.msdn.microsoft.com/Forums/ja-JP/c921790c-93a7-4b2c-8316-feee0faeb500/if25991123982083712428233761236412362123631237512356823065311?forum=vbgeneralja
https://social.msdn.microsoft.com/Forums/ja-JP/4045eb6d-3837-4813-89ec-23b3585f921e/12304vs2019123052599123383259681239112399123941236721015259681239?forum=vsgeneralja
https://social.msdn.microsoft.com/Forums/ja-JP/9eebe940-ac62-407f-b21f-cab8737ea718/compiler-bug-vs2008?forum=csharpgeneralja


> C# には With がありませんし、あまり需要がない機能なのかもしれません。

C# 版にも with が欲しいというニーズはあるのですが、反対意見も多くあります。
今のところ採用には至っていませんし、その意見を覆すほどの有効性も提示されていないようです。
https://docs.microsoft.com/en-us/archive/blogs/csharpfaq/why-doesnt-c-have-vb-nets-with-operator
https://github.com/dotnet/csharplang/issues/2355

ちなみに JScript.NET には with ステートメントがあるのですが、
VB と違って「.」を使わない構文ゆえ分かりにくくなるので、私は使わないです。
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc427941%28v=msdn.10%29


> たしか「Structure」は、自作VB6で「Type」を使ってて
VB4~VB6 のユーザー定義型(Type)に相当するのは、確かに構造体(Structure) です。

しかし、VB6 からの単純な置き換えではなく、.NET の流儀にそって再設計した場合、
Structure ではなく Class にすることが望ましいケースが往々にしてあります。
クラスと構造体のどちらで設計するべきかは、下記のガイドラインが参考になるでしょう。
https://dobon.net/vb/dotnet/beginner/whenusestruct.html


> ・悪い方では(ワタシにとって)「プロシージャ名を日本語から始めてはダメ」
> 例:Sub ■…の明示■() とか
ローマ字も日本語の一種であるという無粋なツッコミはさておき。

名前に平仮名や常用漢字を使うことは問題ありません。
しかし記号については、使える文字と使えない文字があります。
ただ、使用可能な文字種の話は結構ややこしくて…明確に説明できません。orz

'これは NG (記号の丸) 
'Public Sub ○() 
'End Sub 

'これは OK (漢数字のゼロ) 
Public Sub 〇()
End Sub

'こんなメソッド名にもできます 
Public Sub ゚あ゙か゚ːゝゞヽ⁀ヾ〱‿〲〳〴〵()
    
    '下記は、掲示板だと見た目が崩れて見えるかも知れません。 
    'この変数名は、不可視文字を含んだ 7 文字で構成されています。 
    'ae という 2 文字でも無ければ、abcde という 5 文字でもありません 
    Dim a‮bcd‭e As String = "test"
    'MsgBox(ae)   'これは NG (未定義変数) 
    'MsgBox(abcde)   'これは NG (未定義変数) 
    MsgBox(a‮bcd‭e)   'これは OK 
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  'それぞれの文字の Unicode カテゴリを調べてみる 
  Dim p As Func(Of CharString) = Function(c) $"{c}{vbTab}{Char.GetUnicodeCategory(c)}"
  Dim s As String = "■▲〇○◎…アAアAΠΨあ゙か゚あ゛か゜"
  ListBox1.DataSource = s.Select(p).ToArray()
End Sub
投稿者 タカジィ  (社会人) 投稿日時 2020/10/27 16:33:18
ご回答ありがとうございました。

ちょっと話はそれますが、私がこのサイトを見る(読む)のは、業界の風のようなモノを感じるからです。
書籍(解説書)にはない「ナマの声」です。
「中学校」での解説文や、この掲示板での「るきお」さんと「魔界の仮面弁士」さんの微妙な(業界での立ち位置の差のような?)文章の差も、読んでて楽しいですね。
「るきお」さんがズバズバと「コレはオススメしない」「ココまでは普通やらない」「コレは使わない」などと言い切ってるトコが読んでて気持ちいいです。
まさか、それが、ワタシのコトだとは思ってもみませんでしたが(笑)

たしか「Structure」は、自作VB6で「Type」を使ってて、それを.NETに自動変換したとき(当時のVB有料版にはツールとして付属してたと記憶)、オススメとして提示されたのです。
指示通りに置換しただけで、ナンの問題もなく動作したので、そのままにしてあって。

ザッと自作のプログラムを見ても、多数の「Structure」と、中で定義している変数もたくさんで。
今回「With」を知り、これを使うと見やすくなると感激し、全部ソレにしたのです。
例(ゲーム系)※下はいいかげんな例
  Cast(10) As STRUCT_Cast

  With Cast(nボスキャラ)
    Select Case .mode
      Case n単純直進移動
       if .course = *** then …

元にもどすのも苦労しそうで(作業ミスもありそう?)アドバイスにあった「ウォッチウィンドウ」を検討したいと思います(一度も使ったことないです)。
※う~む。完全にガラパゴス状態でしたかね(笑)

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

追伸
ワタシが今回10年ぶりのVB再会(再開?)でびっくりしたのが
・良い方では「文字列の連結で変数の内容取得がスッキリしたこと」
 例:nameStr = $"その名前は{targetName}だ!"
・悪い方では(ワタシにとって)「プロシージャ名を日本語から始めてはダメ」
 例:Sub ■…の明示■() とか Function ▲…の選択▲() など一切ダメ(以前はOKだった)
  ※ワタシは最初と最後の「■」「▲」などで、そのプロシージャの大まかな処理がわかるようにしてたのですが、全部ダメになりました(笑)
  →対処 どこの国の文字か不問で、使用OKのうち、イメージ的に妥協できる文字で代替
    例「Π…の明示Π」とか「Ψ…の選択Ψ」 ←更なるガラパゴス化?(笑)

別件で思い出したこと
若い頃(DOSーBASICの頃)、初めてVB(ver.4?)を知り、解説本を読んでマスターしようとしたのですが…
どの本にも「VBはイベントドリブンだから、どこからでも始められる」とあって、ワタシは大混乱。
1か月以上かけて何冊も本を読んだ末、1冊の本にひっそりと「一般的には FormLoad から(プログラム作成=初期化など=を)スタート」とあるのを見つけ…
独学は楽しいけどキツい…と、実感したものです。

以上
投稿者 るきお(管理者)  (社会人) 投稿日時 2020/10/27 08:32:38
プログラムは楽しい趣味ですよね。そして、進化のスピードが速いので、どんどん新しいことが次から次へと出てきますので、ついに初級講座も改訂版を書き始めてしまいました。なかなか大変なんですが、最近この手のサイトが少なくなってきているようにも感じるのでプログラム初心者の受け皿になれればと思っています。

さて、ご質問の件ですが、私は気が付いていませんでした。

たしかにやってみると .nbm1 の方にはマウスカーソルをホバーさせても内容が表示されませんね。test.nmb1の方には表示されました。
それに自動変数ウィンドウも、この .nbm1 には反応してくれないようです。

タカジィさんに言われるまで気が付かなかったくらいなので、私はこれで困ったことはありません。
With ~ End With をほとんど使わないからです。

Withを使いたくなるほど1つの変数のメソッドやプロパティを次々と呼び出すということがほとんどないように思います。C# には With がありませんし、あまり需要がない機能なのかもしれません。

デバッグ中にマウスホバーで値を確認したければ、Withを使わないようにするしか方法がなさそうです。
代替案としてはウォッチウィンドウに test を登録しておけば、 test の内容はいつでも見られるので、マウスホバーが不要になります。

投稿者 タカジィ  (社会人) 投稿日時 2020/10/26 18:12:20
すでに60歳を超えた爺で、趣味のプログラマーです。
※プログラム業界に関わったことは一度もありません(完全に独学です)。

春先から、久しぶりに(10年ぶりぐらい;笑)自作プログラムをVB2019に変更してました。
その頃に、このサイトを見つけ、初級講座と改訂版…を何度も懐かしく読み直してました。

最近、このプログラムに、どうもバグ(ずっと以前からの)があることに気づき、変数などをチェックしてるのですが、With内で構造体の値のチェック方法がわかりません。
よろしくご指導お願いします。

●経過
構造体をWith ~ End With内で使うとき、名前の省略ができるとあったので、全部を変更しました。
とても見やすくはなったのですが、プロシージャ内で「Stop」をかけて、変数値をチェックしようしても、値が表示されない?
●サンプル
下記プログラム中の「Stop」で止めて、カーソルを「test.nmb1」の上にすると、値が表示されるが、省略時の「.nmb1」では、何も変化なし…?
※カーソルを「dummy01」の上にすると、値が表示されますが、実際のプログラムでは、こういう状況はあまりないです(使えない)。
●本職の皆さんは、どういう方法を使ってるのでしょうか…?
よろしくお願いいたします。

'テスト用にフォームを間借り
Public Class Form1

    '構造体を定義 ※実際には多数の変数を収納
    Friend Structure STRUCT_test
        Friend nmb1 As Integer
    End Structure

    Friend test As STRUCT_test

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        test.nmb1 = 1
        TestWith()
    End Sub

    Public Sub TestWith()
        With test
            Dim dummy01 As Integer = .nmb1     'With使用で、構造体名(というのか?)省略
            Dim dummy11 As Integer = test.nmb1 '省略なし

            Stop

        End With
    End Sub
End Class