Browse Source

Merge pull request #6442 from raulsntos/dotnet/string-extensions

C#: Add table with equivalent string methods
Ignacio Roldán Etcheverry 2 years ago
parent
commit
d43100c2fc
1 changed files with 189 additions and 28 deletions
  1. 189 28
      tutorials/scripting/c_sharp/c_sharp_differences.rst

+ 189 - 28
tutorials/scripting/c_sharp/c_sharp_differences.rst

@@ -177,42 +177,203 @@ Example:
 String
 ------
 
-Use ``System.String`` (``string``). Most of Godot's String methods are
-provided by the ``StringExtensions`` class as extension methods.
+Use ``System.String`` (``string``). Most of Godot's String methods have an
+equivalent in ``System.String`` or are provided by the ``StringExtensions``
+class as extension methods.
 
 Example:
 
 .. code-block:: csharp
 
-    string upper = "I LIKE SALAD FORKS";
-    string lower = upper.ToLower();
+    string text = "Bigrams";
+    string[] bigrams = text.Bigrams(); // ["Bi", "ig", "gr", "ra", "am", "ms"]
 
-There are a few differences, though:
+Strings are immutable in .NET, so all methods that manipulate a string don't
+modify the original string and return a newly created string with the
+modifications applied. To avoid creating multiple string allocations consider
+using a `StringBuilder`_.
 
-* ``erase``: Strings are immutable in C#, so we cannot modify the string
-  passed to the extension method. For this reason, ``Erase`` was added as an
-  extension method of ``StringBuilder`` instead of string.
-  Alternatively, you can use ``string.Remove``.
-* ``IsSubsequenceOf``/``IsSubsequenceOfi``: An additional method is provided,
-  which is an overload of ``IsSubsequenceOf``, allowing you to explicitly specify
-  case sensitivity:
+List of Godot's String methods and their equivalent in C#:
 
-.. code-block:: csharp
-
-  str.IsSubsequenceOf("ok"); // Case sensitive
-  str.IsSubsequenceOf("ok", true); // Case sensitive
-  str.IsSubsequenceOfi("ok"); // Case insensitive
-  str.IsSubsequenceOf("ok", false); // Case insensitive
-
-* ``Match``/``Matchn``/``ExprMatch``: An additional method is provided besides
-  ``Match`` and ``Matchn``, which allows you to explicitly specify case sensitivity:
-
-.. code-block:: csharp
-
-  str.Match("*.txt"); // Case sensitive
-  str.ExprMatch("*.txt", true); // Case sensitive
-  str.Matchn("*.txt"); // Case insensitive
-  str.ExprMatch("*.txt", false); // Case insensitive
+=======================  ==============================================================
+GDScript                 C#
+=======================  ==============================================================
+begins_with              `string.StartsWith`_
+bigrams                  StringExtensions.Bigrams
+bin_to_int               StringExtensions.BinToInt
+c_escape                 StringExtensions.CEscape
+c_unescape               StringExtensions.CUnescape
+capitalize               StringExtensions.Capitalize
+casecmp_to               StringExtensions.CasecmpTo or StringExtensions.CompareTo (Consider using `string.Equals`_ or `string.Compare`_)
+chr                      N/A
+contains                 `string.Contains`_
+count                    StringExtensions.Count (Consider using `RegEx`_)
+countn                   StringExtensions.CountN (Consider using `RegEx`_)
+dedent                   StringExtensions.Dedent
+ends_with                `string.EndsWith`_
+find                     StringExtensions.Find (Consider using `string.IndexOf`_ or `string.IndexOfAny`_)
+findn                    StringExtensions.FindN (Consider using `string.IndexOf`_ or `string.IndexOfAny`_)
+format                   Use `$ string interpolation`_
+get_base_dir             StringExtensions.GetBaseDir
+get_basename             StringExtensions.GetBaseName
+get_extension            StringExtensions.GetExtension
+get_file                 StringExtensions.GetFile
+get_slice                N/A
+get_slice_count          N/A
+get_slicec               N/A
+hash                     StringExtensions.Hash (Consider using `object.GetHashCode`_ unless you need to guarantee the same behavior as in GDScript)
+hex_to_int               StringExtensions.HexToInt (Consider using `int.Parse`_ or `long.Parse`_ with `System.Globalization.NumberStyles.HexNumber`_)
+humanize_size            N/A
+indent                   StringExtensions.Indent
+insert                   `string.Insert`_ (Consider using `StringBuilder`_ to manipulate strings)
+is_absolute_path         StringExtensions.IsAbsolutePath
+is_empty                 `string.IsNullOrEmpty`_ or `string.IsNullOrWhiteSpace`_
+is_relative_path         StringExtensions.IsRelativePath
+is_subsequence_of        StringExtensions.IsSubsequenceOf
+is_subsequence_ofn       StringExtensions.IsSubsequenceOfN
+is_valid_filename        StringExtensions.IsValidFileName
+is_valid_float           StringExtensions.IsValidFloat (Consider using `float.TryParse`_ or `double.TryParse`_)
+is_valid_hex_number      StringExtensions.IsValidHexNumber
+is_valid_html_color      StringExtensions.IsValidHtmlColor
+is_valid_identifier      StringExtensions.IsValidIdentifier
+is_valid_int             StringExtensions.IsValidInt (Consider using `int.TryParse`_ or `long.TryParse`_)
+is_valid_ip_address      StringExtensions.IsValidIPAddress
+join                     `string.Join`_
+json_escape              StringExtensions.JSONEscape
+left                     StringExtensions.Left (Consider using `string.Substring`_ or `string.AsSpan`_)
+length                   `string.Length`_
+lpad                     `string.PadLeft`_
+lstrip                   `string.TrimStart`_
+match                    StringExtensions.Match (Consider using `RegEx`_)
+matchn                   StringExtensions.MatchN (Consider using `RegEx`_)
+md5_buffer               StringExtensions.MD5Buffer (Consider using `System.Security.Cryptography.MD5.HashData`_)
+md5_text                 StringExtensions.MD5Text (Consider using `System.Security.Cryptography.MD5.HashData`_ with StringExtensions.HexEncode)
+naturalnocasecmp_to      N/A (Consider using `string.Equals`_ or `string.Compare`_)
+nocasecmp_to             StringExtensions.NocasecmpTo or StringExtensions.CompareTo (Consider using `string.Equals`_ or `string.Compare`_)
+num                      `float.ToString`_ or `double.ToString`_
+num_int64                `int.ToString`_ or `long.ToString`_
+num_scientific           `float.ToString`_ or `double.ToString`_
+num_uint64               `uint.ToString`_ or `ulong.ToString`_
+pad_decimals             StringExtensions.PadDecimals
+pad_zeros                StringExtensions.PadZeros
+path_join                StringExtensions.PathJoin
+repeat                   Use `string constructor`_ or a `StringBuilder`_
+replace                  `string.Replace`_ or `RegEx`_
+replacen                 StringExtensions.ReplaceN (Consider using `string.Replace`_ or `RegEx`_)
+rfind                    StringExtensions.RFind (Consider using `string.LastIndexOf`_ or `string.LastIndexOfAny`_)
+rfindn                   StringExtensions.RFindN (Consider using `string.LastIndexOf`_ or `string.LastIndexOfAny`_)
+right                    StringExtensions.Right (Consider using `string.Substring`_ or `string.AsSpan`_)
+rpad                     `string.PadRight`_
+rsplit                   N/A
+rstrip                   `string.TrimEnd`_
+sha1_buffer              StringExtensions.SHA1Buffer (Consider using `System.Security.Cryptography.SHA1.HashData`_)
+sha1_text                StringExtensions.SHA1Text (Consider using `System.Security.Cryptography.SHA1.HashData`_ with StringExtensions.HexEncode)
+sha256_buffer            StringExtensions.SHA256Buffer (Consider using `System.Security.Cryptography.SHA256.HashData`_)
+sha256_text              StringExtensions.SHA256Text (Consider using `System.Security.Cryptography.SHA256.HashData`_ with StringExtensions.HexEncode)
+similarity               StringExtensions.Similarity
+simplify_path            StringExtensions.SimplifyPath
+split                    StringExtensions.Split (Consider using `string.Split`_)
+split_floats             StringExtensions.SplitFloat
+strip_edges              StringExtensions.StripEdges (Consider using `string.Trim`_, `string.TrimStart`_ or `string.TrimEnd`_)
+strip_escapes            StringExtensions.StripEscapes
+substr                   StringExtensions.Substr (Consider using `string.Substring`_ or `string.AsSpan`_)
+to_ascii_buffer          StringExtensions.ToASCIIBuffer (Consider using `System.Text.Encoding.ASCII.GetBytes`_)
+to_camel_case            StringExtensions.ToCamelCase
+to_float                 StringExtensions.ToFloat (Consider using `float.TryParse`_ or `double.TryParse`_)
+to_int                   StringExtensions.ToInt (Consider using `int.TryParse`_ or `long.TryParse`_)
+to_lower                 `string.ToLower`_
+to_pascal_case           StringExtensions.ToPascalCase
+to_snake_case            StringExtensions.ToSnakeCase
+to_upper                 `string.ToUpper`_
+to_utf16_buffer          StringExtensions.ToUTF16Buffer (Consider using `System.Text.Encoding.UTF16.GetBytes`_)
+to_utf32_buffer          StringExtensions.ToUTF32Buffer (Consider using `System.Text.Encoding.UTF32.GetBytes`_)
+to_utf8_buffer           StringExtensions.ToUTF8Buffer (Consider using `System.Text.Encoding.UTF8.GetBytes`_)
+trim_prefix              StringExtensions.TrimPrefix
+trim_suffix              StringExtensions.TrimSuffix
+unicode_at               `string[int]`_ indexer
+uri_decode               StringExtensions.URIDecode (Consider using `System.Uri.UnescapeDataString`_)
+uri_encode               StringExtensions.URIEncode (Consider using `System.Uri.EscapeDataString`_)
+validate_node_name       StringExtensions.ValidateNodeName
+xml_escape               StringExtensions.XMLEscape
+xml_unescape             StringExtensions.XMLUnescape
+=======================  ==============================================================
+
+List of Godot's PackedByteArray methods that create a String and their C# equivalent:
+
+=========================  ==============================================================
+GDScript                   C#
+=========================  ==============================================================
+get_string_from_ascii      StringExtensions.GetStringFromASCII (Consider using `System.Text.Encoding.ASCII.GetString`_)
+get_string_from_utf16      StringExtensions.GetStringFromUTF16 (Consider using `System.Text.Encoding.UTF16.GetString`_)
+get_string_from_utf32      StringExtensions.GetStringFromUTF32 (Consider using `System.Text.Encoding.UTF32.GetString`_)
+get_string_from_utf8       StringExtensions.GetStringFromUTF8 (Consider using `System.Text.Encoding.UTF8.GetString`_)
+hex_encode                 StringExtensions.HexEncode (Consider using `System.Convert.ToHexString`_)
+=========================  ==============================================================
+
+* .NET contains many path utility methods available under the
+  `System.IO.Path`_
+  class that can be used when not dealing with Godot paths (paths that start
+  with ``res://`` or ``user://``)
+
+.. _$ string interpolation: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
+.. _double.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.double.tostring
+.. _double.TryParse: https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse
+.. _float.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.single.tostring
+.. _float.TryParse: https://learn.microsoft.com/en-us/dotnet/api/system.single.tryparse
+.. _int.Parse: https://learn.microsoft.com/en-us/dotnet/api/system.int32.parse
+.. _int.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.int32.tostring
+.. _int.TryParse: https://learn.microsoft.com/en-us/dotnet/api/system.int32.tryparse
+.. _long.Parse: https://learn.microsoft.com/en-us/dotnet/api/system.int64.parse
+.. _long.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.int64.tostring
+.. _long.TryParse: https://learn.microsoft.com/en-us/dotnet/api/system.int64.tryparse
+.. _uint.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.uint32.tostring
+.. _ulong.ToString: https://learn.microsoft.com/en-us/dotnet/api/system.uint64.tostring
+.. _object.GetHashCode: https://learn.microsoft.com/en-us/dotnet/api/system.object.gethashcode
+.. _RegEx: https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions
+.. _string constructor: https://learn.microsoft.com/en-us/dotnet/api/system.string.-ctor
+.. _string[int]: https://learn.microsoft.com/en-us/dotnet/api/system.string.chars
+.. _string.AsSpan: https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.asspan
+.. _string.Compare: https://learn.microsoft.com/en-us/dotnet/api/system.string.compare
+.. _string.Contains: https://learn.microsoft.com/en-us/dotnet/api/system.string.contains
+.. _string.EndsWith: https://learn.microsoft.com/en-us/dotnet/api/system.string.endswith
+.. _string.Equals: https://learn.microsoft.com/en-us/dotnet/api/system.string.equals
+.. _string.IndexOf: https://learn.microsoft.com/en-us/dotnet/api/system.string.indexof
+.. _string.IndexOfAny: https://learn.microsoft.com/en-us/dotnet/api/system.string.indexofany
+.. _string.Insert: https://learn.microsoft.com/en-us/dotnet/api/system.string.insert
+.. _string.IsNullOrEmpty: https://learn.microsoft.com/en-us/dotnet/api/system.string.isnullorempty
+.. _string.IsNullOrWhiteSpace: https://learn.microsoft.com/en-us/dotnet/api/system.string.isnullorwhitespace
+.. _string.Join: https://learn.microsoft.com/en-us/dotnet/api/system.string.join
+.. _string.LastIndexOf: https://learn.microsoft.com/en-us/dotnet/api/system.string.lastindexof
+.. _string.LastIndexOfAny: https://learn.microsoft.com/en-us/dotnet/api/system.string.lastindexofany
+.. _string.Length: https://learn.microsoft.com/en-us/dotnet/api/system.string.length
+.. _string.PadLeft: https://learn.microsoft.com/en-us/dotnet/api/system.string.padleft
+.. _string.PadRight: https://learn.microsoft.com/en-us/dotnet/api/system.string.padright
+.. _string.Replace: https://learn.microsoft.com/en-us/dotnet/api/system.string.replace
+.. _string.Split: https://learn.microsoft.com/en-us/dotnet/api/system.string.split
+.. _string.StartsWith: https://learn.microsoft.com/en-us/dotnet/api/system.string.startswith
+.. _string.Substring: https://learn.microsoft.com/en-us/dotnet/api/system.string.substring
+.. _string.Trim: https://learn.microsoft.com/en-us/dotnet/api/system.string.trim
+.. _string.TrimEnd: https://learn.microsoft.com/en-us/dotnet/api/system.string.trimend
+.. _string.TrimStart: https://learn.microsoft.com/en-us/dotnet/api/system.string.trimstart
+.. _string.ToLower: https://learn.microsoft.com/en-us/dotnet/api/system.string.tolower
+.. _string.ToUpper: https://learn.microsoft.com/en-us/dotnet/api/system.string.toupper
+.. _StringBuilder: https://learn.microsoft.com/en-us/dotnet/api/system.text.stringbuilder
+.. _System.Convert.ToHexString: https://learn.microsoft.com/en-us/dotnet/api/system.convert.tohexstring
+.. _System.Globalization.NumberStyles.HexNumber: https://learn.microsoft.com/en-us/dotnet/api/system.globalization.numberstyles#system-globalization-numberstyles-hexnumber
+.. _System.IO.Path: https://learn.microsoft.com/en-us/dotnet/api/system.io.path
+.. _System.Security.Cryptography.MD5.HashData: https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5.hashdata
+.. _System.Security.Cryptography.SHA1.HashData: https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.sha1.hashdata
+.. _System.Security.Cryptography.SHA256.HashData: https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.sha256.hashdata
+.. _System.Text.Encoding.ASCII.GetBytes: https://learn.microsoft.com/en-us/dotnet/api/system.text.asciiencoding.getbytes
+.. _System.Text.Encoding.ASCII.GetString: https://learn.microsoft.com/en-us/dotnet/api/system.text.asciiencoding.getstring
+.. _System.Text.Encoding.UTF16.GetBytes: https://learn.microsoft.com/en-us/dotnet/api/system.text.unicodeencoding.getbytes
+.. _System.Text.Encoding.UTF16.GetString: https://learn.microsoft.com/en-us/dotnet/api/system.text.unicodeencoding.getstring
+.. _System.Text.Encoding.UTF32.GetBytes: https://learn.microsoft.com/en-us/dotnet/api/system.text.utf32encoding.getbytes
+.. _System.Text.Encoding.UTF32.GetString: https://learn.microsoft.com/en-us/dotnet/api/system.text.utf32encoding.getstring
+.. _System.Text.Encoding.UTF8.GetBytes: https://learn.microsoft.com/en-us/dotnet/api/system.text.utf8encoding.getbytes
+.. _System.Text.Encoding.UTF8.GetString: https://learn.microsoft.com/en-us/dotnet/api/system.text.utf8encoding.getstring
+.. _System.Uri.EscapeDataString: https://learn.microsoft.com/en-us/dotnet/api/system.uri.escapedatastring
+.. _System.Uri.UnescapeDataString: https://learn.microsoft.com/en-us/dotnet/api/system.uri.unescapedatastring
 
 Basis
 -----