\r\n          _text.Clear();\r\n        }\r\n        else if (tag == \"\/body\")\r\n        {\r\n          \/\/ Discard content after <\/body>\r\n          _pos = _html.Length;\r\n        }\r\n        else if (tag == \"pre\")\r\n        {\r\n          \/\/ Enter preformatted mode\r\n          _text.Preformatted = true;\r\n          EatWhitespaceToNextLine();\r\n        }\r\n        else if (tag == \"\/pre\")\r\n        {\r\n          \/\/ Exit preformatted mode\r\n          _text.Preformatted = false;\r\n        }\r\n        string value;\r\n        if (_tags.TryGetValue(tag, out value))\r\n          _text.Write(value);\r\n        if (_ignoreTags.Contains(tag))\r\n          EatInnerContent(tag);\r\n      }\r\n      else if (Char.IsWhiteSpace(Peek()))\r\n      {\r\n        \/\/ Whitespace (treat all as space)\r\n        _text.Write(_text.Preformatted ? Peek() : ' ');\r\n        MoveAhead();\r\n      }\r\n      else\r\n      {\r\n        \/\/ Other text\r\n        _text.Write(Peek());\r\n        MoveAhead();\r\n      }\r\n    }\r\n    \/\/ Return result\r\n    return HttpUtility.HtmlDecode(_text.ToString());\r\n  }\r\n  \/\/ Eats all characters that are part of the current tag\r\n  \/\/ and returns information about that tag\r\n  protected string ParseTag(out bool selfClosing)\r\n  {\r\n    string tag = String.Empty;\r\n    selfClosing = false;\r\n    if (Peek() == '<')\r\n    {\r\n      MoveAhead();\r\n      \/\/ Parse tag name\r\n      EatWhitespace();\r\n      int start = _pos;\r\n      if (Peek() == '\/')\r\n        MoveAhead();\r\n      while (!EndOfText && !Char.IsWhiteSpace(Peek()) &&\r\n        Peek() != '\/' && Peek() != '>')\r\n        MoveAhead();\r\n      tag = _html.Substring(start, _pos - start).ToLower();\r\n      \/\/ Parse rest of tag\r\n      while (!EndOfText && Peek() != '>')\r\n      {\r\n        if (Peek() == '\"' || Peek() == '\\'')\r\n          EatQuotedValue();\r\n        else\r\n        {\r\n          if (Peek() == '\/')\r\n            selfClosing = true;\r\n          MoveAhead();\r\n        }\r\n      }\r\n      MoveAhead();\r\n    }\r\n    return tag;\r\n  }\r\n  \/\/ Consumes inner content from the current tag\r\n  protected void EatInnerContent(string tag)\r\n  {\r\n    string endTag = \"\/\" + tag;\r\n    while (!EndOfText)\r\n    {\r\n      if (Peek() == '<')\r\n      {\r\n        \/\/ Consume a tag\r\n        bool selfClosing;\r\n        if (ParseTag(out selfClosing) == endTag)\r\n          return;\r\n        \/\/ Use recursion to consume nested tags\r\n        if (!selfClosing && !tag.StartsWith(\"\/\"))\r\n          EatInnerContent(tag);\r\n      }\r\n      else MoveAhead();\r\n    }\r\n  }\r\n  \/\/ Returns true if the current position is at the end of\r\n  \/\/ the string\r\n  protected bool EndOfText\r\n  {\r\n    get { return (_pos >= _html.Length); }\r\n  }\r\n  \/\/ Safely returns the character at the current position\r\n  protected char Peek()\r\n  {\r\n    return (_pos < _html.Length) ? _html[_pos] : (char)0;\r\n  }\r\n  \/\/ Safely advances to current position to the next character\r\n  protected void MoveAhead()\r\n  {\r\n    _pos = Math.Min(_pos + 1, _html.Length);\r\n  }\r\n  \/\/ Moves the current position to the next non-whitespace\r\n  \/\/ character.\r\n  protected void EatWhitespace()\r\n  {\r\n    while (Char.IsWhiteSpace(Peek()))\r\n      MoveAhead();\r\n  }\r\n  \/\/ Moves the current position to the next non-whitespace\r\n  \/\/ character or the start of the next line, whichever\r\n  \/\/ comes first\r\n  protected void EatWhitespaceToNextLine()\r\n  {\r\n    while (Char.IsWhiteSpace(Peek()))\r\n    {\r\n      char c = Peek();\r\n      MoveAhead();\r\n      if (c == '\\n')\r\n        break;\r\n    }\r\n  }\r\n  \/\/ Moves the current position past a quoted value\r\n  protected void EatQuotedValue()\r\n  {\r\n    char c = Peek();\r\n    if (c == '\"' || c == '\\'')\r\n    {\r\n      \/\/ Opening quote\r\n      MoveAhead();\r\n      \/\/ Find end of value\r\n      int start = _pos;\r\n      _pos = _html.IndexOfAny(new char[] { c, '\\r', '\\n' }, _pos);\r\n      if (_pos < 0)\r\n        _pos = _html.Length;\r\n      else\r\n        MoveAhead();  \/\/ Closing quote\r\n    }\r\n  }\r\n  \/\/\/ \r\n  \/\/\/ A StringBuilder class that helps eliminate excess whitespace.\r\n  \/\/\/ <\/summary>\r\n  protected class TextBuilder\r\n  {\r\n    private StringBuilder _text;\r\n    private StringBuilder _currLine;\r\n    private int _emptyLines;\r\n    private bool _preformatted;\r\n    \/\/ Construction\r\n    public TextBuilder()\r\n    {\r\n      _text = new StringBuilder();\r\n      _currLine = new StringBuilder();\r\n      _emptyLines = 0;\r\n      _preformatted = false;\r\n    }\r\n    \/\/\/ \r\n    \/\/\/ Normally, extra whitespace characters are discarded.\r\n    \/\/\/ If this property is set to true, they are passed\r\n    \/\/\/ through unchanged.\r\n    \/\/\/ <\/summary>\r\n    public bool Preformatted\r\n    {\r\n      get\r\n      {\r\n        return _preformatted;\r\n      }\r\n      set\r\n      {\r\n        if (value)\r\n        {\r\n          \/\/ Clear line buffer if changing to\r\n          \/\/ preformatted mode\r\n          if (_currLine.Length > 0)\r\n            FlushCurrLine();\r\n          _emptyLines = 0;\r\n        }\r\n        _preformatted = value;\r\n      }\r\n    }\r\n    \/\/\/ \r\n    \/\/\/ Clears all current text.\r\n    \/\/\/ <\/summary>\r\n    public void Clear()\r\n    {\r\n      _text.Length = 0;\r\n      _currLine.Length = 0;\r\n      _emptyLines = 0;\r\n    }\r\n    \/\/\/ \r\n    \/\/\/ Writes the given string to the output buffer.\r\n    \/\/\/ <\/summary>\r\n    \/\/\/ <\/param>\r\n    public void Write(string s)\r\n    {\r\n      foreach (char c in s)\r\n        Write(c);\r\n    }\r\n    \/\/\/ \r\n    \/\/\/ Writes the given character to the output buffer.\r\n    \/\/\/ <\/summary>\r\n    \/\/\/ Character to write<\/param>\r\n    public void Write(char c)\r\n    {\r\n      if (_preformatted)\r\n      {\r\n        \/\/ Write preformatted character\r\n        _text.Append(c);\r\n      }\r\n      else\r\n      {\r\n        if (c == '\\r')\r\n        {\r\n          \/\/ Ignore carriage returns. We'll process\r\n          \/\/ '\\n' if it comes next\r\n        }\r\n        else if (c == '\\n')\r\n        {\r\n          \/\/ Flush current line\r\n          FlushCurrLine();\r\n        }\r\n        else if (Char.IsWhiteSpace(c))\r\n        {\r\n          \/\/ Write single space character\r\n          int len = _currLine.Length;\r\n          if (len == 0 || !Char.IsWhiteSpace(_currLine[len - 1]))\r\n            _currLine.Append(' ');\r\n        }\r\n        else\r\n        {\r\n          \/\/ Add character to current line\r\n          _currLine.Append(c);\r\n        }\r\n      }\r\n    }\r\n    \/\/ Appends the current line to output buffer\r\n    protected void FlushCurrLine()\r\n    {\r\n      \/\/ Get current line\r\n      string line = _currLine.ToString().Trim();\r\n      \/\/ Determine if line contains non-space characters\r\n      string tmp = line.Replace(\" \", String.Empty);\r\n      if (tmp.Length == 0)\r\n      {\r\n        \/\/ An empty line\r\n        _emptyLines++;\r\n        if (_emptyLines < 2 && _text.Length > 0)\r\n          _text.AppendLine(line);\r\n      }\r\n      else\r\n      {\r\n        \/\/ A non-empty line\r\n        _emptyLines = 0;\r\n        _text.AppendLine(line);\r\n      }\r\n      \/\/ Reset current line\r\n      _currLine.Length = 0;\r\n    }\r\n    \/\/\/ \r\n    \/\/\/ Returns the current output as a string.\r\n    \/\/\/ <\/summary>\r\n    public override string ToString()\r\n    {\r\n      if (_currLine.Length > 0)\r\n        FlushCurrLine();\r\n      return _text.ToString();\r\n    }\r\n  }\r\n}<\/pre>\r\n

        \r\nJ'espère que cet article sera utile à la programmation C# de chacun.\r\n<\/p>\r\n

        \r\nPour plus de méthodes C# pour convertir du HTML en texte brut, veuillez faire attention au site Web PHP chinois?!\r\n<\/p>\r\n

        \r\n
        \r\n<\/p>"}

        国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

        Maison développement back-end Tutoriel C#.Net C# implémente une méthode de conversion HTML en texte brut

        C# implémente une méthode de conversion HTML en texte brut

        Jan 14, 2017 pm 01:19 PM

        L'exemple de cet article décrit la méthode de conversion de HTML en texte brut en C#. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :

        Comment utiliser?:

        HtmlToText convert = new HtmlToText();
        textBox2.Text = convert.Convert(textBox1.Text);

        Le code C# est le suivant?:

        /// <summary>
        /// Converts HTML to plain text.
        /// </summary>
        class HtmlToText
        {
          // Static data tables
          protected static Dictionary<string, string> _tags;
          protected static HashSet<string> _ignoreTags;
          // Instance variables
          protected TextBuilder _text;
          protected string _html;
          protected int _pos;
          // Static constructor (one time only)
          static HtmlToText()
          {
            _tags = new Dictionary<string, string>();
            _tags.Add("address", "\n");
            _tags.Add("blockquote", "\n");
            _tags.Add("div", "\n");
            _tags.Add("dl", "\n");
            _tags.Add("fieldset", "\n");
            _tags.Add("form", "\n");
            _tags.Add("h1", "\n");
            _tags.Add("/h1", "\n");
            _tags.Add("h2", "\n");
            _tags.Add("/h2", "\n");
            _tags.Add("h3", "\n");
            _tags.Add("/h3", "\n");
            _tags.Add("h4", "\n");
            _tags.Add("/h4", "\n");
            _tags.Add("h5", "\n");
            _tags.Add("/h5", "\n");
            _tags.Add("h6", "\n");
            _tags.Add("/h6", "\n");
            _tags.Add("p", "\n");
            _tags.Add("/p", "\n");
            _tags.Add("table", "\n");
            _tags.Add("/table", "\n");
            _tags.Add("ul", "\n");
            _tags.Add("/ul", "\n");
            _tags.Add("ol", "\n");
            _tags.Add("/ol", "\n");
            _tags.Add("/li", "\n");
            _tags.Add("br", "\n");
            _tags.Add("/td", "\t");
            _tags.Add("/tr", "\n");
            _tags.Add("/pre", "\n");
            _ignoreTags = new HashSet<string>();
            _ignoreTags.Add("script");
            _ignoreTags.Add("noscript");
            _ignoreTags.Add("style");
            _ignoreTags.Add("object");
          }
          /// <summary>
          /// Converts the given HTML to plain text and returns the result.
          /// </summary>
          /// <param name="html">HTML to be converted</param>
          /// <returns>Resulting plain text</returns>
          public string Convert(string html)
          {
            // Initialize state variables
            _text = new TextBuilder();
            _html = html;
            _pos = 0;
            // Process input
            while (!EndOfText)
            {
              if (Peek() == '<')
              {
                // HTML tag
                bool selfClosing;
                string tag = ParseTag(out selfClosing);
                // Handle special tag cases
                if (tag == "body")
                {
                  // Discard content before <body>
                  _text.Clear();
                }
                else if (tag == "/body")
                {
                  // Discard content after </body>
                  _pos = _html.Length;
                }
                else if (tag == "pre")
                {
                  // Enter preformatted mode
                  _text.Preformatted = true;
                  EatWhitespaceToNextLine();
                }
                else if (tag == "/pre")
                {
                  // Exit preformatted mode
                  _text.Preformatted = false;
                }
                string value;
                if (_tags.TryGetValue(tag, out value))
                  _text.Write(value);
                if (_ignoreTags.Contains(tag))
                  EatInnerContent(tag);
              }
              else if (Char.IsWhiteSpace(Peek()))
              {
                // Whitespace (treat all as space)
                _text.Write(_text.Preformatted ? Peek() : ' ');
                MoveAhead();
              }
              else
              {
                // Other text
                _text.Write(Peek());
                MoveAhead();
              }
            }
            // Return result
            return HttpUtility.HtmlDecode(_text.ToString());
          }
          // Eats all characters that are part of the current tag
          // and returns information about that tag
          protected string ParseTag(out bool selfClosing)
          {
            string tag = String.Empty;
            selfClosing = false;
            if (Peek() == '<')
            {
              MoveAhead();
              // Parse tag name
              EatWhitespace();
              int start = _pos;
              if (Peek() == '/')
                MoveAhead();
              while (!EndOfText && !Char.IsWhiteSpace(Peek()) &&
                Peek() != '/' && Peek() != '>')
                MoveAhead();
              tag = _html.Substring(start, _pos - start).ToLower();
              // Parse rest of tag
              while (!EndOfText && Peek() != '>')
              {
                if (Peek() == '"' || Peek() == '\'')
                  EatQuotedValue();
                else
                {
                  if (Peek() == '/')
                    selfClosing = true;
                  MoveAhead();
                }
              }
              MoveAhead();
            }
            return tag;
          }
          // Consumes inner content from the current tag
          protected void EatInnerContent(string tag)
          {
            string endTag = "/" + tag;
            while (!EndOfText)
            {
              if (Peek() == '<')
              {
                // Consume a tag
                bool selfClosing;
                if (ParseTag(out selfClosing) == endTag)
                  return;
                // Use recursion to consume nested tags
                if (!selfClosing && !tag.StartsWith("/"))
                  EatInnerContent(tag);
              }
              else MoveAhead();
            }
          }
          // Returns true if the current position is at the end of
          // the string
          protected bool EndOfText
          {
            get { return (_pos >= _html.Length); }
          }
          // Safely returns the character at the current position
          protected char Peek()
          {
            return (_pos < _html.Length) ? _html[_pos] : (char)0;
          }
          // Safely advances to current position to the next character
          protected void MoveAhead()
          {
            _pos = Math.Min(_pos + 1, _html.Length);
          }
          // Moves the current position to the next non-whitespace
          // character.
          protected void EatWhitespace()
          {
            while (Char.IsWhiteSpace(Peek()))
              MoveAhead();
          }
          // Moves the current position to the next non-whitespace
          // character or the start of the next line, whichever
          // comes first
          protected void EatWhitespaceToNextLine()
          {
            while (Char.IsWhiteSpace(Peek()))
            {
              char c = Peek();
              MoveAhead();
              if (c == '\n')
                break;
            }
          }
          // Moves the current position past a quoted value
          protected void EatQuotedValue()
          {
            char c = Peek();
            if (c == '"' || c == '\'')
            {
              // Opening quote
              MoveAhead();
              // Find end of value
              int start = _pos;
              _pos = _html.IndexOfAny(new char[] { c, '\r', '\n' }, _pos);
              if (_pos < 0)
                _pos = _html.Length;
              else
                MoveAhead();  // Closing quote
            }
          }
          /// <summary>
          /// A StringBuilder class that helps eliminate excess whitespace.
          /// </summary>
          protected class TextBuilder
          {
            private StringBuilder _text;
            private StringBuilder _currLine;
            private int _emptyLines;
            private bool _preformatted;
            // Construction
            public TextBuilder()
            {
              _text = new StringBuilder();
              _currLine = new StringBuilder();
              _emptyLines = 0;
              _preformatted = false;
            }
            /// <summary>
            /// Normally, extra whitespace characters are discarded.
            /// If this property is set to true, they are passed
            /// through unchanged.
            /// </summary>
            public bool Preformatted
            {
              get
              {
                return _preformatted;
              }
              set
              {
                if (value)
                {
                  // Clear line buffer if changing to
                  // preformatted mode
                  if (_currLine.Length > 0)
                    FlushCurrLine();
                  _emptyLines = 0;
                }
                _preformatted = value;
              }
            }
            /// <summary>
            /// Clears all current text.
            /// </summary>
            public void Clear()
            {
              _text.Length = 0;
              _currLine.Length = 0;
              _emptyLines = 0;
            }
            /// <summary>
            /// Writes the given string to the output buffer.
            /// </summary>
            /// <param name="s"></param>
            public void Write(string s)
            {
              foreach (char c in s)
                Write(c);
            }
            /// <summary>
            /// Writes the given character to the output buffer.
            /// </summary>
            /// <param name="c">Character to write</param>
            public void Write(char c)
            {
              if (_preformatted)
              {
                // Write preformatted character
                _text.Append(c);
              }
              else
              {
                if (c == '\r')
                {
                  // Ignore carriage returns. We'll process
                  // '\n' if it comes next
                }
                else if (c == '\n')
                {
                  // Flush current line
                  FlushCurrLine();
                }
                else if (Char.IsWhiteSpace(c))
                {
                  // Write single space character
                  int len = _currLine.Length;
                  if (len == 0 || !Char.IsWhiteSpace(_currLine[len - 1]))
                    _currLine.Append(' ');
                }
                else
                {
                  // Add character to current line
                  _currLine.Append(c);
                }
              }
            }
            // Appends the current line to output buffer
            protected void FlushCurrLine()
            {
              // Get current line
              string line = _currLine.ToString().Trim();
              // Determine if line contains non-space characters
              string tmp = line.Replace(" ", String.Empty);
              if (tmp.Length == 0)
              {
                // An empty line
                _emptyLines++;
                if (_emptyLines < 2 && _text.Length > 0)
                  _text.AppendLine(line);
              }
              else
              {
                // A non-empty line
                _emptyLines = 0;
                _text.AppendLine(line);
              }
              // Reset current line
              _currLine.Length = 0;
            }
            /// <summary>
            /// Returns the current output as a string.
            /// </summary>
            public override string ToString()
            {
              if (_currLine.Length > 0)
                FlushCurrLine();
              return _text.ToString();
            }
          }
        }

        J'espère que cet article sera utile à la programmation C# de chacun.

        Pour plus de méthodes C# pour convertir du HTML en texte brut, veuillez faire attention au site Web PHP chinois?!


        Déclaration de ce site Web
        Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

        Outils d'IA chauds

        Undress AI Tool

        Undress AI Tool

        Images de déshabillage gratuites

        Undresser.AI Undress

        Undresser.AI Undress

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

        AI Clothes Remover

        AI Clothes Remover

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

        Clothoff.io

        Clothoff.io

        Dissolvant de vêtements AI

        Video Face Swap

        Video Face Swap

        échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

        Article chaud

        Outils chauds

        Bloc-notes++7.3.1

        Bloc-notes++7.3.1

        éditeur de code facile à utiliser et gratuit

        SublimeText3 version chinoise

        SublimeText3 version chinoise

        Version chinoise, très simple à utiliser

        Envoyer Studio 13.0.1

        Envoyer Studio 13.0.1

        Puissant environnement de développement intégré PHP

        Dreamweaver CS6

        Dreamweaver CS6

        Outils de développement Web visuel

        SublimeText3 version Mac

        SublimeText3 version Mac

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

        Sujets chauds

        Tutoriel PHP
        1502
        276
        Concevoir des objets immuables et des structures de données en C # Concevoir des objets immuables et des structures de données en C # Jul 15, 2025 am 12:34 AM

        Le c?ur de la conception d'objets immuables et de structures de données en C # est de s'assurer que l'état de l'objet n'est pas modifié après la création, améliorant ainsi la sécurité des threads et la réduction des bogues causés par les changements d'état. 1. Utilisez des champs en lecture et coopérez avec l'initialisation du constructeur pour vous assurer que les champs ne sont attribués que pendant la construction, comme indiqué dans la classe de personne; 2. Encapsulez le type de collection, utilisez des interfaces de collecte immuables telles que ReadOnlyCollection ou Immutablelist pour empêcher une modification externe des collections internes; 3. Utilisez l'enregistrement pour simplifier la définition du modèle immuable et générer des attributs en lecture seule et des constructeurs par défaut, adaptés à la modélisation des données; 4. Il est recommandé d'utiliser System.Collections.imm lors de la création d'opérations de collecte immuables.

        écriture du code C # maintenable et testable écriture du code C # maintenable et testable Jul 12, 2025 am 02:08 AM

        La clé de la rédaction du code C # est la maintenabilité et la testabilité. Diviser raisonnablement les responsabilités, suivre le principe de responsabilité unique (SRP) et prendre respectivement l'accès aux données, la logique métier et le traitement des demandes par le référentiel, le service et le contr?leur pour améliorer la clarté structurelle et l'efficacité des tests. L'interface polyvalente et l'injection de dépendance (DI) facilitent la mise en ?uvre du remplacement, l'extension des fonctions et les tests de simulation. Les tests unitaires doivent isoler les dépendances externes et utiliser des outils simulés pour vérifier la logique pour assurer une exécution rapide et stable. Standardiser la dénomination et la division de petites fonctions pour améliorer la lisibilité et l'efficacité de maintenance. L'adhésion aux principes de la structure claire, des responsabilités claires et des tests peut améliorer considérablement l'efficacité du développement et la qualité du code.

        Création de middleware personnalisés dans ASP.net Core C # Création de middleware personnalisés dans ASP.net Core C # Jul 11, 2025 am 01:55 AM

        Créez un middleware personnalisé dans ASP.Netcore, qui peut être implémenté en écrivant des classes et en s'inscrivant. 1. Créez une classe contenant la méthode invokeaSync, gérez httpContext et requestdelegateNext; 2. Inscrivez-vous avec Usemiddleware dans Program.cs. Le middleware convient aux opérations générales telles que la journalisation, la surveillance des performances, la gestion des exceptions, etc. Contrairement aux filtres MVC, il agit sur l'ensemble de l'application et ne s'appuie pas sur le contr?leur. L'utilisation rationnelle du middleware peut améliorer la flexibilité structurelle, mais devrait éviter d'affecter les performances.

        Meilleures pratiques pour utiliser Linq en C # efficacement Meilleures pratiques pour utiliser Linq en C # efficacement Jul 09, 2025 am 01:04 AM

        Les points suivants doivent être suivis lors de l'utilisation de LINQ: 1. La priorité est donnée à LINQ lors de l'utilisation des opérations de données déclaratives telles que le filtrage, la conversion ou l'agrégation des données pour éviter une utilisation forcée dans des scénarios avec des effets secondaires ou des scénarios critiques de performance; 2. Comprendre les caractéristiques de l'exécution retardée, les modifications de l'ensemble de source peuvent conduire à des résultats inattendus, et les retards ou l'exécution doivent être sélectionnés en fonction des exigences; 3. Faites attention aux frais généraux de performances et de mémoire, les appels de cha?ne peuvent générer des objets intermédiaires et les codes sensibles aux performances peuvent être remplacés par des boucles ou des portées; 4. Gardez la requête concise et facile à lire, et divisez la logique complexe en plusieurs étapes pour éviter une nidification excessive et un mélange de plusieurs opérations.

        Plongeon profonde dans les contraintes et covariances génériques C # Plongeon profonde dans les contraintes et covariances génériques C # Jul 12, 2025 am 02:00 AM

        Des contraintes génériques sont utilisées pour restreindre les paramètres de type pour assurer un comportement spécifique ou des relations d'héritage, tandis que la covariation permet la conversion du sous-type. Par exemple, où: ICOMPARABLE garantit que t est comparable; La covariation telle que IEnumerable permet à IEnumerable d'être convertie en IEnumerable, mais elle n'est lue et ne peut pas être modifiée. Les contraintes courantes incluent la classe, la structure, new (), la classe de base et l'interface, et plusieurs contraintes sont séparées par des virgules; La covariation nécessite le mot-clé OUT et ne s'applique qu'aux interfaces et délégués, ce qui est différent de l'onduleur (en mot-clé). Notez que la covariance ne prend pas en charge les classes, ne peut pas être convertie à volonté et que les contraintes affectent la flexibilité.

        Comprendre C # Async et attendre les pièges Comprendre C # Async et attendre les pièges Jul 15, 2025 am 01:37 AM

        Les problèmes communs avec asynchronisation et attendre en C # incluent: 1. Utilisation incorrecte de .Result ou .Wait () provoque une impasse; 2. Ignorer ConfigureAwait (False) provoque des dépendances contextuelles; 3. L'abus d'AsyncVoid provoque un contr?le manquant; 4. L'attente en série affecte les performances de la concurrence. La bonne fa?on est: 1. La méthode asynchrone doit être asynchrone tout le chemin pour éviter le blocage de la synchronisation; 2. L'utilisation de ConfigureAwait (false) dans la bibliothèque de classe est utilisée pour s'écarter du contexte; 3. Utiliser uniquement AsyncVoid dans le traitement des événements; 4. Les taches simultanées doivent d'abord être démarrées, puis attendre pour améliorer l'efficacité. Comprendre le mécanisme et normaliser l'utilisation du code asynchrone qui évite d'écrire un blocage substantiel.

        Implémentation d'interfaces courantes avec les méthodes d'extension C # Implémentation d'interfaces courantes avec les méthodes d'extension C # Jul 10, 2025 pm 01:08 PM

        L'interface Fluent est une méthode de conception qui améliore la lisibilité du code et l'expressivité à travers les appels de cha?ne. Le noyau est que chaque méthode renvoie l'objet actuel, afin que plusieurs opérations puissent être appelées en continu, comme Varresult = NewstringBuilder (). APPEND ("Hello"). Ajouter (""). Lors de la mise en ?uvre, vous devez combiner la méthode d'extension et le modèle de conception qui le renvoie, tels que la définition de la classe CluentString et le renvoi dans sa méthode, et la création d'une instance initiale via la méthode d'extension. Les scénarios d'application courants incluent la création de configurateurs (tels que les règles de vérification), la vérification

        Comment implémenter l'injection de dépendance dans les applications C # Comment implémenter l'injection de dépendance dans les applications C # Jul 16, 2025 am 03:17 AM

        La bonne fa?on d'utiliser l'injection de dépendance dans les projets C # est la suivante: 1. Comprendre l'idée principale de DI est de ne pas créer d'objets par vous-même, mais de recevoir des dépendances par le biais de constructeurs pour obtenir un couplage lache; 2. Lors de l'enregistrement des services dans ASP.Netcore, vous devez clarifier le cycle de vie: transitoire, portée, singleton et choisir selon les besoins de l'entreprise; 3. Il est recommandé d'utiliser l'injection de constructeur, et le cadre analysera automatiquement les dépendances, qui conviennent aux contr?leurs et aux services; 4. Les conteneurs intégrés peuvent être utilisés dans de petits projets, et des conteneurs tiers tels que AutoFAC peuvent être introduits dans des scénarios complexes, et l'enregistrement de service personnalisé et la lecture de configuration sont pris en charge. La ma?trise de ces points clés peut aider à améliorer la testabilité, la maintenabilité et l'évolutivité de votre code.

        See all articles