Class を跨いで共通で使える変数を作成したい への返答

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

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

投稿者 ケンケン  (社会人) 投稿日時 2021/11/30 17:07:30
ご丁寧な指導ありがとうございます。
とても参考になりました。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/11/30 16:38:44
> login-id をlogin list でも使いたい

マイナス記号を含むメンバー名は定義できません。

大文字小文字を混ぜた PascalCase 表記で
  Public LoginId As String
のようにするか、あるいはアンダーバーを用いた SNAKE_CASE 表記で
  Public LOGIN_ID As String
のようにすることで代用してみてください。


> クラスを跨いで共通の変数を作成したいです。

それぞれのクラスインスタンスが、単一生成なのか複数個生成されるものなのか、
また、各クラスのインスタンスをどこで管理しているかによっても、
また話が変わってくるわけですが、おおよそ、下記のような手法が思いつきます。

案1) シングルトン クラスを用意してアクセスするようにする
案2) クラスのインスタンス メンバーではなく、クラスの共有(Shared)メンバーを用意する
案3) クラス(Class)の代わりにモジュール(Module)を使ってやり取りする


たとえば 案2 の例。
Login クラスを下記のような実装にしてみた場合…

Public Class Login
    Public Shared Property Id As String
End Class


画面1から「Login.Id = "ケンケン"」と設定して、
それを list クラス内で利用したり、あるいは
画面2で「Label1.Text = Login.Id」のようにして
取り出したりすることができます。

ただしこの場合、ログインID をどこからでも自由に改竄できる点に注意が必要です。


処理内容によっては、認証情報を独自あるいは既存の IPrincipal 実装に保持して、
My.User オブジェクトに保持させるという選択肢もあります。

My.User.CurrentPrincipal = New System.Security.Principal.GenericPrincipal(
           New System.Security.Principal.GenericIdentity("ケンケン""Example"),
           New String() {"投稿者""質問者"})


この時、保存先とした My.User はプロジェクト内のどこからでも利用可能なプロパティであり、
別画面などで
 Label1.Text = My.User.Name  'ケンケン
 If My.User.IsInRole("管理者") Then  'False
 ElseIf My.User.IsInRole("質問者") Then  'True
のようにして利用できます。
投稿者 ケンケン  (社会人) 投稿日時 2021/11/30 14:55:45

 login-id をlogin list でも使いたい


Public Class Login
 login-id = xxxx 'set  
End Class


Public Class list
  '参照
  login-id → login Class のlogin-id を此処でも使いたい  
End Class


クラスを跨いで共通の変数を作成したいです。