Search code examples
c#.netconstructorpass-by-referenceref

Unassigned ref value in the constructor


I want to assign output values on Data class after create object with ref constructor to State class in this code. How can I solve this?

class Program
{
    static void Main(string[] args)
    {
        Data data = new Data();
        State stateA = new State("A", ref data.outputA);
        State stateB = new State("B", ref data.outputB);
        stateA.output = 10;
        stateB.output = 8;
        Console.WriteLine(data.outputA); //10
        Console.WriteLine(data.outputB); //8
        Console.ReadLine();
    }
}
public class Data
{
    public int outputA;
    public int outputB;
}
public class State
{
    public string name;
    public ref int address;
        
    public State(string _name, ref int _output)
    {
        this.name = _name;
        address = _output;
    }
}

Solution

  • In c# the ref keyword is far from the concept of a C-like pointer. This is the closest thing you can do in that direction (using safe code):

    class Program
    {
         static void Main(string[] args)
        {
            Data data = new Data();
            State stateA = new State("A", value => data.outputA = value, () => data.outputA);
            State stateB = new State("B", value => data.outputB = value, () => data.outputB);
            stateA.Output = 10;
            stateB.Output = 8;
            Console.WriteLine(data.outputA); //10
            Console.WriteLine(data.outputB); //8
            Console.ReadLine();
        }
    }
    
    
    public class Data
    {
        public int outputA;
        public int outputB;
    }
    public class State
    {
        public string name;
        private Action<int> _outputSetter;
        private Func<int> _outputGetter;
    
        public State(string _name, Action<int> _outputSetter, Func<int> _outputGetter)
        {
            this.name = _name;
            this._outputSetter = _outputSetter;
            this._outputGetter = _outputGetter;
        }
    
    
        public int Output
        {
            get => _outputGetter();
            set => _outputSetter(value);
        }
    }