.. _doc_c_sharp_differences: API differences to GDScript =========================== This is a (incomplete) list of API differences between C# and GDScript. General Differences ------------------- As explained in the :ref:`doc_c_sharp`, C# generally uses ``PascalCase`` instead of the ``snake_case`` in GDScript and C++. Global Scope ------------ Available under ``Godot.GD``. Some things were moved to their own classes, like Math and Random. See below. Global functions like ``print``, ``var2str`` and ``weakref`` are located under ``GD`` in C#. ``ERR_*`` constants were moved to ``Godot.Error``. Math ---- Math functions like ``abs``, ``acos``, ``asin``, ``atan`` and ``atan2`` are located under ``Mathf`` instead of in global scope. ``PI`` is ``Mathf.PI`` Random ------ Random functions like ``rand_range`` and ``rand_seed`` are located under ``Random``, so use ``Random.RandRange`` instead of ``rand_range``. Export keyword -------------- Use the ``[Export]`` attribute instead of the GDScript ``export`` keyword. Signal keyword -------------- Use the ``[Signal]`` attribute instead of the GDScript ``signal`` keyword. This attribute should be used on a `delegate`, whose name signature will be used to define the signal. .. code-block:: csharp [Signal] delegate void MySignal(string willSendsAString); See also: :ref:`c_sharp_signals` Singletons ---------- Singletons provide static methods rather than using the singleton pattern in C#. This is to make code less verbose and similar to GDScript. Example: .. code-block:: csharp Input.IsActionPressed("ui_down") String ------ Use ``System.String`` (``string``). All the Godot String methods are provided by the ``StringExtensions`` class as extension methods. Example: .. code-block:: csharp string upper = "I LIKE SALAD FORKS"; string lower = upper.ToLower(); There are a few differences though: * ``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 to explicitly specify case sensitivity: .. 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 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 Basis ----- Structs cannot have parameterless constructors in C#, therefore ``new Basis()`` initializes all primitive members to their default value. Use ``Basis.Identity`` for the equivalent to ``Basis()`` in GDScript and C++. The following methods were converted to properties with their respective names changed: ================ ================================================================== GDScript C# ================ ================================================================== get_scale() Scale ================ ================================================================== Transform2D ----------- Structs cannot have parameterless constructors in C#, therefore ``new Transform2D()`` initializes all primitive members to their default value. Please use ``Transform2D.Identity`` for the equivalent to ``Transform2D()`` in GDScript and C++. The following methods were converted to properties with their respective names changed: ================ ================================================================== GDScript C# ================ ================================================================== get_origin() Origin get_rotation() Rotation get_scale() Scale ================ ================================================================== Plane ----- The following methods were converted to properties with their respective names changed: ================ ================================================================== GDScript C# ================ ================================================================== center() Center ================ ================================================================== Rect2 ----- The following fields were converted to properties with their respective names changed: ================ ================================================================== GDScript C# ================ ================================================================== end End ================ ================================================================== The following methods were converted to properties with their respective names changed: ================ ================================================================== GDScript C# ================ ================================================================== get_area() Area ================ ================================================================== Quat ---- Structs cannot have parameterless constructors in C#, therefore ``new Quat()`` initializes all primitive members to their default value. Please use ``Quat.Identity`` for the equivalent to ``Quat()`` in GDScript and C++. Array ----- *This is temporary. Array is ref-counted, so it will need its own type that wraps the native side. PoolArrays will also need their own type to be used the way they are meant to.* ================ ================================================================== GDScript C# ================ ================================================================== Array object[] PoolIntArray int[] PoolByteArray byte[] PoolFloatArray float[] PoolStringArray String[] PoolColorArray Color[] PoolVector2Array Vector2[] PoolVector3Array Vector3[] ================ ================================================================== In some exceptional cases a raw array (``type[]``) may be required instead of a ``List``. Dictionary ---------- *This is temporary. Array is ref-counted, so it will need its own type that wraps the native side.* Use ``Dictionary``. Variant ------- ``System.Object`` (``object``) is used in place of ``Variant``. Communicating with other scripting languages -------------------------------------------- The methods ``object Object.call(string method, params object[] args)``, ``object Object.get(string field)`` and ``object Object.set(string field, object value)`` are provided to communicate with instances of other scripting languages via the Variant API. Other differences ----------------- ``preload``, ``assert`` and ``yield`` as they work in GDScript are currently not available in C#. Other differences: ================ ================================================================== GDScript C# ================ ================================================================== Color8 Color.Color8 is_inf float.IsInfinity is_nan float.IsNaN dict2inst ? TODO inst2dict ? TODO load GD.load which is the same as ResourceLoader.load ================ ==================================================================