Bagikan melalui


Metode (Panduan Pemrograman C#)

Metode adalah blok kode yang berisi serangkaian pernyataan. Sebuah program menyebabkan pernyataan dieksekusi dengan memanggil metode dan menentukan argumen metode yang diperlukan. Di C#, setiap instruksi yang dijalankan dilakukan dalam konteks metode.

Metode Main ini adalah titik masuk untuk setiap aplikasi C# dan dipanggil oleh runtime bahasa umum (CLR) ketika program dimulai. Dalam aplikasi yang menggunakan pernyataan tingkat atas, Main metode ini dihasilkan oleh pengkompilasi dan berisi semua pernyataan tingkat atas.

Nota

Artikel ini membahas metode bernama. Untuk informasi tentang fungsi anonim, lihat Ekspresi Lambda .

Tanda tangan metode

Metode dideklarasikan dalam kelas, struct, atau antarmuka dengan menentukan tingkat akses seperti public atau private, pengubah opsional seperti abstract atau sealed, nilai pengembalian, nama metode, dan parameter metode apa pun. Bagian-bagian ini bersama-sama adalah tanda tangan metode .

Penting

Jenis pengembalian dari suatu metode bukan bagian dari signature metode untuk keperluan overloading metode. Namun, ini adalah bagian dari spesifikasi metode saat menentukan kompatibilitas antara objek delegasi dan metode yang ditunjukkannya.

Parameter metode diapit dalam tanda kurung dan dipisahkan dengan koma. Tanda kurung kosong menunjukkan bahwa metode tidak memerlukan parameter. Kelas ini berisi empat metode:

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed();
}

Akses metode

Memanggil metode pada objek seperti mengakses bidang. Setelah nama objek, tambahkan titik, nama metode, dan tanda kurung. Argumen tercantum dalam tanda kurung, dan dipisahkan oleh koma. Oleh karena itu, metode Motorcycle kelas dapat dipanggil seperti dalam contoh berikut:

class TestMotorcycle : Motorcycle
{
    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {
        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine($"My top speed is {speed}");
    }
}

Parameter pada metode vs. argumen

Definisi metode menentukan nama dan jenis parameter apa pun yang diperlukan. Saat memanggil kode memanggil metode , kode menyediakan nilai konkret yang disebut argumen untuk setiap parameter. Argumen harus kompatibel dengan jenis parameter tetapi nama argumen (jika ada) yang digunakan dalam kode panggilan tidak harus sama dengan parameter bernama yang ditentukan dalam metode . Contohnya:

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);

    // Call with an integer literal.
    int productC = Square(12);

    // Call with an expression that evaluates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

Pengiriman melalui referensi vs. pengiriman melalui nilai

Secara default, ketika instans jenis nilai diteruskan ke metode , salinannya diteruskan alih-alih instans itu sendiri. Oleh karena itu, perubahan pada argumen tidak berpengaruh pada instans asli dalam metode panggilan. Untuk meneruskan instans nilai tipe melalui referensi, gunakan kata kunci ref. Untuk informasi selengkapnya, lihat Meneruskan Parameter Value-Type.

Ketika objek jenis referensi diteruskan ke metode, referensi ke objek diteruskan. Artinya, metode ini tidak menerima objek itu sendiri tetapi argumen yang menunjukkan lokasi objek. Jika Anda mengubah anggota dari objek dengan menggunakan referensi ini, perubahan tersebut akan tercermin pada argumen yang digunakan dalam metode pemanggilan, meskipun Anda meneruskan objek berdasarkan nilai.

Anda membuat jenis referensi dengan menggunakan class kata kunci, seperti yang ditunjukkan contoh berikut:

public class SampleRefType
{
    public int value;
}

Sekarang, jika Anda meneruskan objek yang didasarkan pada jenis ini ke metode , referensi ke objek diteruskan. Contoh berikut meneruskan objek jenis SampleRefType ke metode ModifyObject:

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}

static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

Contoh pada dasarnya melakukan hal yang sama seperti contoh sebelumnya karena meneruskan argumen berdasarkan nilai ke metode. Tetapi, karena jenis referensi digunakan, hasilnya berbeda. Modifikasi yang dilakukan pada field ModifyObject dari parameter, value, juga mengubah field obj dari argumen, value, dalam metode rt. Metode TestRefType ini menampilkan 33 sebagai output.

Untuk informasi selengkapnya tentang cara meneruskan jenis referensi menurut referensi dan berdasarkan nilai, lihat Meneruskan Parameter Reference-Type dan Jenis Referensi.

Mengembalikan nilai

Metode dapat mengembalikan nilai ke pemanggil. Jika jenis pengembalian (jenis yang tercantum sebelum nama metode) bukan void, metode dapat mengembalikan nilai dengan menggunakan return pernyataan . Pernyataan dengan kata kunci return diikuti dengan nilai yang cocok dengan jenis pengembalian akan mengembalikan nilai tersebut ke pemanggil metode.

Nilai dapat dikembalikan ke pemanggil berdasarkan nilai atau dengan referensi. Nilai dikembalikan ke pemanggil dengan referensi jika ref kata kunci digunakan dalam tanda tangan metode dan mengikuti setiap return kata kunci. Misalnya, metode berikut tanda tangan dan pernyataan pengembalian menunjukkan bahwa metode mengembalikan variabel bernama estDistance dengan referensi ke pemanggil.

public ref double GetEstimatedDistance()
{
    return ref estDistance;
}

Kata kunci return juga menghentikan eksekusi metode. Jika jenis pengembaliannya adalah void, pernyataan return tanpa nilai masih berguna untuk menghentikan eksekusi metode. return Tanpa kata kunci, metode akan berhenti dijalankan ketika mencapai akhir blok kode. Metode dengan jenis pengembalian yang tidak batal diperlukan untuk menggunakan return kata kunci untuk mengembalikan nilai. Misalnya, dua metode ini menggunakan kata kunci return untuk mengembalikan bilangan bulat:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Untuk menggunakan nilai yang dikembalikan dari suatu metode, metode pemanggil dapat menggunakan pemanggilan metode itu sendiri di mana saja nilai dengan tipe yang sama bisa digunakan. Anda juga dapat menetapkan nilai pengembalian ke variabel. Misalnya, dua contoh kode berikut mencapai tujuan yang sama:

int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

Menggunakan variabel lokal, dalam hal ini, result, untuk menyimpan nilai bersifat opsional. Ini dapat membantu keterbacaan kode, atau mungkin diperlukan jika Anda perlu menyimpan nilai asli argumen untuk seluruh cakupan metode.

Untuk menggunakan nilai yang dikembalikan oleh referensi dari metode, Anda harus mendeklarasikan variabel lokal ref jika Anda ingin mengubah nilainya. Misalnya, jika Planet.GetEstimatedDistance metode mengembalikan Double nilai menurut referensi, Anda dapat menentukannya sebagai variabel lokal ref dengan kode seperti berikut:

ref double distance = ref Planet.GetEstimatedDistance();

Mengembalikan array multi-dimensi dari sebuah metode, M, yang memodifikasi isi array tidak diperlukan jika array tersebut diteruskan oleh fungsi yang memanggil ke dalam metode itu, M. Anda dapat mengembalikan array yang dihasilkan dari M untuk gaya yang baik atau aliran nilai fungsi, tetapi tidak diperlukan karena C# meneruskan semua jenis referensi menurut nilai, dan nilai referensi array adalah penunjuk ke array. Dalam metode M, setiap perubahan pada konten array dapat diamati oleh kode apa pun yang memiliki referensi ke array, seperti yang ditunjukkan dalam contoh berikut:

static void Main(string[] args)
{
    int[,] matrix = new int[2, 2];
    FillMatrix(matrix);
    // matrix is now full of -1
}

public static void FillMatrix(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            matrix[i, j] = -1;
        }
    }
}

Metode asinkron

Dengan menggunakan fitur asinkron, Anda dapat memanggil metode asinkron tanpa menggunakan panggilan balik eksplisit atau secara manual memisahkan kode Anda di beberapa metode atau ekspresi lambda.

Jika Anda menandai metode dengan pengubah asinkron, Anda dapat menggunakan operator menunggu dalam metode tersebut. Ketika kontrol mencapai ekspresi tunggu dalam metode asinkron, kontrol kembali ke pemanggil, dan kemajuan dalam metode ditangguhkan hingga tugas yang ditunggu selesai. Setelah tugas selesai, pelaksanaan dapat dilanjutkan dalam metode ini.

Nota

Metode asinkron kembali ke pemanggil ketika menemukan objek pertama yang ditunggu yang belum selesai atau mencapai akhir metode asinkron, yang mana pun terjadi terlebih dahulu.

Metode asinkron biasanya memiliki jenis pengembalian , Task<TResult>, TaskIAsyncEnumerable<T>atau void. Jenis pengembalian void digunakan terutama untuk menentukan penanganan aktivitas, di mana jenis pengembalian void diperlukan. Metode asinkron yang memiliki jenis pengembalian void tidak dapat ditunggu, dan pemanggil metode pengembalian void tidak dapat menangkap pengecualian apa pun yang ditampilkan metode tersebut. Metode asinkron dapat memiliki jenis pengembalian yang mirip dengan tugas.

Dalam contoh berikut, DelayAsync adalah metode asinkron yang memiliki jenis pengembalian .Task<TResult> DelayAsync memiliki return pernyataan yang mengembalikan bilangan bulat. Oleh karena itu, deklarasi metode DelayAsync harus memiliki jenis pengembalian Task<int>. Karena jenis pengembalian adalah Task<int>, evaluasi await ekspresi dalam DoSomethingAsync menghasilkan bilangan bulat seperti yang ditunjukkan oleh pernyataan berikut: int result = await delayTask.

Metode Main ini adalah contoh metode asinkron yang memiliki jenis pengembalian .Task Ini masuk ke metode DoSomethingAsync, dan karena diekspresikan dengan satu baris, dapat menghilangkan kata kunci async dan await. Karena DoSomethingAsync adalah metode asinkron, tugas untuk panggilan DoSomethingAsync harus ditunggu, seperti yang ditunjukkan oleh pernyataan berikut: await DoSomethingAsync();.

class Program
{
    static Task Main() => DoSomethingAsync();

    static async Task DoSomethingAsync()
    {
        Task<int> delayTask = DelayAsync();
        int result = await delayTask;

        // The previous two statements may be combined into
        // the following statement.
        //int result = await DelayAsync();

        Console.WriteLine($"Result: {result}");
    }

    static async Task<int> DelayAsync()
    {
        await Task.Delay(100);
        return 5;
    }
}
// Example output:
//   Result: 5

Metode asinkron tidak dapat mendeklarasikan parameter ref atau out apa pun, tetapi dapat memanggil metode yang memiliki parameter tersebut.

Untuk informasi selengkapnya tentang metode asinkron, lihat Pemrograman asinkron dengan asinkron dan menunggu dan Jenis pengembalian asinkron.

Definisi isi ekspresi

Umum untuk memiliki definisi metode yang langsung mengembalikan hasil dari suatu ekspresi, atau yang memiliki satu statemen sebagai isi metode. Ada pintasan sintaksis untuk menentukan metode tersebut menggunakan =>:

public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public void Print() => Console.WriteLine(First + " " + Last);
// Works with operators, properties, and indexers too.
public static Complex operator +(Complex a, Complex b) => a.Add(b);
public string Name => First + " " + Last;
public Customer this[long id] => store.LookupCustomer(id);

Jika metode mengembalikan void atau merupakan metode asinkron, maka isi metode harus berupa ekspresi pernyataan (sama seperti lambda). Untuk properti dan pengindeks, mereka harus dibaca saja, dan Anda tidak menggunakan get kata kunci aksesor.

Iterator

Iterator melakukan perulangan kustom pada koleksi, seperti daftar atau array. Iterator menggunakan pernyataan yield return untuk mengembalikan setiap elemen satu per satu. Ketika pernyataan yield return dicapai, lokasi saat ini dalam kode disimpan. Eksekusi dimulai ulang dari lokasi tersebut ketika iterator dipanggil lain kali.

Anda memanggil iterator dari kode klien dengan menggunakan pernyataan foreach .

Jenis pengembalian iterator dapat berupa IEnumerable, , IEnumerable<T>, IAsyncEnumerable<T>IEnumerator, atau IEnumerator<T>.

Untuk informasi selengkapnya, lihat Iterator.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.

Lihat juga