Home > Mobile >  Set returned value from method as public string in C#
Set returned value from method as public string in C#

Time:04-18

I need to get string from one class to another class, It is possible to set public string from method I mean like in this code:

class test
{
        static void Main(string[] args)
        {
            load();
        }

        public class Data
        {
            public string datacollected { get; set; }
        }

        public static void load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            Data datacfg = new Data();

            var datanew = System.Text.Json.JsonSerializer.Deserialize<List<Data>>(jsonString);
            datacfg = datanew.First();
        }

        public string datacollected = datacfg.datacollected;


}

i want to use string datacollected in another class and in another public void

CodePudding user response:

The datacollected member that is directly in the test class is not a property. It's a field. Fields that have an assignment on the same statement as the declaration are evaluated before* the class's constructor (ie: before the Main method runs).

You probably want it to be a property instead, which is evaluated each time you access the member. The simplest method to fix that is by adding a > after the equals.

public string datacollected => datacfg.datacollected;

You've got two other problems though.

  1. datacollected (in the test class) isn't static. All of your methods are static, and therefor wouldn't be able to access the non-static member.
  2. You've still got the problem where the datacfg is a local variable that is defined inside the load method. You can't use variables outside their defined scope.

Option 1: you only need the parsed file data in the method that called load.

Change load to return the parsed data, rather than save it to a class-global variable.

using System.Text.Json;
static class test
{
        static void Main(string[] args)
        {
            Data loadedData = load();
        }

        public static Data load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            return JsonSerializer.Deserialize<List<Data>>(jsonString).First();
        }
}

public class Data
{
    public string datacollected { get; set; }
}

Option 2: If you really need some global variable, put the whole Data object up to a field instead. This doesn't use a property - there's really no advantage in this case.

using System.Text.Json;
static class test
{
        // assuming you're using nullable reference types (the "?")
        private static Data? loadedData;

        static void Main(string[] args)
        {
            load();
            Console.WriteLine(loadedData!.datacollected);
            // "!" to tell compiler that you know loadedData 
            // shouldn't be null when executed
        }

        public static void load()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);
            loadedData = JsonSerializer.Deserialize<List<Data>>(jsonString).First();
        }
}

public class Data
{
    public string datacollected { get; set; }
}

I'd go with Option 1 if at all possible.


* I don't remember if it's before, during, or after.

CodePudding user response:

You can declare a class like this

    public class UseData
    {
        private List<Data> _data=null;

        public string datacollected
        {
            get
            {
                if (_data == null)
                    LoadData();
                return _data.First().datacollected;
            }
        }

        private void LoadData()
        {
            string fileName = "samplefile.json";
            string jsonString = File.ReadAllText(fileName);

            _data = System.Text.Json.JsonSerializer.Deserialize<List<Data>>(jsonString);
        }
    }

which have a private list of data and it loads from your json file at first time you called. Next time you call it, as the private _data object is filled, it wont load again and the datacollected property returns the first data object's datacollected string property.

  • Related