質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

5回答

15563閲覧

引数が多い場合、まとめることはできますか?

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2015/10/26 09:22

編集2015/10/26 10:06

いつもお世話になております。

引数が多い場合、引数をクラスなどにまとめて渡すことは可能でしょうか?

以下にサンプルプログラムを用意しました。
azまでの変数を引数として渡すとき、いちいち「az」を書き込んでいくのは、大変でありプログラムも見づらくなってしまうと思います。改善案としましてはどのようなものがありますでしょうか?

ご指導ご鞭撻の程よろしくお願い致します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) { double sum = 0; float a1 = 1.5; int b1 = 2; int c1 = 3; int d1 = 4; int e1 = 5; int f1 = 6; float g1 = 7.5; // ... int z = 26 math(ref sum, a1, b1, c1,d1,e1,f1,g1 /* ... z */); } private void math (ref double sum, float a1, int b1, int c1, int d1, int e1, int f1, float g1 /* ... int z */) { sum = a1 + b1 + c1 + d1 + e1 + f1 + g1 /* ・・・ + z1 */; } }

}

※ 追記1

試行錯誤した結果、クラスを引数として渡せたと思うのですが、この方法はあっていますでしょうか?
他に最適な方法などありますでしょうか?
お手数おかけして申し訳ございませんが、再度ご教授願えませんでしょうか?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
class hensuu
{
public double sum;

public double a1; public int b1; public int c1; public int d1; public int e1; public int f1; public double g1; // ... int z = 26 } public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void Form1_Load(object sender, EventArgs e) { hensuu h = new hensuu(); h.a1 = 1.5; h.b1 = 2; h.c1 = 3; h.d1 = 4; h.e1 = 5; h.f1 = 6; h.g1 = 7.5; math(ref h); } private void math (ref hensuu h) { h.sum = h.a1 + h.b1 + h.c1 + h.d1 + h.e1 + h.f1 + h.g1 /* ・・・ + z1 */; } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

型が違うのなら構造体で渡してはいかがですか?

投稿2015/10/26 09:33

Yoshikatsu_

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/26 09:41

お答えありがとうございます。 やはり構造体として渡すしか方法はないのでしょうか? 勉強のために構造体で渡す以外の方法などご存知でしたら、教えて頂けないでしょうか?
guest

0

ベストアンサー

こんにちは。

その変数は、a~zで定義する理由があるのですか?
まずそこを再考してください。

そのうえで、
a~zとして渡す必要があるのであればKeyValueで管理できるDictionaryの活用を検討してみてください。
a~zで渡す必要がなく、ただ大量の変数を定義して渡したい、というだけであれば構造体、またはクラスで受け渡すことを検討してください。

投稿2015/10/26 09:39

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/26 09:44

お答えありがとうございます。 >>a~zで渡す必要がなく、ただ大量の変数を定義して渡したい、というだけであれば構造体、またはクラスで受け渡すことを検討してください。 ただ大量の変数を定義して渡したいです。 構造体で渡すことには成功したのですが、クラスで渡す方法が分からずにいます。 もしよろしければご教授頂けないでしょうか?
Tak1wa

2015/10/26 10:24

追記みました。クラスで渡せていますよ。 ただ、Refキーワードはいらないです。
fender0131

2015/10/27 01:21

適切なアドバイスいつも大変助かっております。
guest

0

Builderを使うと表面上は隠蔽することができます。
ただし、内部でコンストラクタの引数が多いことには変わりが無いので面倒なことが増えるだけなので、
イミュータブルなインスタンスを一部変更したいとかでなければあまり使いませんが:)

たとえばこんな感じで

public partial class TestDtoBuilder { private _a; private _b; private _c; private _d; private _e; private _f; public TestDtoBuilder() { } public TestDtoBuilder(TestDto that) { this._a = that.a; this._b = that.b; this._c = that.c; this._d = that.d; this._e = that.e; this._f = that.f; } public TestDto Build() { return new TestDto( this._a , this._b , this._c , this._d , this._e , this._f ); } public TestDtoBuilder a( a) { this._a = a; return this; } public TestDtoBuilder b( b) { this._b = b; return this; } public TestDtoBuilder c( c) { this._c = c; return this; } public TestDtoBuilder d( d) { this._d = d; return this; } public TestDtoBuilder e( e) { this._e = e; return this; } public TestDtoBuilder f( f) { this._f = f; return this; } }

投稿2015/10/26 15:02

fem

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/27 01:14

お答えありがとうございます。 ソースコードまで提示して頂きありがとうございました。 色々な方法があるのですね。 大変参考になりました。
guest

0

邪道かつバグの温床になるのでお勧めは全くできませんが、受け取る側のメソッドについては、可変長引数+dynamicにすれば、型なんか気にせずに複数引数を一度に取得できないことはないです。

C#

1using System; 2 3public class HensuIppai 4{ 5 [STAThread] 6 public static void Main(string[] args) 7 { 8 HensuIppai hi = new HensuIppai(); 9 Console.WriteLine(hi.YobiDashi()); 10 } 11 12 private double YobiDashi() 13 { 14 double sum = 0; 15 16 var a1 = 1.52; 17 var b1 = 2F; 18 var c1 = 3U; 19 var d1 = 4; 20 var e1 = 2L; 21 var f1 = 6; 22 var g1 = 7.3; 23 var h1 = "1"; 24 var i1 = "3.5e2"; 25 26 math(ref sum, a1, b1, c1, d1, e1, f1, g1, h1, i1); 27 return sum; 28 } 29 30 private void math (ref double sum, params dynamic[] args) 31 { 32 foreach (dynamic n in args) 33 { 34 if (n.GetType().IsPrimitive) 35 { 36 sum += n; 37 } 38 else 39 { 40 sum += Double.Parse(n.ToString()); 41 } 42 } 43 } 44}

もう、なんかどこかの動的型付き言語を触っている気分になります。こんなのC#じゃない…。

投稿2015/10/26 12:51

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/27 01:20

お答えありがとうございます。 ソースコードを掲載して頂きありがとうございます。 「可変長引数+dynamic」というのが初耳でした。 勉強のためにも調べて参ります。 貴重なご意見ありがとうございました。
guest

0

型が同じなのであれば、
配列を使うのはどうですか?

int[] a = new int[3];
a[0] = 100;
a[1] = 200;
a[2] = 300;

math(a)


void math(int[] a){
sum = a[0]+a[1]+a[2];
}

という感じです。

投稿2015/10/26 09:29

SKYYFISH

総合スコア654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/26 09:33

お答えありがとうございます。 すいません。 サンプルプログラムだったもので、そこまで考えておりませんでした。 型は「string」であったり、「int」であったり、「float」であったりと様々です。 お手数おかけして申し訳ございませんが、再度お答えいただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問