Odpowiednik typedef z C++ w C#

0

Jaki jest odpowiednik w C# instrukcji typedef z C++?

typedef char Square_Type;
typedef Square_Type Board_Type[9];

W C++ możemy zrobić tak jak w powyższym kodzie i następnie stosować odwołania bezpośrednio do typu Square_Type i korzystać z niego w podobny sposób jak z typu char.

Jak wykorzystać podobne zastosowanie w C#? Dopiero uczę się programować w tym języku, wcześniej programowałem trochę w C++ i Pascalu.

Z góry dzięki za pomoc :)

Edit:
W dokumentacji MSDN wyczytałem, że można zastosować dyrektywę using:
using Square_Type = System.Char;

Póki co VS nie zwraca błędu, nadal nie wiem jak poradzić sobie z tablicą.

Square_Type[] Board_Type = new Square_Type[9];
Tzn. jak zamienić powyższą linijkę za pomocą "using".

1

Tzn. jak zamienić powyższą linijkę za pomocą "using".

Przecież (razem z tym usingiem powyżej) jest dobrze ;)

0

Error 1 ; expected C:\Users\Thitor\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 6 18 ConsoleApplication1
Error 2 Identifier expected C:\Users\Thitor\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 6 19 ConsoleApplication1
Error 3 Expected class, delegate, enum, interface, or struct C:\Users\Thitor\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 6 21 ConsoleApplication1
Error 4 Expected class, delegate, enum, interface, or struct C:\Users\Thitor\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 6 38 ConsoleApplication1
Error 5 Identifier expected C:\Users\Thitor\Documents\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 6 50 ConsoleApplication1

po wpisaniu

using Square_Type = System.Char;
using Square_Type[] Board_Type = new Square_Type[9];
0

Pytanie zasadnicze - po kiego grzyba Ci to?

0

Piszę program Kółko i krzyżyk w C#, którego uczyłem się ostatnio (na początku próbowałem Pascala, ale za dużo czasu minęło odkąd w nim programowałem), tzn. od kilku miesięcy. Znalazłem przykład w C++, ale działający zachłannie, ja próbuję do niego napisać jakieś inteligentne zachowanie komputera bazujące na algorytmie mini-max.

Problem w tym, że jestem początkującym programistą, coś tam wcześniej uczyłem się C++, ale nie bardzo mi podszedł, C# ma dla mnie bardziej przejrzystą składnię.

A teraz do rzeczy:

W przykładzie C++ korzystam w paru miejscach z kodu:

#define Squares 9
typedef char Square_Type; 
typedef Square_Type Board_Type[Squares];
const Square_Type Empty = ' ';

******

void Initialize(Board_Type Board) {
    int I;
    for (I = 0; I < Squares; I++)
	Board[I] = Empty;
}

Analogicznie w C# mam:

using Square_Type = System.Char;

******

const char Empty = ' ';

******

private void Initialize(Board_Type Board)
        {
            int I;
            for (I = 0; I < Squares; I++)
                Board[I] = Empty;
        }

Chcę się odwoływać do Board_Type i Square_Type jak do typu zmiennych. Na razie w moim kodzie kompilator zwraca uwagę na to, że próbuję używać Board_Type jako zmienną a zadeklarowałem jako pole.

0

Nieważne, już sobie z tym poradziłem w inny sposób ;)

0

Pisz w C#, a nie przepisuj z C++.

0

w C# nie ma typedef ani jego bezposredniego odpowiednika
najblizszym jest wspomniany USING, ale ma on pewne ograniczenia.

po pierwsze, jest on aliasem na nazwe typu. to oznacza, ze nie uda Ci sie zdefiniowac w ten sposob nowego typu danych, np. wlasnie using X = System.Char[9]; nie przejdzie, gdyz [9] jest konkretnym rozmiarem tablicy, char[9] nie jest dobra nazwa typu, typ tablicy zas char[].

Co wiecej, using X = System.Char[]; rowniez nie przejdzie:) wlasciwie, to nie wiem czemu, "char[]" IMHO jest normalna nazwa typu, ale mozliwe ze gdzies-pod-spodem uzywany jest System.Array i dlatego char[] nie jest dobra nazwa

ale, patrzac juz na generici, List<int> czy List<keyValuePair<bum,bam>> sa zwyklymi nazwami typow i using X = System.Collections.Generic.List<string> jest w 100% poprawnym usingiem, i odtad mozna uzywac 'typedefowego' X'a zamiast List<string>

...i co ciekawsze, nie da sie usingowac nie-do-parametryzowanych genericow.. przynajmniej mi teraz sie nie udalo zapisac using'a na KeyValuePair<string, T> gdzie T byloby luzne. watpie zeby sie dalo, ale ktos moze wie czy sie da? chetnie uslysze jesli to mozliwe:)

0

@Quetz - często korzystasz z tych aliasów? Są chyba lepsze metody obfuskacji. ;)

0

z aliasow na namespace - calkiem czesto skracam sobie jakies przydlugie, zwlaszcza niedajace sie wprost usingowac normlanie z racji kolizji nazw, albo te ktore sa uzywane w 'szczegolnych' przypadkach i nie tycza sie 'normalnego' lokalnego kodu. using SD = System.Diagnostics; + SD.Debugger.Break(); juz sie stalo wlasciwie moim prywatnym idiomem. IMHO podnosi to przejrzystosc i tempo wstawiania/usuwania asercji i breakow [F9+condition jest o WIELE wolniejsze przy wykonywaniu np. w petli niz wstrzelone w kod if(condition)SD.Debugger.Break(); - poza tym to ostatnie nie wyparowuje przy ew. crashu visuala]

Z kolei aliasow na konkrenta nazwe klasy, np. SDd = System.Diagnostics.Debugger; z kolei nie uzywam wcale, poza jakąś totalną dzdzownica w stylu przytoczonego Dictionary<KeyValuePair<string,int>, MojKontroler<MojWidok, Blah>> -- taki typ mi sie nie zdazyl, ale jako ze ogolnie lubie template'y i nie znosze subclassowania/wrapowania tylko po to by skrocic nazwe, to sie zdarzaja.. Jakby policzyc, to moze aliasu na nazwe tak naprawde moze z trzy razy uzylem.

Wszystko przez to, ze nie istnieja aliasy lokalne. Bylyby one wrecz gienialne na chwilowe skrocenie jakiejs byczej nazwy, zwlaszcza w implementacjach co bardziej rozbudowanych genericow. Keyword var pomaga w wiekszosci przypadkow, ale w momencie gdy musisz stworzyc zmienna z wartoscia domyslna/pusta, to nawet w var x = default(tyyyyyyyyyyyyyyyyyyyyyyyyyyp) potrafi przyprawic o oczoplas .. i zaczyna brakowac glupiego typedef

0

Hmm...
Namespacy mam wszystkie w usingach, więc operuję tylko na nazwach klas. W przypadku kolizji używam pełnych nazw... Kolizja może zdarzyła mi się w trzech plikach w życiu.

Piszesz "moim prywatnym idiomem" - właśnie dlatego jestem przeciw takim kombinacjom. Ty wiesz, co te XYZ dla Ciebie znaczą, jak ktoś zacznie czytać kod, to się nie połapie. Czy nie mam racji?
Bo tak mi się trochę wydaje, że może dlatego typedefa nie ma. Chociaż wiem, że niektórym tego brakuje, tak jak i define. I niejawnej konwersji wszelkich typów. ;P

0

Zawsze można jeszcze użyć dziedziczenia :P

class MojaLista : List<Dictionary<object[], List<string>> { }
0

@somekind, pan kuba - z oba argumentami/przykladami sie nie zgadzam. W momencie gdy ktos w miare sie orientuje we frameworku, nie potrzebuje ciagle wydziec "System.Collections.Generic.List" zeby skoarzyc ze "SCG.List<x>" oznacza tęże. Zreszta, w VS wystarczy najechac na skrot mysza, zeby sobie przypomniec do czego sie on rozwija. Poza tym, jak już wspomnialem - nie uzywam tego nagminnie, tylko do wypadkow szczegolnych ktore z zalozenia mają odstawac i rzucac sie w oczy. Skrot ktory wyraznie nie jest lokalny swietnie sie w to wpasowuje.

Zreszta, sadzac po zrodlach .Net'a nie tylko ja mam takie 'konwencje' - zerknij np. na klasę SR bodajze w mscorlib.dll/namespace system

a co do typedefow - serio, mialem na mysli tylko lokalne, czyli pracujace w zakresie jednego scope'a, zakladam standardowa max dlugosc scopea 1-1.5 ekranu.. Kto mowi o jakiejs niejawnej konwersji typow? To nie ma nic do tematu!:)

Dziedziczenie.. nie no, nie przesadzajmy.. Na taki przyklad jak podales IMHO powinno sie uzyc wlasnie using-alias-class, a nie sztucznie wprowadzac nowy typ tylko po to zeby szablon skonkretyzowac i skrocic nazwe:/ Ale, jak kto lubi. Można? Można, więc czemu nie, ostatecznie, to Wasz kod, Wy macie sie w nim orientowac nie ja, i vice versa:)

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