10

オプションのパラメーターをC#のメソッドに渡す方法は?

SendCommandというメソッドを1つ作成したとします。

public void SendCommand(string command,string strfileName)
{
            
    if (command == "NLST *" ) //Listing Files from Server.
    {
        //code
    }
    else if (command == "STOR " + Path.GetFileName(uploadfilename)) //Uploading file to Server
    {
        //code
    }
    else if ...
}

今、私はこのメソッドを次のようなメインメソッドで呼び出したいと思います

SendCommand("STOR ", filename);
SendCommand("LIST"); // In this case i don't want to pass the second parameter

それを達成する方法は?

4

13 に答える 13

17

.NET 4より前では、メソッドをオーバーロードする必要があります。

public void sendCommand(String command)
{
    sendCommand(command, null);
}

.NET 4では、デフォルトのパラメーターのサポートが導入されています。これにより、これらすべてを1行で実行できます。

public void SendCommand(String command, string strfilename = null)
{
  //method body as in question
}

ちなみに、あなたが書いた質問では、最初の例でもメソッドを呼び出していません。

Sendcommand("STOR " + filename);

2つの文字列を連結した単一のパラメータを引き続き使用しています。

于 2010-07-29T08:47:13.897 に答える
14

params属性を使用します。

public void SendCommand(String command, params string[] strfilename)
{
}

次に、次のように呼び出すことができます。

SendCommand("cmd");
SendCommand("cmd", "a");
SendCommand("cmd", "b");

または、C#4.0を使用している場合は、新しいオプションの引数機能を使用できます。

public void SendCommand(String command, string strfilename=null)
{ 
   if (strfilename!=null) .. 
}
于 2010-07-29T08:50:03.630 に答える
5

これに対する明白な答えは、そうしないでください

Executeメソッドを使用して、コマンドごとに個別のメソッドを用意するか、コマンドベースクラスとコマンドごとに個別の派生クラスを用意する必要があります。

考えられるすべてのコマンドを処理する1つのメソッドを持つのは悪い設計です。

Sendcommand()考えられるすべてのコマンドを処理する必要はありません。

于 2010-07-29T08:56:34.753 に答える
1

C#4.0のオプションパラメータを確認してください。

また、.NET4を使用していることを確認してください。

古いバージョンの.NETを使用する必要がある場合。

メソッドのオーバーロードが解決策です:

public void SendCommand(String command)
{
    SendCommand(command, null);
    // or SendCommand(command, String.Empty);
} 

public void SendCommand(String command, String fileName)
{
    // your code here
} 
于 2010-07-29T08:52:25.127 に答える
1

皆さん、

私はこのスレッドを見て、実際には存在しない問題を解決しようとしていました。C#はparams配列を「通過するだけ」だからです。試してみるまでわからなかった。

これがSSCCEです。

using System;
using System.Diagnostics; // for Conditional compilation of method CONTENTS

namespace ConsoleApplication3
{
    public static class Log
    {
        [Conditional("DEBUG")] // active in Debug builds only (a no-op in Release builds)
        public static void Debug(string format, params object[] parms) {
            Console.WriteLine(format, parms); 
            // calls Console.WriteLine(string format, params object[] arg);
            // which I presume calls String.Format(string format, params object[] arg);
            // (Sweet! just not what I expected ;-)
        }
    }

    class Program //LogTest
    {
        static void Main(string[] args) {
            Log.Debug("args[0]={0} args[1]={1}", "one", "two");
            Console.Write("Press any key to continue . . .");
            Console.ReadKey();
        }

    }
}

生産:

args[0]=one args[1]=two

甘い!

しかし、なぜ?...まあ(もちろん)非常にオーバーロードされたConsole.WriteLineメソッドに最も近いパラメーターの一致は(string format, params object[] arg)...(string format, object arg)私が思っていたものではないからです。

Console.WriteLineがそれを行うので、私はこれがどういうわけか可能でなければならないことをある程度知っていました、私はそれがハードであるとどういうわけか期待していました...したがって、このトリックのシンプルさと「素晴らしさ」は言語は注目に値します。

CSharpLanguageDesigners.ToList().ForEach(dude=>dude.Kudos++);

乾杯。キース。

PS: VB.NETが同じように動作するのだろうか?私はそれがしなければならないと思います。

于 2012-09-25T23:05:08.370 に答える
0

これには3つの簡単な解決策があります。

  1. メソッドをオーバーロードする
  2. メソッドが「null」を受け入れ、適切に処理できるようにします
  3. オプションのパラメータを許可する.NET4を使用します
于 2010-07-29T08:47:23.163 に答える
0

最初を呼び出す別のメソッドを作成しますか?

public void SendCommand(String command)
{
    SendCommand(command, null);
}
于 2010-07-29T08:48:00.387 に答える
0

関数をオーバーロードします。条件分岐をチェックするのではなく。このようなもの:

public void SendCommand(String command,string strfilename)
{    
    if (command == "STOR " + 
        Path.GetFileName(uploadfilename)) //Uploading file to Server
    {
        //code
    }
    else if ............
}

public void SendCommand(String command)
{ 
        //code

}
于 2010-07-29T08:49:58.200 に答える
0

これはいくつかの方法で行うことができます。.NET 4.0を使用している場合は、メソッドでオプションのパラメーターを使用できます。

public void SendCommand(String command,string strfilename = null)
{
    ....
}

それ以外の場合は、既存のメソッドを呼び出すが、オプションにするデフォルトのパラメーターを渡す別のメソッドを作成できます。

public void SendCommand(String command)
{
    SendCommand(command,null);
}
于 2010-07-29T08:50:24.827 に答える
0

オプションのパラメータ機能はc#4.0に含まれています。ここにリンクがあります。それ以外の場合は、オーバーロードされた関数を作成する必要があります。

于 2010-07-29T08:52:25.830 に答える
0

このページに記載されているすべての回答は、オプションのパラメーターを受け入れる有効な方法ですが、多くの場合、これは、メソッドが実行しすぎていることを示しています。

多くの場合、次の明確な方法を使用したほうがよい場合があります...

public void GetFileListFromServer()
{
    //Listing Files from Server.
    //code
}

public void UploadFileToServer(string strfilename)
{
    //Uploading file to Server
    //code
}
于 2010-07-29T08:56:50.213 に答える
0

paramsキーワードを使用できます:

private static void SendCommand(String command, params string[] filenames)
{

    if (command == "NLST *" ) //Listing Files from Server.
    {
        //code
    }

    if (command == "STOR ")
    {
        foreach (string fileName in filenames)
        {
            if (String.IsNullOrWhiteSpace(fileName))
            {
                // code
            }
        }
    }
}

そして、あなたはそれを次のように使うことができます:

static void Main(string[] args)
{
    SendCommand("NLST *");
    SendCommand("STOR ", "myfile1.txt", "myfile.txt");
}
于 2010-07-29T09:10:42.750 に答える
0

Runtime.InteropServices[option]名前空間の属性の使用は、ここではまだ提案されていません。

C#でメソッドパラメータをオプションにする4つの異なる方法を確認してください

于 2020-12-16T12:15:24.660 に答える