Autor Wątek: Kilka prostych pytań  (Przeczytany 4113 razy)

Offline _Wojciech_

  • Użytkownik

# Marzec 02, 2006, 00:12:44
Kurcze osłabia mnie ten C#...
Takie pytania:
1. Czy da się zdefiniowac funkcję (metodę) poza ciałem klasy?
class Klasa
{
      void Metoda();
}
I definicja poza klasą. Bo jeśli nie, to jak definicję klasy rozłożyć na kilka plików?
W API to było
void Klasa::Metoda()
{
}

2. Czy da się zdefiniować jakieś stałe dla całego programu poza klasą? Konkretnie jakiś odpowiednik #define z C/C++.

3. Ogólne pytanie. Mam nadzieję, że się mylę i poniższe zdanie obalicie. Ja mam po 3 dniach pisania w C# (a po n lat w Win API) taką obawę:
C# jest bardzo fajny jeśli chodzi o WindowsForm. Okienka, przyciski, itp. tworzy się w mig. Kłopot pojawia się przy złożonych algorytmach, w których mamy klasy z kilkuset zmiennymi i powiedzmy setką funkcji. Jak takiego molocha ogarnąć w C#? To musi się rozbić na n plików, musi się dać definiować zmienne globalne, itp.
Co Wy na to?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

spax

  • Gość
# Marzec 02, 2006, 17:08:24
Co do stałych to ja zawsze robie tak
static class Global
{
  public const float PI = 3.14f;
  //... I tak dalej ^^
};

//...
System.Console.Write(Global.PI);

Co do wielu zmiennych i metod to często (dla zachowania czytelności) stosuje taki fajny wynalazek
#region Jakies metody i pola
//...
#endregion

pozdro
spax.
« Ostatnia zmiana: Marzec 02, 2006, 17:11:50 wysłana przez spax »

Offline _Wojciech_

  • Użytkownik

# Marzec 02, 2006, 19:28:18
Właśnie tak samo zdefiniowałem sobie stałe. Ale wg mnie to marny sposób. Jednak #define Nazwa wartość było dużo lepsze. Ale może nie czuję istoty obiektowości.

A ten #region, to jest kolejny półśrodek... Kurcze przecież rozbicie klasy na kilka plików to czysto techniczny problem. Nie chwytam jakie są powody braku odpowiednika  cośtam Klasa::Nazwa(cośtam) {.....}


Offline Nargil

  • Użytkownik
    • projekty

# Marzec 02, 2006, 20:11:43
klase mozesz rozbic na pare plikow robiac:

----plik1.cs-----
public partial class lol
{
   void blabla()
   {
   }
}

----plik2.cs-----
public partial class lol
{
   void blabla2()
   {
   }
}

klasa lol bedzie zawierala metody blabla i blabla2

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Wrzesień 28, 2006, 16:43:07
Nie, w C# wszystko musi być w jakiejś klasie. To jest dziwne, ale na szczęście mamy coś takiego jak metody i pola statyczne, a więc takie, które tylko z nazwy leżą wewnątrz klasy, a tak naprawdę są globalne i nie wymagają tworzenia obiektu tej klasy. Na przykład:

class Globals
{
  // Stała globalna
  public const float PI = 3.14f;
  // Zmienna globalna
  public static string APP_NAME = "Moja aplikacja";
  // Funkcja globalna
  public static void Foo()
  {
    // ...
  }
}

Używamy tego tak: Globals.PI, Globals.APP_NAME, Globals.Foo.

Jeśli natomiast chodzi o podział na pliki, to nie rozumiem twojego problemu. Przecież w C++ tak samo możesz wszystko wpisać do jednego pliku ze źródłem, a możesz poszczególne części wpisywać do osobnych plików - niezależnie czy będą to klasy, czy zbiory funkcji i zmiennych globalnych. Być może masz na myśli brak nagłówków i #include? Jeśli tak, to wiedz, że tutaj nie ma tego problemu - po prostu każdy plik w projekcie ma od razu dostęp do elementów zdefiniowanych we wszystkich pozostałych plikach źródłowych CS.

Rozbicie klasy na wiele plików jest możliwe, jak już napisali wyżej, z użyciem słówka partial, ale rzadko się to przydaje. Najlepiej sobie wszystko poorganizować w osobne, ładne klasy i dać po jednej albo po kilka do każego pliku CS.

Offline snakeo

  • Użytkownik

# Wrzesień 28, 2006, 17:14:54
Co do implementacji bardziej skomplikowanych algorytmow, to wydaje mi sie ze u Ciebie wynika to z przyzwyczajenia do pisania w WinApi, dla chcacego nic trudnego.

Być może masz na myśli brak nagłówków i #include? Jeśli tak, to wiedz, że tutaj nie ma tego problemu - po prostu każdy plik w projekcie ma od razu dostęp do elementów zdefiniowanych we wszystkich pozostałych plikach źródłowych CS.
Chyba nie do konca, bo dlaczego mam taki błąd:
Error 1 The type or namespace name 'FontStyle' could not be found (are you missing a using directive or an assembly reference?)
Jezeli w tym pliku dodam przed namespace using System.Drawing, to blad znika ;)
« Ostatnia zmiana: Wrzesień 28, 2006, 17:53:46 wysłana przez snakeomeister »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Wrzesień 29, 2006, 10:13:27
No bo w C# wszystko jest poukładane w przestrzenie nazw (namespace). Te standardowe komponenty systemowe są w jakiś zagnieżdżonych wielokrotnie przestrzeniach typu właśnie to Twoje System.Drawing, a własny kod też domyślnie trafia do jakiejśtam przestrzeni odpowiadającej zdaje się nazwie projektu. Oczywiście można tworzyć własne i też je zagnieżdżać, żeby jeszcze lepiej posegregować sobie klasy w swoim kodzie.

To jest jednak tylko sposób na segregowanie, a nie odpowiednik #include z C++. Tutaj zawsze, tak czy inaczej, masz dostęp do wszystkich tych elementów i tylko od Ciebie zależy, czy za każdym razem będziesz poprzedzał je pełną przestrzenią nazw:

System.Drawing.Image Image1 = new System.Drawing.Image("Bitmapa.bmp");
Czy zrobisz sobie dla wygody na początku pliku deklarację:

using System.Drawing;
I potem będziesz mógł już wszelkich klas zawartych w tej przestrzeni nie poprzedzać jej pełną "ścieżką":

Image Image1 = new Image("Bitmapa.bmp");

Offline counterClockWise

  • Użytkownik

# Wrzesień 29, 2006, 14:33:46
Dokładnie, a skoro kolega początkujący w c# to dodam, że kompilator oprócz zawiadomienia przez "using" musi mieć dostęp do odpowiedniej dll-ki. Więc aby używać wiele namespaców .NET-a a także po prostu z innych projektów, należy jeszcze dodać odpowiednie biblioteki przez "Add reference" i dopiero using " ".

Należy też uważać przy tworzeniu folderów w projekcie, bo tworząc np. folder "Singletons" w projekcie "Game" i definiując klasy wewnątrz niego, automatycznie mają namespace "Game.Singletons". Taki przykład, bo akurat grupowanie singletonów w jedno jest niedobrym podziałem logiki projektu - są lepsze funkcjonalne, logiczne kryteria.
« Ostatnia zmiana: Wrzesień 29, 2006, 14:35:39 wysłana przez counterClockWise »

Offline snakeo

  • Użytkownik

# Wrzesień 29, 2006, 15:47:35
Ok, dzieki, tak w C# jestem poczatkujacy, pozatym doszedlem do wniosku ze czytam zla ksiazke, za malo jest opisanych rzeczy, teraz musze sie przerzucic na ksiazke Jessego Liberty, w sumie czytalem z niego o C++ i ksiazka dobra, wiec o C# tez na pewno nie jest zla (i bardziej szczegolowa niz C# for beginners;)

Offline macabre13

  • Użytkownik

# Wrzesień 29, 2006, 16:09:19
z Jessego sie tez uczylem C++ i nie polecilbym jej nikomu. W sumie nie znam teraz zadnej sensownej ksiazki do nauki podstaw C++. Wczesniej uwazalem ze TICPP jest dobre, ale nie jest ;).

Co do ksiazek do C# sam szukam, przejrzalem to co napisaliscie wczesniej i nadal nie wiem za ktora sie zabrac.

pzdr
J.

Offline snakeo

  • Użytkownik

# Wrzesień 29, 2006, 16:16:37
Symfonia Grębosza?

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Wrzesień 29, 2006, 21:09:59
Przy okazji dorzucę pytanie: Jak zrobić plik z kodem w C# wspólny dla wszystkich projektów w solucji, żeby nie trzeba go było kopiować a potem po zmianach uaktualniać w każdym projekcie osobno? Czy zrobienie biblioteki DLL to jedyne wyjście?

Offline counterClockWise

  • Użytkownik

# Wrzesień 30, 2006, 01:39:16
Przy okazji dorzucę pytanie: Jak zrobić plik z kodem w C# wspólny dla wszystkich projektów w solucji, żeby nie trzeba go było kopiować a potem po zmianach uaktualniać w każdym projekcie osobno? Czy zrobienie biblioteki DLL to jedyne wyjście?

Wydaje mi się, ze to jedyne wyjście. Przynajmniej ja nie wpadłem na inny pomysł i w takich sytuacjach robiłem jeden projekt ze wspólnymi plikami z kodem, do którego reszta miała referencje i dll-ki robiły się automatycznie przy build solution. Nic rewelacyjnego :/

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Marzec 29, 2007, 17:04:54
Właśnie przeglądam sobie forum i natrafiłem na Twoje pytanie Reg (hehe nie ma to jak refleks ;))

Pewnie już sobie z tym problemem poradziłeś, ale napiszę, żeby nie pozostało bez odpowiedzi.

Robisz sobie jeden plik .cs we wspólnym katalogu projektów, później dajesz na projekcie Add Existing Item, wybierasz i tam gdzie jest przycisk Add jest taka mała strzałeczka, klikasz i wybierasz Add As Link :)

Offline revo

  • Użytkownik

# Marzec 30, 2007, 10:38:40
Można zrobić też dll'kę, dodać ją jako referencję do projektów i automatycznie będzie się kopiowała w odpowiednie miejsca podczas kompilacji.

//edit: ups nie zauważyłem, że to taki staroć :P