
Foto oleh Jorge Jesus via Pexels
Setiap program C# memiliki struktur dasar yang konsisten: dimulai dari namespace sebagai pengelompokan logis kode, class sebagai wadah utama, dan method Main sebagai titik masuk (entry point) yang pertama kali dijalankan ketika program dieksekusi.
Memahami struktur ini bukan sekadar menghafal urutan penulisan, tetapi memahami mengapa setiap bagian diperlukan: namespace mencegah tabrakan nama antar library berbeda, class mengelompokkan data dan perilaku terkait, dan method Main memberi titik awal yang jelas bagi runtime untuk mulai mengeksekusi kode.
Artikel ini membedah struktur dasar program C# baris demi baris, termasuk perbedaan gaya penulisan top-level statements yang diperkenalkan pada versi C# modern dibanding gaya tradisional dengan Main method eksplisit.
Struktur Program Tradisional dengan Main Method
Struktur lengkap program C# gaya tradisional
Top-Level Statements pada C# Modern
Top-level statements menghilangkan boilerplate
Parameter args pada Method Main
Parameter args menampung argumen command line
Namespace untuk Mengorganisasi Kode Berskala Besar
Namespace berbeda mencegah tabrakan nama class
Pada akhirnya, baik gaya tradisional maupun top-level statements menghasilkan program yang berjalan identik di level Intermediate Language setelah dikompilasi, sehingga pemilihan keduanya lebih merupakan soal gaya penulisan dan kebutuhan keterbacaan tim, bukan perbedaan performa saat program dijalankan.
Namespace dan Aturan Penataan Kode dalam Satu Proyek C#
Struktur namespace memisahkan kode berdasarkan modul/domain
Namespace berfungsi sebagai mekanisme pengelompokan logis untuk class, struct, interface, dan tipe lainnya agar tidak terjadi bentrok nama ketika proyek berkembang menjadi besar atau ketika menggabungkan beberapa library pihak ketiga. Dengan menuliskan class InvoiceService di dalam namespace MpmFinance.Billing, class tersebut hanya bisa diakses dengan nama penuh MpmFinance.Billing.InvoiceService kecuali file lain menambahkan pernyataan using di bagian atas kode.
Sejak C# 10, Microsoft memperkenalkan file-scoped namespace yang memungkinkan penulisan namespace MpmFinance.Billing; tanpa tanda kurung kurawal, sehingga seluruh isi file otomatis berada dalam namespace tersebut dan mengurangi satu level indentasi. Gaya penamaan namespace yang umum dipakai mengikuti pola NamaPerusahaan.NamaProduk.NamaModul, sehingga struktur folder proyek biasanya mencerminkan struktur namespace secara langsung.
Penataan namespace yang konsisten juga mempermudah proses refactoring dan code review karena setiap developer dapat menebak lokasi suatu class hanya dari nama namespace-nya. Pada proyek skala tim, kesepakatan konvensi namespace sejak awal mencegah terjadinya duplikasi struktur folder yang berantakan ketika jumlah modul bertambah seiring waktu.
Partial Class untuk Memecah Definisi Class ke Beberapa File
Satu class Pegawai didefinisikan di dua file terpisah menggunakan kata kunci partial
Kata kunci partial memungkinkan definisi sebuah class, struct, atau interface dipecah menjadi beberapa file fisik yang berbeda, namun tetap diperlakukan compiler sebagai satu tipe tunggal setelah proses kompilasi selesai. Pada contoh di atas, class Pegawai memiliki property di file Pegawai.Data.cs dan method di file Pegawai.Logic.cs, namun keduanya digabung menjadi satu class utuh yang bisa diakses melalui satu instance saja tanpa perbedaan perilaku dibanding jika ditulis dalam satu file.
Penggunaan partial class paling umum dijumpai pada kode hasil generate otomatis oleh tooling, misalnya designer file pada Windows Forms atau kode hasil scaffolding Entity Framework, di mana bagian yang digenerate otomatis dipisahkan dari bagian yang ditulis manual oleh developer agar proses regenerasi kode tidak menimpa perubahan manual yang sudah dilakukan sebelumnya. Setiap kali designer memperbarui UI, hanya file partial tertentu yang ditulis ulang tanpa menyentuh file logika bisnis.
Selain partial class, C# juga mengenal partial method yang dideklarasikan di satu bagian partial class tanpa implementasi dan boleh diimplementasikan di bagian partial lainnya, atau dibiarkan tanpa implementasi sama sekali sehingga compiler akan menghapus seluruh pemanggilannya tanpa error. Semua bagian partial dari satu tipe harus memiliki modifier aksesibilitas yang sama dan berada dalam namespace serta assembly yang identik agar dapat digabungkan dengan benar oleh compiler, dan percobaan menuliskan modifier yang berbeda di antara bagian-bagiannya akan langsung ditolak.
Global Using dan Implicit Usings untuk Menyederhanakan Program
Fitur global using memungkinkan satu direktif using berlaku untuk seluruh file dalam project, cukup dideklarasikan sekali dengan awalan kata global pada salah satu file, umumnya diberi nama GlobalUsings.cs agar mudah ditemukan. Hal ini mengurangi pengulangan baris using yang sama di setiap file .cs, terutama pada project besar dengan puluhan file dan banyak namespace yang sering dipakai bersama seperti System.Linq atau System.Collections.Generic, sehingga setiap file baru tidak perlu lagi dibuka dengan daftar using yang panjang di bagian atas.
Selain itu, project SDK modern menyediakan opsi ImplicitUsings pada file .csproj yang otomatis menyertakan namespace umum seperti System dan System.Linq tanpa perlu dideklarasikan sama sekali, cukup dengan mengaktifkan
Kesalahan Umum yang Sering Terjadi
Lupa Menambahkan using Statement yang Dibutuhkan
Memakai kelas dari namespace tertentu tanpa menambahkan direktif using yang sesuai akan menghasilkan error kompilasi 'the type or namespace could not be found', meski kelas tersebut sebenarnya ada di library yang sudah terpasang.
Mencampur Gaya Top-Level Statements dengan Class Program Eksplisit
Satu project tidak boleh memiliki top-level statements di Program.cs sekaligus deklarasi class Program dengan method Main secara eksplisit di file lain, karena compiler akan bingung menentukan mana titik masuk sebenarnya.
Menaruh Semua Kode dalam Satu Namespace Tanpa Struktur
Project besar yang tidak memecah kodenya ke dalam namespace yang bermakna akan sulit dinavigasi, terutama saat jumlah file sudah mencapai puluhan atau ratusan.
Kapan Pendekatan Ini Tidak Cocok Dipakai
Top-level statements memberikan kode yang lebih ringkas untuk program kecil atau skrip sederhana, namun untuk aplikasi production berskala besar, struktur eksplisit dengan namespace dan class yang jelas tetap lebih disarankan karena lebih mudah dinavigasi oleh banyak developer.
Mengelompokkan kode dalam banyak namespace memberikan organisasi yang rapi, namun terlalu banyak pemecahan namespace untuk project kecil justru bisa menambah kompleksitas yang tidak perlu dibanding manfaat yang didapat.
Ringkasan
Struktur dasar program C# terdiri dari namespace, class, dan method Main sebagai titik masuk, dengan top-level statements sebagai alternatif modern yang lebih ringkas untuk kode sederhana. Memahami kedua gaya ini penting karena keduanya akan sering ditemui, baik pada tutorial lama maupun project baru yang memakai fitur C# terkini.
Seri Belajar C# Fundamental:
← Sebelumnya: Pengenalan Bahasa Pemrograman C# (sudah ada)
→ Selanjutnya: Cara Membuat New Project Pemrograman C# (sudah ada)