.. _doc_c_sharp_signals: C# signals ========== For a detailed explanation of signals in general, see the :ref:`doc_signals` section in the step by step tutorial. Signals are implemented using C# events, the idiomatic way to represent :ref:`the observer pattern` in C#. This is the recommended way to use signals in C# and the focus of this page. In some cases it's necessary to use the older :ref:`Connect()` and :ref:`Disconnect()` APIs. See :ref:`using_connect_and_disconnect` for more details. If you encounter a ``System.ObjectDisposedException`` while handling a signal, you might be missing a signal disconnection. See :ref:`disconnecting_automatically_when_the_receiver_is_freed` for more details. Signals as C# events -------------------- To provide more type-safety, Godot signals are also all available through `events `_. You can handle these events, as any other event, with the ``+=`` and ``-=`` operators. .. code-block:: csharp Timer myTimer = GetNode("Timer"); myTimer.Timeout += () => GD.Print("Timeout!"); In addition, you can always access signal names associated with a node type through its nested ``SignalName`` class. This is useful when, for example, you want to await on a signal (see :ref:`doc_c_sharp_differences_await`). .. code-block:: csharp await ToSignal(GetTree(), SceneTree.SignalName.ProcessFrame); Custom signals as C# events --------------------------- To declare a custom event in your C# script, use the ``[Signal]`` attribute on a public delegate type. Note that the name of this delegate needs to end with ``EventHandler``. .. code-block:: csharp [Signal] public delegate void MySignalEventHandler(); [Signal] public delegate void MySignalWithArgumentEventHandler(string myString); Once this is done, Godot will create the appropriate events automatically behind the scenes. You can then use said events as you'd do for any other Godot signal. Note that events are named using your delegate's name minus the final ``EventHandler`` part. .. code-block:: csharp public override void _Ready() { MySignal += () => GD.Print("Hello!"); MySignalWithArgument += SayHelloTo; } private void SayHelloTo(string name) { GD.Print($"Hello {name}!"); } .. warning:: If you want to connect to these signals in the editor, you will need to (re)build the project to see them appear. You can click the **Build** button in the upper-right corner of the editor to do so. Signal emission --------------- To emit signals, use the ``EmitSignal`` method. Note that, as for signals defined by the engine, your custom signal names are listed under the nested ``SignalName`` class. .. code-block:: csharp public void MyMethodEmittingSignals() { EmitSignal(SignalName.MySignal); EmitSignal(SignalName.MySignalWithArgument, "World"); } In contrast with other C# events, you cannot use ``Invoke`` to raise events tied to Godot signals. Signals support arguments of any :ref:`Variant-compatible type `. Consequently, any ``Node`` or ``RefCounted`` will be compatible automatically, but custom data objects will need to inherit from ``GodotObject`` or one of its subclasses. .. code-block:: csharp using Godot; public partial class DataObject : GodotObject { public string MyFirstString { get; set; } public string MySecondString { get; set; } } Bound values ------------ Sometimes you'll want to bind values to a signal when the connection is established, rather than (or in addition to) when the signal is emitted. To do so, you can use an anonymous function like in the following example. Here, the :ref:`Button.Pressed ` signal does not take any argument. But we want to use the same ``ModifyValue`` for both the "plus" and "minus" buttons. So we bind the modifier value at the time we're connecting the signals. .. code-block:: csharp public int Value { get; private set; } = 1; public override void _Ready() { Button plusButton = GetNode