Tentukan argumen metode bernama dan opsional

Selesai

Argumen bernama memungkinkan Anda menentukan argumen untuk parameter dengan mencocokkan argumen dengan namanya daripada dengan posisinya dalam daftar parameter. Argumen opsional memungkinkan Anda menghilangkan argumen untuk beberapa parameter. Kedua teknik dapat digunakan dengan metode, pengindeks, konstruktor, dan delegasi.

Saat Anda menggunakan argumen bernama dan opsional, argumen dievaluasi dalam urutan muncul dalam daftar argumen, bukan daftar parameter.

Parameter bernama dan opsional memungkinkan Anda menyediakan argumen untuk parameter yang dipilih. Kemampuan ini sangat memudahkan panggilan ke antarmuka COM seperti API Microsoft Office Automation.

Argumen bernama

Argumen bernama membebaskan Anda dari pencocokan urutan argumen dengan urutan parameter dalam daftar parameter metode yang disebut. Argumen untuk setiap parameter dapat ditentukan oleh nama parameter.

Nota

Argumen bernama meningkatkan keterbacaan kode Anda dengan mengidentifikasi apa yang diwakili oleh setiap argumen.

Pertimbangkan metode yang menggunakan tanda tangan metode berikut:


static void PrintOrderDetails(string sellerName, int orderNum, string productName)
{
    // Code to print the order details
}

Metode ini dapat dipanggil dengan sukses tanpa menggunakan argumen bernama selama argumen berada dalam urutan yang benar (ditentukan oleh tanda tangan metode):


PrintOrderDetails("Gift Shop", 31, "Red Mug");

Jika Anda tidak ingat urutan parameter tetapi mengetahui namanya, Anda dapat mengirim argumen dalam urutan apa pun.


PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
PrintOrderDetails(productName: "Red Mug", sellerName: "Gift Shop", orderNum: 31);

Saat digunakan dengan argumen posisi, argumen bernama valid selama digunakan dalam posisi yang benar.

Contoh berikut berfungsi dengan benar karena: parameter productName diberi nama secara eksplisit, tidak diikuti oleh argumen posisi apa pun, dan berada di posisi yang benar.


PrintOrderDetails("Gift Shop", 31, productName: "Red Mug");

Argumen posisional yang mengikuti argumen bernama di luar urutan tidak valid.


// This generates CS1738: Named argument specifications must appear after all fixed arguments have been specified.
PrintOrderDetails(productName: "Red Mug", 31, "Gift Shop");

Argumen opsional

Definisi metode dapat menentukan apakah parameternya diperlukan atau opsional. Setiap panggilan harus memberikan argumen untuk semua parameter yang diperlukan, tetapi dapat menghilangkan argumen untuk parameter opsional. Jenis referensi nullable (T?) memungkinkan argumen untuk secara eksplisit null tetapi tidak secara inheren membuat parameter opsional.

Setiap parameter opsional memiliki nilai default sebagai bagian dari definisinya. Jika tidak ada argumen yang dikirim untuk parameter tersebut, nilai default akan digunakan. Nilai default harus merupakan salah satu jenis ekspresi berikut:

  • Ekspresi konstanta, seperti string atau angka harfiah.
  • Ekspresi formulir new ValType(), di mana ValType adalah jenis nilai, seperti enum atau struct.
  • Ekspresi formulir default(ValType), di mana ValType adalah jenis nilai.

Parameter opsional ditentukan di akhir daftar parameter, setelah parameter yang diperlukan. Pemanggil harus memberikan argumen untuk semua parameter yang diperlukan dan parameter opsional apa pun yang ditentukannya. Celah yang dipisahkan koma dalam daftar argumen tidak didukung. Misalnya, dalam kode berikut, metode instans ExampleMethod didefinisikan dengan satu parameter yang diperlukan dan dua opsional.


public void ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10)

Panggilan berikut ke ExampleMethod menyebabkan kesalahan pengkompilasi, karena argumen disediakan untuk parameter ketiga tetapi tidak untuk yang kedua.


// anExample.ExampleMethod(3, ,4);

Namun, jika Anda mengetahui nama parameter ketiga, Anda dapat menggunakan argumen bernama untuk menyelesaikan tugas.


anExample.ExampleMethod(3, optionalint: 4);

IntelliSense menggunakan tanda kurung untuk menunjukkan parameter opsional, seperti yang ditunjukkan dalam ilustrasi berikut:

Cuplikan layar memperlihatkan bagaimana IntelliSence menggunakan tanda kurung siku untuk menunjukkan parameter opsional.

Nota

Anda juga dapat mendeklarasikan parameter opsional dengan menggunakan kelas .NET OptionalAttribute. OptionalAttribute parameter tidak memerlukan nilai default. Namun, jika nilai default diinginkan, pertimbangkan untuk menggunakan kelas DefaultParameterValueAttribute.

Dalam contoh berikut, konstruktor untuk ExampleClass memiliki satu parameter, yang bersifat opsional. Metode instans ExampleMethod memiliki satu parameter yang diperlukan, required, dan dua parameter opsional, optionalstr dan optionalint. Kode dalam Main menunjukkan berbagai cara di mana konstruktor dan metode dapat dipanggil.


namespace OptionalNamespace
{
    class OptionalExample
    {
        static void Main(string[] args)
        {
            // Instance anExample does not send an argument for the constructor's
            // optional parameter.
            ExampleClass anExample = new ExampleClass();
            anExample.ExampleMethod(1, "One", 1);
            anExample.ExampleMethod(2, "Two");
            anExample.ExampleMethod(3);

            // Instance anotherExample sends an argument for the constructor's
            // optional parameter.
            ExampleClass anotherExample = new ExampleClass("Provided name");
            anotherExample.ExampleMethod(1, "One", 1);
            anotherExample.ExampleMethod(2, "Two");
            anotherExample.ExampleMethod(3);

            // The following statements produce compiler errors.

            // An argument must be supplied for the first parameter, and it
            // must be an integer.
            //anExample.ExampleMethod("One", 1);
            //anExample.ExampleMethod();

            // You can't leave a gap in the provided arguments.
            //anExample.ExampleMethod(3, ,4);
            //anExample.ExampleMethod(3, 4);

            // You can use a named parameter to make the previous
            // statement work.
            anExample.ExampleMethod(3, optionalint: 4);
        }
    }

    class ExampleClass
    {
        private string _name;

        // Because the parameter for the constructor, name, has a default
        // value assigned to it, it's optional.
        public ExampleClass(string name = "Default name")
        {
            _name = name;
        }

        // The first parameter, required, has no default value assigned
        // to it. Therefore, it isn't optional. Both optionalstr and
        // optionalint have default values assigned to them. They're optional.
        public void ExampleMethod(int required, string optionalstr = "default string",
            int optionalint = 10)
        {
            Console.WriteLine(
                $"{_name}: {required}, {optionalstr}, and {optionalint}.");
        }
    }

    // The output from this example is the following:
    // Default name: 1, One, and 1.
    // Default name: 2, Two, and 10.
    // Default name: 3, default string, and 10.
    // Provided name: 1, One, and 1.
    // Provided name: 2, Two, and 10.
    // Provided name: 3, default string, and 10.
    // Default name: 3, default string, and 4.
}

Resolusi kelebihan beban untuk argumen bernama dan opsional

Metode yang kelebihan beban adalah metode yang memiliki nama yang sama tetapi tanda tangan yang berbeda. Tanda tangan metode terdiri dari nama metode dan jenis dan jenis (nilai, referensi, atau output) dari masing-masing parameter formalnya. Resolusi kelebihan beban adalah proses memilih metode terbaik untuk memanggil di antara beberapa metode yang memiliki nama yang sama tetapi tanda tangan yang berbeda.

Penggunaan argumen bernama dan opsional memengaruhi resolusi kelebihan beban dengan cara berikut:

  • Metode adalah kandidat untuk eksekusi jika setiap parameternya bersifat opsional atau sesuai, berdasarkan nama atau posisi, ke argumen tunggal dalam pernyataan panggilan, dan argumen tersebut dapat dikonversi ke jenis parameter.
  • Jika lebih dari satu kandidat ditemukan, aturan resolusi kelebihan beban untuk konversi pilihan diterapkan ke argumen yang ditentukan secara eksplisit. Argumen yang dihilangkan untuk parameter opsional diabaikan.
  • Jika dua kandidat dinilai sama baiknya, preferensi masuk ke kandidat yang tidak memiliki parameter opsional yang argumennya dihilangkan dalam panggilan. Resolusi kelebihan beban umumnya lebih memilih kandidat yang memiliki lebih sedikit parameter.