Loyiha tuzilmasi — .csproj, namespace, using, Program.cs

~15 daq · .NET Backend · Kirish — .NET Ekosistemi

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 package buyrug'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/ va obj/ papkalarini Git ga qo'shmang. .gitignore faylida bular allaqachon yozilgan bo'ladi — dotnet new avtomatik 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