Quel est l'équivalent C# du mot-clé ami en C++ ?
Amis en C#
Une fonction ami d'une classe est définie en dehors de la portée de la classe, mais elle a accès à tous les membres privés et protégés de la classe. Bien que le prototype d'une fonction ami apparaisse dans la définition de la classe, un ami n'est pas une fonction membre.
Les amis peuvent être des fonctions, des modèles de fonction ou des fonctions membres, ou ils peuvent être des classes ou des modèles de classe. Dans ce cas, toute la classe et tous ses membres sont amis.
L'équivalent C++ de friends en C#
L'équivalent le plus proche est de créer une classe imbriquée qui accédera aux membres privés de la classe externe.
Ici, la classe interne peut accéder aux membres privés de la classe externe -
class Outer { class Inner { } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

DependencyInjection (DI) Inc # IsadesignPatterntHatenhancesmodularité, testabilité et responsabilité par la façon dont les dépenses de contrôle

Le rôle d'idisposable et de l'utilisation dans C # est de gérer efficacement et de manière déterministe des ressources non gérées. 1. IDisposable fournit la méthode Dispose (), afin que la classe puisse clairement définir comment libérer des ressources non gérées; 2. L'instruction d'utilisation garantit que Disser () est automatiquement appelé lorsque l'objet est hors de portée, simplifiant la gestion des ressources et évitant les fuites; 3. Lorsque vous l'utilisez, veuillez noter que l'objet doit implémenter iDisposable, peut déclarer plusieurs objets et utiliser toujours en utilisant pour des types tels que StreamReader; 4. Les meilleures pratiques courantes incluent ne pas s'appuyer sur les destructeurs pour nettoyer, gérer correctement les objets imbriqués et mettre en œuvre le modèle de disposition (bool).

Le principe solide est cinq principes de conception pour améliorer la maintenabilité et l'évolutivité du code dans la programmation orientée objet. Ce sont: 1. Le principe de responsabilité unique (SRP) exige que la classe n'assume qu'une seule responsabilité, comme la séparation de la génération de rapports et l'envoi d'e-mails; 2. Le principe d'ouverture et de clôture (OCP) souligne que l'extension est prise en charge par des interfaces ou des classes abstraites sans modifier le code d'origine, comme l'utilisation de l'interface ishape pour réaliser le calcul de la zone de différents graphiques; 3. Le principe de remplacement de Richter (LSP) exige que la sous-classe puisse remplacer la classe parent sans détruire la logique, comme le carré ne doit pas hériter à tort du rectangle, entraînant un comportement anormal; 4. Le principe d'isolement d'interface (ISP) préconise la définition des interfaces à grain fin, telles que les fonctions d'impression et de balayage divisées pour éviter les dépendances redondantes; 5. Le principe d'inversion de dépendance (DIP) préconise le

En C #, la principale différence entre les types de valeur et les types de référence est en termes de stockage de données et de gestion de la mémoire. 1. Le type de valeur contient directement des données, généralement stockés sur la pile, tels que INT, Float, Bool et Struct, avec une vitesse d'accès rapide et un cycle de vie court; Le type de référence stocke les références aux données réelles, l'objet lui-même est stocké sur le tas, tel que la classe, la chaîne ou l'objet, et les variables de référence sont stockées sur la pile, en s'appuyant sur la collecte et le nettoyage des ordures. 2. Copiez la valeur réelle lorsque le type de valeur est attribué et que la modification de la copie n'affecte pas la valeur d'origine; Copiez l'adresse de référence lorsque le type de référence est attribué, et les deux variables pointent vers le même objet, et la modification s'affermera mutuellement. 3. Le type de valeur ne peut pas être nul par défaut, sauf si des types nullables tels que int? sont utilisés; Le type de référence peut naturellement être nul

Les arbres d'expression sont utilisés en C # pour représenter le code sous forme de données. Ils permettent aux développeurs d'analyser, de modifier ou d'exécuter pour générer un nouveau code en créant une structure d'arbre qui décrit les opérations de code plutôt que d'exécuter le code directement. Ses composants principaux comprennent les expressions de paramètres, les expressions binaires et les expressions de lambda. Les utilisations courantes sont Linqtosql et Orm (comme EntityFramework), où l'arborescence d'expression permet de traduire les requêtes C # linq en instructions SQL. D'autres utilisations incluent le filtrage dynamique et la requête, les systèmes de sérialisation ou de script, les cadres de simulation et les conteneurs d'injection de dépendance. Cependant, il est plus approprié d'utiliser des fonctions normales ou des expressions de lambda sans avoir besoin d'inspection ou de logique de conversion. 1. Construire une requête dynamique; 2. Le traduire sous d'autres formes

ASP.Netcore est un cadre multiplateforme et haute performance lancé par Microsoft, conçu pour le développement d'applications Web modernes en C #. Ses avantages principaux incluent: 1. Prise en charge multiplateforme, qui peut fonctionner sur Windows, MacOS et Linux, et est compatible avec les architectures Docker et Cloud-Native; 2. Architecture modulaire, qui améliore les performances et la flexibilité grâce aux fonctions de chargement du pipeline au middleware; 3. Injection de dépendance intégrée (DI), prend en charge la gestion du cycle de vie et améliore la maintenabilité et la testabilité du code; 4. Les performances élevées, basées sur Kestrel Server, peuvent gérer efficacement les demandes simultanées élevées sous configuration par défaut, adaptée aux scénarios avec des ressources limitées ou des exigences de vitesse de réponse élevées.

CustomAttributes sont des mécanismes utilisés dans C # pour attacher des métadonnées aux éléments de code. Sa fonction principale consiste à hériter de la classe System.Attribute et à lire la réflexion à l'exécution pour implémenter des fonctions telles que la journalisation, le contrôle de l'autorisation, etc. spécifiquement, il comprend: 1. CustomAttributes sont des informations déclaratives, qui existent sous forme de classes de fonctionnalités, et sont souvent utilisées pour marquer des classes, des méthodes, etc.; 2. Lors de la création, vous devez définir une classe héritée de l'attribut et utiliser AttributUsage pour spécifier la cible d'application; 3. Après l'application, vous pouvez obtenir des informations sur les fonctionnalités via la réflexion, telles que l'utilisation d'attribut.getCustomAttribute ();

Le collecteur de déchets .NET optimise les performances de gestion de la mémoire en divisant des objets en trois générations (Gen0, Gen1, Gen2). Le nouvel objet appartient à Gen0 et les objets qui n'ont pas été libérés ont été progressivement promus à une génération supérieure après plusieurs recycles. 1. Gen0 contient des objets nouvellement alloués, qui sont généralement de courte durée; 2. Les objets survivants qui ont subi un recyclage entrent Gen1; 3. Des objets survivants qui survivent encore après le recyclage entrent Gen2. Des objets à long terme tels que les caches ou les singletons seront éventuellement situés dans cette génération. GC priorise le recyclage des objets à basse génération, réduisant la plage de mémoire par scan, améliorant ainsi l'efficacité. Dans la plupart des cas, les développeurs n'ont pas besoin de se soucier du mécanisme de génération, mais dans des scénarios tels qu'une allocation haute fréquence, une mauvaise gestion des événements et une utilisation incorrecte de finalizer ou iDisposable,
