2016-05-30 18 views
5

wyszukiwania Effort:Jak utworzyć niestandardową składnię do opisu obiektu w języku C#?

  1. Google:
  2. Stackoverflow:

I trochę więcej nie pamiętam ...


zajściem w ciążę: Każdego "wbudowany typ" w C# (takich jak int, float, char itp.) Jest klasą, a każda klasa w języku C# dziedziczy z klasy Object. Dlatego każdy "wbudowany typ" dziedziczy po klasie Object.

Biorąc pod uwagę to założenie, zakładam, że aby ustawić zmienną double, muszę ustawić pewne właściwości, używając "normalnej" składni. Oto co mam na myśli:

double number = new double(); 

number.leftSide= 5; 
number.rightSide = 23; 

Console.Write(number); 

// Output: 
// 5.23 

Ale C# ma specjalną, równoważne składni dla tworzenia zmiennej double (w taki sposób, że będzie robić to, co ja próbował zrobić powyżej, nie że powyższy kod będzie faktycznie praca):

double number = 5.23; 

kompilator rozumie że zmiennoprzecinkowe oddziela liczbę do dwóch: 5 i 23.

Moje pytanie brzmi, czy mogę zrobić t to samo z moimi własnymi klasami. Na przykład, jeśli mam własną klasę Time (i jest to tylko przykład, więc nie sugeruj używania wbudowanych klas czasu), chciałbym mieć opcję utworzenia instancji w ten sposób:

Time time = 10:25; 

Kompilator zrozumie, że dwukropek oddziela liczbę na godziny i minuty (co, jak przypuszczam, wymaga utworzenia w klasie Time).

Słyszałem o Roslyn CTP, ale szukam prostszego, wbudowanego sposobu robienia tego, co opisałem.

Czy mogę to zrobić?

+1

ogólna zasada jest kilka języków (Groovy) to operator zmuszając, Twój fragment może być przedstawiony (całkowita 10) (operator:) (integer 25) - ale Myślę, że ":" jest niemożliwe w C# –

+1

cont .. 5.23 jest na poziomie leksykalnym, jeden poziom poniżej parsera. –

Odpowiedz

8

Obecnie nie jest to możliwe w języku C#. Najbliższym sposobem jest zdefiniowanie niejawnej konwersji z string na Date. Na przykład

public class Time 
{ 
    public static implicit operator Time(string value) 
    { 
     // Initialize your object with value 
     // Similar to 
     var values = value.Split(':'); 
     var hour = Convert.ToInt32(values[0]); 
     var min = Convert.ToInt32(values[1]); 
     . . . 
    } 
    . . . // Your fields, properties and methods 
} 

Byłoby to niech ci

Time time = "10:25"; 
+0

To wspaniałe rozwiązanie! Czekałbym na inne odpowiedzi, aby zobaczyć, czy są one bardziej pomocne, ale jeśli nie - wybrałbym tę. – Sipo

+2

@Sipo Ta odpowiedź stanowi naprawdę dobry sposób na wyrażenie tego, co chcesz osiągnąć w sposób ultimatelly. Myślę, że inne odpowiedzi, w tym moje, mogą po prostu dostarczyć więcej informacji o tle. Osobiście chciałbym po prostu rozważyć uczynienie 'Time'' struct', a nie 'class'. –

+0

@OndrejTucny - Dziękuję vert dużo! Gdybym utworzył 'Time' jako" struct ", czy byłbym w stanie zrobić to, co próbuję zrobić, czy nadal będę potrzebował rozwiązania @ Shreevardhana? – Sipo

3

Moje pytanie brzmi, czy mogę zrobić to samo z własnymi klasami.

Nie, nie możesz. C# nie obsługuje konstruktów składni zdefiniowanych przez użytkownika. Musisz żyć z zestawem funkcji językowych, takich jak konstrukcje składniowe, operatory itp.określony przez język.

każdym „typu wbudowanego” w C# (takie jak int pływakowe charetc.) Jest grupa, a każda grupa C# dziedziczy z klasy obiektów.

prymitywne typy (takie jak int, float, etc.) są nie klas. Są to prymitywne typy. W celu obsługi obiektów zorientowanych obiektowo, takich jak metody, język definiuje struct s (taki jak Int32, Single), który "rodzaj" cienia prymitywne typy.

Faktem jest, że wszystko może być Object w przypadku typów pierwotnych uzyskanych poprzez boks - proces, który przyjmuje typ wartości pierwotnej i tworzy wokół niego obiekt "kopertowy".