Pour etre plus precis, .Net a été créé pour justement fournir une abstraction de cette API (elle etait pas vraiment facile à utiliser). Donc sous Windows, le framework permet de manipuler l´API Win (pour le moment, il n´y a pas d´autres moyens de faire marcher un prog sous windows) mais sans t´en rendre, ni meme que tu le saches.
Pour revenir à Mono, ce qu´ils ont fait, c´est qu´ils ont repris la BCL (base class library, les classes les plus importantes) et ont adapté leur dll pour Linux. Donc pour Winforms, ils ont des classes (Form, Control, Application) a adapté pour le systeme Linux, ce qu´ils ont fait. L´enorme avantage dans tout ca, c´est que quelque soit la plateforme ou tu as compilé ton appli et celle ou elle s´executera (sous condition qu´il existe une machine virtuelle pour la plateforme), ce n´est pas ton probleme, tu sais que new Form() te donnera une reference vers une fenetre, et ce quelque soit l´API sous jacente (Win, l´API de Linux ou autres).
il y a d´autre api sous windows que win32 néanmoins. Ou en tout cas, il y a au moins interix, une API posix distribuée par microsoft dans SFU (et, comme je le disais l´autre jour, qui doit être inclue nativement dans certaine version de vista je crois).
Et il pourrait y en avoir d´autre, même si ce n´est pas le cas à ma connaissance.
pendant un temps, tu avais access au sous systeme OS/2. Mais je ne l´ai jamais testé directement.
Bonjour,
je up ce topic car j´ai de nouveau des questions sur C# .
Dans le bouquin que je viens d´acheter*, l´auteur dit que C# n´est pas comme C/C++ au niveau des pointeurs, en C#, on ne peut pas "dépasser", ou empiéter sur un endroit non réservé à son programme.
Je voudrais savoir si cela est un défaut ? on reproche ce même défaut à Java, pour sa lenteur. Si effectivement, le C# est aussi lent que Java, la vitesse est-elle négligeable pour un jeu vidéo 2D amateur ?
Et aussi je ne comprends pas pourquoi quand on déclare un objet, on est obligé de faire "exemple monExemple = new exemple()"
Dans mon bouquin on me dit que c´est une histoire d´instance et de référence d´objet ... le problème c´est que je n´arrive pas à cerner cette histoire .
Pour moi, on fait ça pour appeler le constructeur, c´est exacte ? mais si c´est ça, pourquoi ils font pas comme en C++, quand on crée l´objet, le constructeur est appelé par défaut ?
Merci bien ...
http://www.amazon.fr/C-2-0-Guide-pratique-développeur/dp/2100493272/ref=pd_bbs_sr_3?ie=UTF8&s=books&qid=1199047782&sr=8-3
Dans du C# propre, les pointeurs n´existe pas. Donc pas de problème de savoir ce qu´on peut faire avec ou non. Ce n´est absolument pas un problème, on peut tout faire sans pointeur et le résultat est souvent plus propre, plus lisible, moins sujet aux erreurs, etc. Parfois (mais pas forcément) ça pourrait être moins rapide, on peut alors utilisé un mode "sale" en C# dans lequel les pointeurs sont autorisé, mais ce n´est pas recommandé. Et là, tu peut faire la même chose qu´en C++.
Il faut noter aussi que généralement le C# est bien plus efficace que le java car le C# est compilé "juste à temps" (i.e. le code qui s´exécute au final est bien du code natif), la où le java est interprété sur pas mal de plate forme (mais je crois sans en être sûr qu´il existe aussi des compilo JIT (Just in Time) pour java sur certaine plate forme).
Pour la déclaration d´objet, il faut comprendre ce que sont les variables en C# : il y en a de deux sorte. Les "value type" (je ne connais pas la traduction officielle) qui sont les int, bool et autre types de base. Ces variable sont créées normalement ("int var;") ou avec le mot clef "new" et sont toujours sur la pile (même si elles sont créée avec "new" je crois). Mais pour toutes les autres variables, on parle de "reference type", les valeurs sont stocké dans ce qui s´appelle le "tas managé". C´est un peu équivalent à la construction suivante en C++ :
A& a = new A();
Sauf que comme toutes les variables un peu "complexe" en C# sont des références, il n´y a pas besoin de noter le ´&´. Par contre, il faut quand même utiliser explicitement le mot clef "new" pour créer sur le tas la variable. Mais il n´est pas nécessaire d´utiliser de "delete" car le C# est un langage "garbage collecté" (à "ramasse miette" en français dans le texte) et il détruit les objets tout seul quand il le faut.
merci de ta réponse complète dnob700
maintenant que tu en parles, j´avais oublié de parler du ramasse miette. Dans mon livre, le ramasse miette sert a libérer la mémoire non utilisé du programme, je voudrais savoir si il y a l´équivalent en C/C++ ?
merci
Il y a des bibliotheques qui font cela. Cependant, je ne crois pas qu´elle fonctionne bien comme il faut.
Tu peux aussi utiliser un mecanisme de ref counting pour liberer les ressources quand elle ne sont plus utilisé (a la maniere d´un auto ptr).
Cependant ces technique de libération automatique de la mémoire posent parfois problemes; particulierement lors de l´interconnection de plusieurs langages. En effet il n´est pas possible de savoir si du code ecrit dans un autre langage ne conserve pas de pointeur sur ta mémoire.
ok je vois .
Sinon une question un peu hors sujet mais bon ...
Est-il possible avec le debugger de reperer les fuites de mémoire ? car moi le debugger je ne m´en sert que pour reperer les dépassements de mémoire et donc je voulais savoir si il y avait cette option
et aussi, en C/C++, lorsqu´on ne libère pas une variable aloué dynamiquement, un int par exemple la "case" en mémoire de 4 octets est foutu ? ou alors elle est de nouveau opérationel au prochain redemarage de la machine ?
merci
"la "case" en mémoire de 4 octets est foutu ?"
t´inquiète, normalement tu ne peut faire aucun dommage physique à ta machine en programmant (fut un temps on pouvait facilement casser un disque dur par exemple, mais depuis ce n´est plus possible).
Toujours est-il que là, c´est encore mieux : dès que ton programme qui a une fuite de mémoire se ferme, le système libère toute sa mémoire et tu peut de nouveau l´utiliser.
Pour les fuites de mémoire ce n´est pas un débogueur qu´il faut utiliser mais d´autre sorte d´outils. Le plus connu est je crois valgrind, mais il y en a d´autre. Je ne peut pas trop t´en parler car je ne me suis jamais servi de ce genre de chose.
D´autre part, l´utilisation de langage à ramasse miette évite (entre autre chose) justement d´avoir à faire attention à ce genre de détail.
Je re-up ce topic car vous l'aurez deviner j'ai encore des questions :
j'ai fais une petite recherche sur google mais pas moyen d'avoir de réponse :
En C#, est-ce que le caractère de fin de chaîne existe '\0' comme en C/C++ ?
car quand je fais
char[] tabc = new char[] { 's', 'a', 'l', 'u', 't' };
ça marche parfaitement .
Aussi, en C# si j'ai bien compris, à chaque initialisations on instancie l'objet ( ici un char[] donc ), on l'instancie avec l'operateur new, ne faut-il pas libéré l'allocation a un moment donné ? comme en C/C++ avec delete ? ou alors ça c'est le boulot du Garbage Collector ? et il le fait bien ?
Aussi, avez vous un bon lien qui pourrait m'initier au entrée/sortie sur les fichiers en C# ?
merci d'avance ![]()
pour le problème de fin de chaîne je ne sais pas. Généralement on utilise des objet System.string pour gérer les chaînes de caractères et alors tu ne te préoccupe pas de ce genre de détails (car tu n'a pas accès à la représentation physique de la chaîne). C'est aussi l'avantage de ce genre de langage évolué ou il ne faut pas faire attention à plein de petite source d'erreur.
J'aurais donc tendance à dire qu'utiliser des tableaux de char pour faire des chaines de caractère est une erreur. Ensuite, il existe certainement des fonctions qui te construisent une chaîne à partir de ce tableau, mais comme de toute manière, la taille de tableau est connu par la bibliothèque, on peut penser que ces fonctions s'arrêtent à la fin du tableau (ou avant si elles croisent un '\0'). Mais je ne sais pas trop. Le mieux est de ne pas utiliser ça.
Pour le delete, c'est exactement ça. Tout les objets en C# héritent de la classe object un membre "finalize" que tu peut appeler et qui a pour effet de lancer l'équivalent du destructeur de la classe (mais ce n'est pas vraiment la même chose qu'en C++), par contre, ça ne libère pas la mémoire occupé par l'objet.
C'est le GC qui libère la mémoire automatiquement lorsque l'objet n'ai plus utilisé. Et il le fait très bien. Le GC du framework .NET est très très efficaces et très bien optimisé. C'est l'une des plus grandes forces de cette plateforme par rapport à mono (qui est catastrophique de ce point de vue) et même par rapport à java (qui n'est pas aussi bon).
Pour ce qui est des entrées/sorties, je ne peut rien te dire, je n'ai pas souvenir d'avoir fait ça en C# (il faut dire que mon utilisation du C# a été sur du code assez théorique et assez limité dans le temps) donc je ne sais même pas quelles fonctions il faut utiliser. Par contre, je suis sûr que c'est très bien fait et très simple dès qu'on a trouvé le bon truc.
[Bon en fait, je crois qu'il y a des classes Reader et Writter (ou File... ou un truc comme ça) qu'on ouvre avec un flux (un nom de fichier, un socket, etc.) et qui sont complètement génériques.]
j'ai oublié de préciser qu'il ne faut pas appeler la fonction finalize d'un objet sauf si on a de très bonnes raisons de le faire (par exemple pour fermer explicitement un descripteur de fichier à un moment précis). Normalement, c'est le GC qui s'en charge.
Merci beaucoup dnob700,
aussi quelqu'un a pendant un temps developpé avec le binding C# de la SDL ?
http://cs-sdl.sourceforge.net/index.php/Main_Page
car je cherche un "coach" comme ya 2/3 trucs que je pige pas trop ...
donc mon msn : malloc@live.fr
et sinon, vous connaissez un bon livre pour l'ensemble du C#, accesible pour un débutant qui programmai auparavant en C++ ?
merci d'avance ![]()
comme livre, je peut te conseiller "Visual C# xxx : The language" chez Microsoft Press (où xxx est la version du langage que tu utilise). Pour SDL je ne peut rien te dire : je n'aime pas ça en C et je n'ai jamais essayer en C#.
Bonjour à tous. J'ai quelques questions concernant le logiciel visual studio 2008 et concernant .net:
quel framework .net Visual Studio 2008 permet t'il d'adresser ?
2 dans VS2008, est ce que l'intellisense supporte le js ? (javascript)
3 est ce que la gestion des manifestes UAC est integrée dans vs2008
merci d'avance
hééé, tu squattes mon topic toi !
1).NET 3.5
2) je crois pas
3) je crois que ce lien pourrait répondre à ta question
http://lgmorand.developpez.com/dotnet/developper-sous-vista/
pour le 1 tu peut utiliser le framework que tu veux pourvu que les fichiers de développement soient installés.
Pour le 2, je crois que oui, peut-être dans l'outils pour faire des sites web (i.e. je crois que c'est le cas dans VS2005, je ne pense pas qu'il l'ai enlevé dans le 2008, mais je ne l'ai pas testé).
Pour le 3, pas la moindre idée, je ne sais pas ce qu'est un manifeste UAC.
merci pour vos réponses ![]()
ah sangohan, il y a une espece de suites de tutorials sur msdn, tu recherrche coach c# et tu verras trois tutop en ligne, les autres en train de se completer. les trois premiers consistent à une application avec des winforms ressemblant à excel et à des améliorations de celle ci, et la doc de msdn pourraa t'aider si les réponses aux questions que tu as e sont pas dans les tuto.
Oui, j'ai découvert ça il y a 1 semaine !
Merci tout de même de ta réponse ![]()