Szybka zmiana propetów

0

Dobry wieczór,

Przy tworzeniu obiektu można w prosty spobów uzupełnić wszystkie propety w ten sposób

line = new Line() { 
    X1 = 0, 
    X2 = 100,
    Y1 = 0, 
    Y2 = 100
};

Czy gdy obiekt jest utworzony jest spobób aby nie odwoływać się do każdego parametru po kolei tak jak w przykładzie poniżej tylko bardziej tak jak przy tworzeniu nowego obiektu?

line.X1 = 200
line.X2 = 300

oczywiście poza tworzeniem nowego obiektu lini.

Pozdrawiam,
AM

3

Możesz zrobić metodę w obiekcie np wywołać tak: line.SetParameters(X1:0, X2: 100, Y1: 0, Y2:0)

2

Gramatyka języka C# nie udostępnia takiej możliwości.

W JavaScript służy do tego instrukcja with, ale jej użycie nie jest zalecane, bo właściwość obiektu zostanie używa tylko wtedy, gdy obiekt ją zawiera, a w przeciwnym wypadku użyta zostanie zmienna globalna.

with (line) {
    X1 = 200;
    X2 = 300;
}

Patrząc na kod nie zawsze jest możliwe wywnioskowanie, czy w zasięgu instrukcji with zostanie użyta zmienna globalna, czy właściwość obiektu.

let o = {};
let p = true;

// W tym przypadku to, co się będzie działo w zasiegu instrukcji
// `with`, zależy od danych wprowadzonych przez użytkownika.
o[prompt()] = true; 

with (o) {
    p = false;
}

C# mógłby udostępniać bezpieczną instrukcję, która zapisuje wartości w zasięgu jakiejś instrukcji bez konieczności podawania nazwy obiektu przy nazwie każdej właściwości, ale to by zwiększyło ilość linii potrzebnych do zapisania wartości wielu właściwościom, a nie zredukowało. Jeżeli korzyścią byłoby nadanie wartości wielu właściwościom w obiekcie o bardzo długiej nazwie, to rozwiązaniem jest użycie innej referencji do tego obiektu, która ma krótką nazwę.

2
Burmistrz napisał(a):

W JavaScript służy do tego instrukcja with, ale jej użycie nie jest zalecane, bo właściwość obiektu zostanie używa tylko wtedy, gdy obiekt ją zawiera, a w przeciwnym wypadku użyta zostanie zmienna globalna.

Kotlin ma bezpieczne with więc można zrobić to dobrze

2

Nie ma takiej konstrukcji.

Z jednej strony mówi się, że jeżeli potrzebujesz zrobić z obiektem kilka rzeczy "naraz" już po jego inicjalizacji, to raczej powinieneś zrobić sobie do tego metodę - vide odpowiedź Jona Skeeta na SO.

Kilka lat temu wypowiadał się ówczesny PM C# Scott Wiltamuth na ten temat (tj. na temat konstrukcji with, która robiła by coś takiego jak chcesz i jest dostępna np. w VB.NET albo Delphi): https://stackoverflow.com/a/601163, jak również jeszcze raz Jon Skeet (https://devblogs.microsoft.com/csharpfaq/why-doesnt-c-have-vb-nets-with-operator/).

2

Biorąc pod uwagę w jakim kierunku zmierza Deconstructing w C# z tupli, przewiduję że już niedługo takie coś będzie możliwe:

line (x1, x2) = (200, 300);

co się wydaje logicznym rozszerzeniem tego co obecnie mamy

var (a, b) = (200, 300);

(int c, string d) = (200, "300");

int e;
string f;
(e, f) = (200, "300");
1

Na podstawie przykładu od @neves przerobiłem

        private void LineTabMouseMoveEvent()
        {
            line.X2 = Mouse.GetPosition(cvs).X;
            line.Y2 = Mouse.GetPosition(cvs).Y;
        }

na coś takiego

private void LineTabMouseMoveEvent() =>
            (line.X2, line.Y2) = (
                    Mouse.GetPosition(cvs).X,
                    Mouse.GetPosition(cvs).Y);

moim zdaniem wygląda to ciekawie :P

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