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 (რადგან მხოლოდ კოპია შეიცვალა)