Sobes.tech
Junior

C#-ში კლასებსა და სტრუქტურებს შორის რა განსხვავებაა?

sobes.tech AI

პასუხი AI-სგან

კლასები მიმთითებელ ტიპებს მიეკუთვნებიან, სტრუქტურები - მნიშვნელობით ტიპებს:

  • მეხსიერებაში განთავსება: კლასის მაგალითები განთავსებულია მართვად მეხსიერებაში (Heap), სტრუქტურების მაგალითები - სტეკში (Stack) ან ობიექტის შიგნით, რომელსაც მიეკუთვნება.
  • მემკვიდრეობა: კლასები მხარს უჭერენ მემკვიდრეობას, სტრუქტურები - არა. სტრუქტურები შეიძლება განახორციელონ ინტერფეისები.
  • წინასწარი მნიშვნელობა: კლასებისთვის null არის წინასწარი მნიშვნელობა. სტრუქტურებისთვის - ნულოვანი მნიშვნელობების ნაკრები.
  • პარამეტრის გადაცემა მეთოდებში: კლასის მაგალითები გადაეცემა მითითებით (ჩართვა ობიექტზე). სტრუქტურები - მნიშვნელობით (კოპირება).
  • პროდუქტიულობა: სტრუქტურები შეიძლება იყოს უფრო სწრაფი მცირე ობიექტებისთვის, რადგან თავიდან აიცილებს ხარჯებს მეხსიერების მართვაზე და გროვაზე. თუმცა, დიდი სტრუქტურების გადაცემა მნიშვნელობით შეიძლება იყოს ნაკლებეფექტიანი.
  • შექმნა: სტრუქტურებისთვის არაპირდაპირი კონსტრუქტორი ინიციალიზებს ველებს ნულებით.
ნიშანი კლასი (Class) სტრუქტურა (Struct)
ტიპი მიმთითებელი მნიშვნელობით
განთავსება მართვადი მეხსიერება სტეკი / ჩაშენებული
მემკვიდრეობა მხარს უჭერს არა მხარს უჭერს (მაგრამ განახორციელებს ინტერფეისებს)
წინასწარი მნიშვნელობა null ნულოვანი ნაკრები
გადაცემა მითითებით მნიშვნელობით
პროდუქტიულობა შეიძლება იყოს უფრო ნელი მცირე ობიექტებისთვის შეიძლება იყოს უფრო სწრაფი მცირე ობიექტებისთვის
არაპირდაპირი კონსტრუქტორი არა (თუ სხვა განსაზღვრულია) დიახ (ნულებით ინიციალიზაცია)
// მაგალითი კლასი
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointClass(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// მაგალითი სტრუქტურა
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// დემონსტრაცია გადაცემის
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // შეცვლის ძირითადი PointClass-ს
    ps.X = 100; // შეცვლის მხოლოდ კოპიას PointStruct-ის
}

// გამოყენება
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X იქნება 100
// pointStruct1.X იქნება 1 (რადგან მხოლოდ კოპია შეიცვალა)