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

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

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

Re[5]: これを関数にするには


(過去ログ 167 を表示中)

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

■96459 / inTopicNo.1)  これを関数にするには
  
□投稿者/ から好し (8回)-(2020/11/26(Thu) 14:13:01)
から好し さんの Web サイト

分類:[.NET 全般] 

開発環境 VS2019
使用言語 C#Windowsフォーム

現在、構造体を使用し、複数のデータを使い分けています。
フォームにはAボタンBボタンの二つあり、
Aボタンを押すとKYOTO_&#810;CITYのデータを使って処理をし、
Bボタンを押すとKYOTO_&#810;CITY2のデータを使って処理をします。
ただ、処理の内容自体は同じなので、処理を1回の記述で済ませたいと思います。
(現在は、それぞれのボタンに対して、繰り返し記述しています)

public struct CHIMEI
{
    string chimei;
string address;
int tell;
}
CHIMEI KYOTO_&#810;CITY = new CHIMEI()
{
chimei="伏見区";
address="京都市";
int =0120001
}

CHIMEI KYOTO_&#810;CITY2 = new CHIMEI()
{
chimei="中京区";
address="京都市";
int =0120002
}


private void displayKYOTO()
{
textbox.Text=KYOTO_&#810;CITY.chimei;
以下略
}

private void displayKYOTO2()
{
textbox.Text=KYOTO_&#810;CITY2.chimei;
以下略
}

何かいい案がありましたら、ご教示頂ければ幸いです。




引用返信 編集キー/
■96460 / inTopicNo.2)  Re[1]: これを関数にするには
□投稿者/ 魔界の仮面弁士 (2924回)-(2020/11/26(Thu) 14:24:38)
No96459 (から好し さん) に返信
> 現在、構造体を使用し、複数のデータを使い分けています。

内容的には構造体ではなく、クラスを用いるべきかと思います。


> Aボタンを押すとKYOTO_&#810;CITYのデータを使って処理をし、
> Bボタンを押すとKYOTO_&#810;CITY2のデータを使って処理をします。

_ すなわち [U+005F] `Low Line` の後に書かれている &#810; は、
Unicide の合成可能下付ダイアクリティカルに属する
[U+032A] `Combining Bridge Below` の IPA 文字ですね。



> ただ、処理の内容自体は同じなので、処理を1回の記述で済ませたいと思います。
> (現在は、それぞれのボタンに対して、繰り返し記述しています)

ボタンと構造体の組み合わせがどのように決まるのか分かりませんが、

private void display(CHIMEI location)
{
 textbox.Text = location.chimei;
}

にして呼び出せばよいのでは。
引用返信 編集キー/
■96461 / inTopicNo.3)  Re[2]: これを関数にするには
□投稿者/ から好し (10回)-(2020/11/26(Thu) 14:38:53)
から好し さんの Web サイト
No96460 (魔界の仮面弁士 さん) に返信
> ■No96459 (から好し さん) に返信

返信ありがとうございます。
>
> 内容的には構造体ではなく、クラスを用いるべきかと思います。

についてですが、もう少し詳しく教えて頂けると助かります。



引用返信 編集キー/
■96462 / inTopicNo.4)  Re[3]: これを関数にするには
□投稿者/ 魔界の仮面弁士 (2925回)-(2020/11/26(Thu) 14:42:33)
No96461 (から好し さん) に返信
>>内容的には構造体ではなく、クラスを用いるべきかと思います。
> についてですが、もう少し詳しく教えて頂けると助かります。

https://dobon.net/vb/dotnet/beginner/whenusestruct.html
https://takap-tech.com/entry/2018/10/19/004932
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/

引用返信 編集キー/
■96463 / inTopicNo.5)  Re[4]: これを関数にするには
□投稿者/ ぶなっぷ (261回)-(2020/11/27(Fri) 10:02:38)
2020/11/27(Fri) 10:07:31 編集(投稿者)
から好し さん

> ただ、処理の内容自体は同じなので、処理を1回の記述で済ませたいと思います。
これは、ボタンのClickハンドラを一つにしたいという話?

であれば、A/Bボタンのハンドラとして、まさに同じ関数(メソッド)を指定すれば
いいです。ここでは、以下のようなメソッドを指定したとします。
  private void BtnClick(object sender, EventArgs e);

同じメソッドにした以上、メソッド内でどちらのボタンが押されたか識別する必要が
あります。
引数のsenderには、押されたボタン(をobject型にキャストしたもの)が渡ってきます。
なので、元の型にキャストしてやればよいです。
  var btn = sender as Button;

A/Bボタンでボタンに表示されている文字列は異なるでしょうから、それを利用して
どちらのボタンが押されたか判断してもいいですが、
  switch(btn.Text)
見た目と実装の分離という観点からはよくないです。

なので、ボタンにちゃんと名前をつけて、それを識別子とします。
ここでは、ボタンのNameプロパティに、それぞれ BtnA, BtnB と指定したとします。

から好し さんのサンプルだと違いは以下の行だけのようですので、
 > textbox.Text=KYOTO_&#810;CITY.chimei;
すべてをひっくるめると、以下のような感じでいけます。
  private void BtnClick(object sender, EventArgs e)
  {
    var btn = sender as Button;
   if(btn == null) return;

    switch(btn.Name)
    {
      case "BtnA":
        textbox.Text=KYOTO_&#810;CITY.chimei;
        break;
      case "BtnB":
        textbox.Text=KYOTO_&#810;CITY2.chimei;
        break;
    }
    以下略
  }

引用返信 編集キー/
■96464 / inTopicNo.6)  Re[5]: これを関数にするには
□投稿者/ 魔界の仮面弁士 (2926回)-(2020/11/27(Fri) 10:50:43)
2020/11/27(Fri) 11:07:32 編集(投稿者)

No96459 (から好し さん) に返信
> CHIMEI KYOTO_&#810;CITY = new CHIMEI()

この掲示板は Shift_JIS 前提なので、Unicode 文字が数値実体参照に化けてしまいますね。

C# の場合、Unicode 文字が使えない環境であっても、
 CHIMEI KYOTO_\u032aCITY = new CHIMEI()
のように書くことで正確に表すことができます。

int \u0061 = 1; // int a = 1; と同義
int \u0062 = 2; // int b = 2; と同義
int c = a + b;


とはいえどちらにせよ、最初の質問にあった
> = new CHIMEI()
> {
>  chimei="中京区";
>  address="京都市";
>  int =0120002
> }
というコードは明らかに C# の構文エラーになるハズなので、
提示頂いた元のコードが、そもそもかなり怪しいです…。



No96463 (ぶなっぷ さん) に返信
> 引数のsenderには、押されたボタン(をobject型にキャストしたもの)が渡ってきます。
> なので、元の型にキャストしてやればよいです。

このパターンの場合は、CHIMEI を class に変更しておくと、
No96455No96391 のように Dictionary<object, CHIMEI> で
管理できるようになるので、さらにスッキリ書けそうですね。
引用返信 編集キー/
■96465 / inTopicNo.7)  Re[6]: これを関数にするには
□投稿者/ 魔界の仮面弁士 (2927回)-(2020/11/27(Fri) 11:04:32)
2020/11/27(Fri) 14:10:28 編集(投稿者)

No96464 (魔界の仮面弁士) に追記
> というコードは明らかに C# の構文エラーになるハズなので、
> 提示頂いた元のコードが、そもそもかなり怪しいです…。

構文エラーにならないよう修正するなら、たとえばこんな感じ

// 構造体ではなくクラスに変更
public class CHIMEI
{
  // private のままだと、フィールドにアクセスできないので public に変更
  public string chimei;
  public string address;
  public int tell;
}

// 変数名に Unicode 文字を使うのをやめる
CHIMEI KYOTO_CITY = new CHIMEI()
{
  // 初期化子なので、セミコロンではなくカンマで区切る
  chimei = "伏見区",
  address = "京都市",
  // 整数リテラルの先頭ゼロは無意味なので除去
  tell = 120001,
};


さらに言えば:

・CHIMEI KYOTO_CITY や CHIMEI KYOTO_CITY2 のような個別の変数を用意するのではなく、
 CHIMEI[] kyoto や List<CHIMEI> kyoto や Dictionary<Button, CHIMEI> kyoto などのように、
 配列やコレクションで管理した方が、今後、項目が増えた時にも対処しやすいと思います。

・.NET (特に C# や VB) の場合、命名規約として
 「引数やローカル変数名は、先頭小文字の camelCase 表記で命名する」
 「class, struct の型名は、先頭大文字の PascalCase 表記で命名する」
 「メソッドやプロパティ名、public フィールド名なども PascalCase」
 とすることが一般的です。

・public なフィールド変数を作るのではなく、
 public なプロパティを設けた方が望ましいです。
引用返信 編集キー/
■96466 / inTopicNo.8)  Re[1]: これを関数にするには
□投稿者/ furu (95回)-(2020/11/27(Fri) 12:55:30)
No96459 (から好し さん) に返信
このFormだけでしか使わないのであれば
タプルを使用する手もあります。

Dictionary<object, (string chimei, string address, int tell)>	dict;

private void Form_Load(object sender, EventArgs e)
{
    dict = new Dictionary<object, (string, string, int)>()
                    {
                        {button1,    ("伏見区",    "京都市", 0120001)},
                        {button2,    ("中京区",    "京都市", 0120002)},
                    };
}

private void button_Click(object sender, EventArgs e)
{
    var x = dict[sender];

    textBox.Text    = x.chimei;
    以下略
}

引用返信 編集キー/
■96468 / inTopicNo.9)  Re[2]: これを関数にするには
□投稿者/ から好し (11回)-(2020/11/27(Fri) 13:41:03)
から好し さんの Web サイト
No96466 (furu さん) に返信

返信ありがとうございます。
じつはタプルも試したんですが、ここには書いていないのですが
構造体のメンバーに多次元配列も居るんです。
それで、調べてみたんですが多次元を使った例がなく、上手く行かなかったので断念しました。
もし、多次元での使用の仕方をご存じでしたら教えて頂けると幸いです。

引用返信 編集キー/
■96469 / inTopicNo.10)  Re[3]: これを関数にするには
□投稿者/ furu (96回)-(2020/11/27(Fri) 14:04:42)
No96468 (から好し さん) に返信
> ■No96466 (furu さん) に返信
> もし、多次元での使用の仕方をご存じでしたら教えて頂けると幸いです。
タプルも構造体なので
多次元配列あるのでしたら、止めたほうがいいです。

後々改修するとき、クラスで無かったことに後悔します。
引用返信 編集キー/
■96471 / inTopicNo.11)  Re[4]: これを関数にするには
□投稿者/ から好し (12回)-(2020/11/27(Fri) 14:15:12)
から好し さんの Web サイト
No96469 (furu さん) に返信


返信ありがとうございます。

引用返信 編集キー/
■96484 / inTopicNo.12)  Re[5]: これを関数にするには
□投稿者/ から好し (14回)-(2020/12/01(Tue) 16:00:51)
から好し さんの Web サイト
解決しました。
ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -