Loyiha tuzilmasi — .csproj, namespace, using, Program.cs
Muammodan boshlaylik
Siz yangi loyiha yaratasiz. Papkada .csproj fayl, Program.cs fayl, bin/ va obj/ papkalar bor. Nima bu? Qaysinisini ochasiz, qaysinisini o'zgartirasiz?
Keyin kod yozishni boshlaysiz va using System.IO; yoki namespace MenimLoyiham degan narsalar ko'rasiz. Nima uchun bular kerak?
Bu tuzilmani tushunmasdan kod yozish mumkin — lekin xatolar chiqqanda qayerga qarashni bilmaysiz.
.csproj — loyiha fayli
.csproj (C Sharp Project) — loyihaning "pasporti". U .NET ga loyiha haqida asosiy ma'lumot beradi: qaysi .NET versiyasi, qanday chiqish turi, qanday paketlar kerak.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType> <!-- ← bajariluvchi fayl -->
<TargetFramework>net8.0</TargetFramework> <!-- ← .NET 8 -->
<Nullable>enable</Nullable> <!-- ← null xavfsizligi yoqilgan -->
<ImplicitUsings>enable</ImplicitUsings> <!-- ← avtomatik using lar -->
</PropertyGroup>
</Project>
OutputType — Exe degani bajariluvchi dastur. Keyinchalik API yozganda bu Web bo'ladi.
TargetFramework — qaysi .NET versiyasi uchun yozilayotgani. net8.0 — .NET 8.
Hayotiy o'xshatma: uy qurish uchun arxitekturaning texnik pasporti. Unda qanday material, qanday standart, qanday maqsad — yozilgan. Ishchi (kompilyator) shu pasportga qarab ish qiladi.
💡 .csproj faylini deyarli qo'lda o'zgartirmaysiz.
dotnet add packagebuyrug'i avtomatik yangilaydi.
namespace — kod tartiblagichi
Loyiha kichik bo'lganda muammo yo'q — barcha kod bitta faylda. Lekin loyiha o'sib borsa:
50 ta fayl, har birida class lar bor.
Ikkita faylda "User" degan class yaratildi.
Kompilyator qaysi "User" ni ishlatish kerakligini bilmaydi.
namespace — bu muammoni hal qiladi. Kodni guruhlarga ajratadi, nomlar to'qnashuvi bo'lmaydi.
Hayotiy o'xshatma: shahar va mahallalar. Toshkentda ikkita "Jasur Karimov" bo'lishi mumkin — biri Chilonzor da, biri Yunusobod da. Pochtachi yetkazib berish uchun faqat ismni bilish yetmaydi — manzilni ham bilishi kerak. Namespace — o'sha manzil.
namespace DokonIlova.Foydalanuvchilar // ← manzil
{
class Foydalanuvchi { } // Jasur Karimov — Chilonzor
}
namespace DokonIlova.Mahsulotlar // ← boshqa manzil
{
class Foydalanuvchi { } // Jasur Karimov — Yunusobod
}
Ikkala Foydalanuvchi class bir loyihada tinch yashaydi — chunki namespace lari farq qiladi.
Zamonaviy C# da namespace qavssiz ham yoziladi — file-scoped namespace:
namespace DokonIlova.Foydalanuvchilar; // ← butun fayl shu namespace da
class Foydalanuvchi { }
class FoydalanuvchiService { }
Bu qisqaroq va toza ko'rinadi. Hozirgi loyihalarda asosan shu usul ishlatiladi.
using — namespace ulash
Boshqa namespace dagi classni ishlatmoqchi bo'lsangiz — to'liq yo'lini yozishingiz kerak:
DokonIlova.Foydalanuvchilar.Foydalanuvchi user = new();
Bu qulay emas. using direktivasi bu yo'lni qisqartiradi:
using DokonIlova.Foydalanuvchilar;
Foydalanuvchi user = new(); // ← endi to'liq yo'l kerak emas
.NET ning o'z kutubxonalari ham xuddi shunday import qilinadi:
using System.IO; // fayl bilan ishlash
using System.Collections.Generic; // List<T>, Dictionary<K,V>
Implicit using — avtomatik import
.csproj da <ImplicitUsings>enable</ImplicitUsings> yozilgan. Bu nima beradi?
Eng ko'p ishlatiladigan namespace lar avtomatik import qilinadi — siz yozmasangiz ham. Shuning uchun yangi loyihada Program.cs da hech qanday using yo'q, lekin Console.WriteLine ishlaydi.
Avtomatik import qilinadiganlar:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
Siz faqat standart kutubxonada bo'lmagan narsa uchun using qo'shishingiz kerak.
Program.cs — kirish nuqtasi
Program.cs — dastur ishga tushganda birinchi o'qiladigan fayl. Barcha kod shu yerdan boshlanadi.
.NET 6 dan beri top-level statements — qozon kodi (boilerplate) yo'q:
// Program.cs — zamonaviy usul
Console.WriteLine("Dastur boshlandi");
int natija = 2 + 2;
Console.WriteLine(quot;Natija: {natija}");
Kompilyator bu faylni avtomatik ravishda Main metodga o'raydi — siz ko'rmaysiz, lekin ichida shunday bo'ladi.
bin/ va obj/ papkalar
dotnet run yoki dotnet build ishlatgach ikkita papka paydo bo'ladi:
loyiha/
├── bin/ ← tayyor, ishga tushiriluvchi fayllar
├── obj/ ← vaqtinchalik kompilyatsiya fayllari
├── Program.cs
└── loyiha.csproj
obj/ — kompilyatsiya jarayonidagi oraliq fayllar. Ularga hech qachon qo'l tegizilmaydi.
bin/ — tayyor natija. bin/Debug/net8.0/ ichida .exe (Windows) yoki .dll fayl bor — bu siz yozgan dastur.
⚠️
bin/vaobj/papkalarini Git ga qo'shmang..gitignorefaylida bular allaqachon yozilgan bo'ladi —dotnet newavtomatik qo'shadi.
To'liq ko'rinish
Haqiqiy loyiha papkasi:
MenimLoyiham/
├── MenimLoyiham.csproj ← loyiha sozlamalari (pasport)
├── Program.cs ← kirish nuqtasi
├── bin/ ← tayyor fayllar (git ga yo'q)
├── obj/ ← oraliq fayllar (git ga yo'q)
└── .gitignore ← bin/ va obj/ yozilgan
Loyiha o'sgach — yangi fayllar va papkalar qo'shiladi:
MenimLoyiham/
├── MenimLoyiham.csproj
├── Program.cs
├── Models/
│ └── Foydalanuvchi.cs
├── Services/
│ └── FoydalanuvchiService.cs
└── Controllers/
└── FoydalanuvchiController.cs
Har bir .cs fayl — bitta C# fayl. Odatda bitta faylda bitta class yoziladi.
Tez-tez uchraydigan xatolar
Namespace va fayl joylashuvi mos kelmasa:
// Services/TolovService.cs faylida
namespace MenimLoyiham.Models; // ← noto'g'ri, Services bo'lishi kerak
class TolovService { }
Bu xato bermaydi — lekin tartib buziladi. Odat: namespace fayl yo'liga mos bo'lsin. Services/TolovService.cs → namespace MenimLoyiham.Services.
using yo'q bo'lganda:
error CS0246: The type or namespace name 'JsonSerializer' could not be found
System.Text.Json namespace i import qilinmagan. Yechim: faylning yuqorisiga using System.Text.Json; qo'shing. VS Code avtomatik taklif qiladi — Ctrl+. bosing.
Bir loyihada ikkita Program.cs:
error CS0017: Program has more than one entry point defined
dotnet new bilan yaratilgan loyihada allaqachon Program.cs bor. Ustiga yana bitta kirish nuqtasi qo'shildi. Yechim: faqat bitta Program.cs bo'lishi kerak.
Xulosa
.csproj — loyihaning pasporti: .NET versiyasi, chiqish turi, paketlar.
namespace — kodni guruhlarga ajratadi, nomlar to'qnashuvini oldini oladi. Fayl-scoped namespace qisqa va qulay.
using — boshqa namespace larni import qiladi. ImplicitUsings eng ko'p ishlatiladigan namespace larni avtomatik import qiladi.
Program.cs — kirish nuqtasi, dastur shu yerdan boshlanadi.
bin/ va obj/ — kompilyatsiya natijalari, Git ga qo'shilmaydi.
Keyingi dars
4-dars: dotnet CLI — new, build, run, add, restore