c_sharp_differences.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. .. _doc_c_sharp_differences:
  2. API differences to GDScript
  3. ===========================
  4. This is a (incomplete) list of API differences between C# and GDScript.
  5. General differences
  6. -------------------
  7. As explained in the :ref:`doc_c_sharp`, C# generally uses ``PascalCase`` instead
  8. of the ``snake_case`` used in GDScript and C++.
  9. Global scope
  10. ------------
  11. Global functions and some constants had to be moved to classes, since C#
  12. does not allow declaring them in namespaces.
  13. Most global constants were moved to their own enums.
  14. Constants
  15. ^^^^^^^^^
  16. Global constants were moved to their own enums.
  17. For example, ``ERR_*`` constants were moved to the ``Error`` enum.
  18. Special cases:
  19. ======================= ===========================================================
  20. GDScript C#
  21. ======================= ===========================================================
  22. ``SPKEY`` ``GD.SpKey``
  23. ``TYPE_*`` ``Variant.Type`` enum
  24. ``OP_*`` ``Variant.Operator`` enum
  25. ======================= ===========================================================
  26. Math functions
  27. ^^^^^^^^^^^^^^
  28. Math global functions, like ``abs``, ``acos``, ``asin``, ``atan`` and ``atan2``, are
  29. located under ``Mathf`` as ``Abs``, ``Acos``, ``Asin``, ``Atan`` and ``Atan2``.
  30. The ``PI`` constant can be found as ``Mathf.Pi``.
  31. Random functions
  32. ^^^^^^^^^^^^^^^^
  33. Random global functions, like ``rand_range`` and ``rand_seed``, are located under ``GD``.
  34. Example: ``GD.RandRange`` and ``GD.RandSeed``.
  35. Other functions
  36. ^^^^^^^^^^^^^^^
  37. Many other global functions like ``print`` and ``var2str`` are located under ``GD``.
  38. Example: ``GD.Print`` and ``GD.Var2Str``.
  39. Exceptions:
  40. =========================== =======================================================
  41. GDScript C#
  42. =========================== =======================================================
  43. ``weakref(obj)`` ``Object.WeakRef(obj)``
  44. ``is_instance_valid(obj)`` ``Object.IsInstanceValid(obj)``
  45. =========================== =======================================================
  46. Tips
  47. ^^^^
  48. Sometimes it can be useful to use the ``using static`` directive. This directive allows
  49. to access the members and nested types of a class without specifying the class name.
  50. Example:
  51. .. code-block:: csharp
  52. using static Godot.GD;
  53. public class Test
  54. {
  55. static Test()
  56. {
  57. Print("Hello"); // Instead of GD.Print("Hello");
  58. }
  59. }
  60. Export keyword
  61. --------------
  62. Use the ``[Export]`` attribute instead of the GDScript ``export`` keyword.
  63. Example:
  64. .. code-block:: csharp
  65. using Godot;
  66. public class MyNode : Node
  67. {
  68. [Export]
  69. NodePath _nodePath;
  70. }
  71. Signal keyword
  72. --------------
  73. Use the ``[Signal]`` attribute to declare a signal instead of the GDScript ``signal`` keyword.
  74. This attribute should be used on a `delegate`, whose name signature will be used to define the signal.
  75. .. code-block:: csharp
  76. [Signal]
  77. delegate void MySignal(string willSendsAString);
  78. See also: :ref:`c_sharp_signals`
  79. Singletons
  80. ----------
  81. Singletons are available as static classes rather than using the singleton pattern.
  82. This is to make code less verbose than it would be with an ``Instance`` property.
  83. Example:
  84. .. code-block:: csharp
  85. Input.IsActionPressed("ui_down")
  86. However, in some very rare cases this is not enough. For example, you may want
  87. to access a member from the base class ``Godot.Object``, like ``Connect``.
  88. For such use cases we provide a static property named ``Singleton`` that returns
  89. the singleton instance. The type of this instance is ``Godot.Object``.
  90. Example:
  91. .. code-block:: csharp
  92. Input.Singleton.Connect("joy_connection_changed", this, nameof(Input_JoyConnectionChanged));
  93. String
  94. ------
  95. Use ``System.String`` (``string``). Most of Godot's String methods are
  96. provided by the ``StringExtensions`` class as extension methods.
  97. Example:
  98. .. code-block:: csharp
  99. string upper = "I LIKE SALAD FORKS";
  100. string lower = upper.ToLower();
  101. There are a few differences, though:
  102. * ``erase``: Strings are immutable in C#, so we cannot modify the string
  103. passed to the extension method. For this reason, ``Erase`` was added as an
  104. extension method of ``StringBuilder`` instead of string.
  105. Alternatively, you can use ``string.Remove``.
  106. * ``IsSubsequenceOf``/``IsSubsequenceOfi``: An additional method is provided,
  107. which is an overload of ``IsSubsequenceOf``, allowing you to explicitly specify
  108. case sensitivity:
  109. .. code-block:: csharp
  110. str.IsSubsequenceOf("ok"); // Case sensitive
  111. str.IsSubsequenceOf("ok", true); // Case sensitive
  112. str.IsSubsequenceOfi("ok"); // Case insensitive
  113. str.IsSubsequenceOf("ok", false); // Case insensitive
  114. * ``Match``/``Matchn``/``ExprMatch``: An additional method is provided besides
  115. ``Match`` and ``Matchn``, which allows you to explicitly specify case sensitivity:
  116. .. code-block:: csharp
  117. str.Match("*.txt"); // Case sensitive
  118. str.ExprMatch("*.txt", true); // Case sensitive
  119. str.Matchn("*.txt"); // Case insensitive
  120. str.ExprMatch("*.txt", false); // Case insensitive
  121. Basis
  122. -----
  123. Structs cannot have parameterless constructors in C#. Therefore, ``new Basis()``
  124. initializes all primitive members to their default value. Use ``Basis.Identity``
  125. for the equivalent of ``Basis()`` in GDScript and C++.
  126. The following method was converted to a property with a different name:
  127. ==================== ==============================================================
  128. GDScript C#
  129. ==================== ==============================================================
  130. ``get_scale()`` ``Scale``
  131. ==================== ==============================================================
  132. Transform2D
  133. -----------
  134. Structs cannot have parameterless constructors in C#. Therefore, ``new Transform2D()``
  135. initializes all primitive members to their default value.
  136. Please use ``Transform2D.Identity`` for the equivalent of ``Transform2D()`` in GDScript and C++.
  137. The following methods were converted to properties with their respective names changed:
  138. ==================== ==============================================================
  139. GDScript C#
  140. ==================== ==============================================================
  141. ``get_rotation()`` ``Rotation``
  142. ``get_scale()`` ``Scale``
  143. ==================== ==============================================================
  144. Plane
  145. -----
  146. The following method was converted to a property with a *slightly* different name:
  147. ================ ==================================================================
  148. GDScript C#
  149. ================ ==================================================================
  150. ``center()`` ``Center``
  151. ================ ==================================================================
  152. Rect2
  153. -----
  154. The following field was converted to a property with a *slightly* different name:
  155. ================ ==================================================================
  156. GDScript C#
  157. ================ ==================================================================
  158. ``end`` ``End``
  159. ================ ==================================================================
  160. The following method was converted to a property with a different name:
  161. ================ ==================================================================
  162. GDScript C#
  163. ================ ==================================================================
  164. ``get_area()`` ``Area``
  165. ================ ==================================================================
  166. Quat
  167. ----
  168. Structs cannot have parameterless constructors in C#. Therefore, ``new Quat()``
  169. initializes all primitive members to their default value.
  170. Please use ``Quat.Identity`` for the equivalent of ``Quat()`` in GDScript and C++.
  171. The following methods were converted to a property with a different name:
  172. ===================== =============================================================
  173. GDScript C#
  174. ===================== =============================================================
  175. ``length()`` ``Length``
  176. ``length_squared()`` ``LengthSquared``
  177. ===================== =============================================================
  178. Array
  179. -----
  180. *This is temporary. PoolArrays will need their own types to be used the way they are meant to.*
  181. ===================== ==============================================================
  182. GDScript C#
  183. ===================== ==============================================================
  184. ``Array`` ``Godot.Collections.Array``
  185. ``PoolIntArray`` ``int[]``
  186. ``PoolByteArray`` ``byte[]``
  187. ``PoolFloatArray`` ``float[]``
  188. ``PoolStringArray`` ``String[]``
  189. ``PoolColorArray`` ``Color[]``
  190. ``PoolVector2Array`` ``Vector2[]``
  191. ``PoolVector3Array`` ``Vector3[]``
  192. ===================== ==============================================================
  193. ``Godot.Collections.Array<T>`` is a type-safe wrapper around ``Godot.Collections.Array``.
  194. Use the ``Godot.Collections.Array<T>(Godot.Collections.Array)`` constructor to create one.
  195. Dictionary
  196. ----------
  197. Use ``Godot.Collections.Dictionary``.
  198. ``Godot.Collections.Dictionary<T>`` is a type-safe wrapper around ``Godot.Collections.Dictionary``.
  199. Use the ``Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary)`` constructor to create one.
  200. Variant
  201. -------
  202. ``System.Object`` (``object``) is used instead of ``Variant``.
  203. Communicating with other scripting languages
  204. --------------------------------------------
  205. The methods ``object Object.Call(string method, params object[] args)``,
  206. ``object Object.Get(string field)`` and ``object Object.Set(string field, object value)``
  207. are provided to communicate with instances of other
  208. scripting languages via the Variant API.
  209. Yield
  210. -----
  211. Something similar to GDScript's ``yield`` with a single parameter can be achieved with
  212. C#'s `yield keyword <https://docs.microsoft.com/en-US/dotnet/csharp/language-reference/keywords/yield>`_.
  213. The equivalent of yield on signal can be achieved with async/await and ``Godot.Object.ToSignal``.
  214. Example:
  215. .. code-block:: csharp
  216. await ToSignal(timer, "timeout");
  217. GD.Print("After timeout");
  218. Other differences
  219. -----------------
  220. ``preload``, as it works in GDScript, is not available in C#.
  221. Use ``GD.Load`` or ``ResourceLoader.Load`` instead.
  222. Other differences:
  223. ================ ==================================================================
  224. GDScript C#
  225. ================ ==================================================================
  226. ``Color8`` ``Color.Color8``
  227. ``is_inf`` ``float.IsInfinity``
  228. ``is_nan`` ``float.IsNaN``
  229. ``dict2inst`` TODO
  230. ``inst2dict`` TODO
  231. ================ ==================================================================