Tablica jako właściwość.

0

Witam. Nazwa tematu może nie najlepsza, ale ciężko mi to opisać :)

Powiedzmy, że mam klasę polami które pełnią rolę właściwości:

public class Quadrangle
    {
        int[] lgxy = new int[2] { 0, 0 };
        int[] pdxy = new int[2] { 0, 0 };
        int[] pgxy = new int[2] { 0, 0 };
        int[] ldxy = new int[2] { 0, 0 };
        

Jednakże czytam i oglądam, że powinno się używać właściwości z Get'ami i Set'ami. W związku z tym chciałbym to przekształcić na właściwości które przybierają typ tablicy z dwoma elementami. Problem w tym, że nie wiem, czy to jest w ogóle dopuszczalne i wykonalne. Mniej więcej powinno to wyglądać tak jak poniżej, ale coś tam na pewno jest źle, bo nie mam pojęcia gdzie mogę zadeklarować liczbę elementów tablicy. Jedyne co udało mi się zrobić to coś takiego:

public class Quadrangle
    {
       public int[] Lgxy { get; set; } 
    }

Pozwala mi to przypisywać elementy do tablicy bez końca choć chciałem ograniczyć je do dwóch, ale i tak nie mogę ich wyświetlić.
Czy ktoś mógłby mi to wyjaśnić?

0

Możesz

  1. Wykorzystać właściwości read-only i na sztywno przypisać do nich tablice 2-elementowe:
public int[] Lgxy { get; } = new int[2];
  1. Napisać własną logikę sprawdzającą, czy tablica ma długość 2:
public class Quadrangle
{
    int[] _Lgxy;

    public int[] Lgxy {
		get
		{
			return _Lgxy;
		}
		set
		{
			if (value.Length != 2) {
				throw new Exception ("Array should have 2 elements");
			}
			_Lgxy = value;
		}
	}
}
0

A co chcesz osiągnąć? Bo odnoszę silne wrażenie, że nie potrzebujesz tablic, tylko np. struktury Point.

0
mad_penguin napisał(a):

Możesz

  1. Wykorzystać właściwości read-only i na sztywno przypisać do nich tablice 2-elementowe:
public int[] Lgxy { get; } = new int[2];

Byłoby to jakieś rozwiązanie, ale nie działa, mam errory jak coś takiego wrzucam w klasę.

Juhas napisał(a):

A co chcesz osiągnąć? Bo odnoszę silne wrażenie, że nie potrzebujesz tablic, tylko np. struktury Point.

Nie wiem czym jest struktura Point.
Uczę się po prostu C# i podejmuję się różnych randomowych ćwiczeń aby zrozumieć mechanizmy.
W tym konkretnym przypadku akurat chcę aby każdy obiekt klasy miał wstępnie ustalone cztery współrzędne które później można sobie zmieniać.
Na początku zrobiłem to za pomocą pól tak jak opisałem, ale czytałem, że powinno się używać właściwości, dlatego próbuję to ćwiczyć.

1

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/struct

        public struct Point
        {
            public int x;
            public int y;
        }

A w kodzie:

            Point p1 = new Point();
            p1.x = 10;
            p1.y = 20;

Może być też wersja z konstruktorem:

        public struct Point
        {
            public int x;
            public int y;

            public Point (int tmpX, int tmpY)
            {
                x = tmpX;
                y = tmpY;
            }
        }

A wtedy w kodzie wystarczy:

Point p2 = new Point(10, 20);
0

Struktura wygląda ciekawie, ale nie jest to jeszcze odpowiedź na moje pytanie.
Jak zrobiłem coś takiego:

class Program
    {
        static void Main(string[] args)
        {
            Quadrangle newQ = new Quadrangle();
            newQ.Ulxy = new int[2] {10, 15};
           
            Console.WriteLine(newQ.Ulxy[0]);
            Console.WriteLine(newQ.Ulxy[1]);
        }
    }

    class Quadrangle
    {
       
        public int[] Ulxy { get; set; }  
        public int[] Drxy { get; set; } 
        public int[] Urxy { get; set; }
        public int[] Dlxy { get; set; }   

    }   

To rzeczywiście powstała mi tablica dwuelementowa, ale musiałem ją zainicjalizować w głównej części programu, a chciałem w konstruktorze...
Jak próbuję to zrobić za pomocą konstruktora w takiej formie, to dostaję błąd:

class Program
    {
        static void Main(string[] args)
        {
            Quadrangle newQ = new Quadrangle();
           
            Console.WriteLine(newQ.Ulxy[0]);
            Console.WriteLine(newQ.Ulxy[1]);
        }
    }

    class Quadrangle
    {
       
        public int[] Ulxy { get; set; }  
        public int[] Drxy { get; set; } 
        public int[] Urxy { get; set; }
        public int[] Dlxy { get; set; }

        public Quadrangle() 
        {
            Ulxy[0] = 0;
            Ulxy[1] = 0;
            Drxy[0] = 0;
            Drxy[1] = 0;
            Urxy[0] = 0;
            Urxy[1] = 0;
            Dlxy[0] = 0;
            Dlxy[1] = 0;   
        }
    }   

Zastanawiam się czy źle kombinuję czy po prostu czegoś mi tu brakuje...
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.

1

Musisz użyć new do stworzenia tablicy zanim możesz do niej zapisywać obiekty.

1

Przede wszystkim powinieneś posłużyć się strukturą Point - jak już wspomniałem. Ona właśnie do tego służy. Po drugie nie powinieneś używać tablic we właściwościach. To jeden z wyjątków, kiedy używać właściwości. Tablice są zwracane przez referencje, a więc klient będzie pracował bezpośrednio na składniku Twojej klasy. To nie jest pożądane.

Dokumentacja Microsoftu jasno stwierdza, że jeśli zwracasz tablicę, robisz to za pomocą metody. A najlepiej w ogóle nie zwracać całych tablic:

Do use a method, rather than a property, in the following situations.(...)

  • The operation returns an array.

Także rób to porządnie. Nie zwracaj tablic we właściwościach i posłuż się strukturą Point, która została stworzona właśnie do tego, co chcesz uzyskać.

0

Dzięki, właśnie o takie wyjaśnienie mi chodziło - czy w ogóle powinno się działać w taki sposób jak chciałem czy też nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1