获取值指针并在其他地方使用它

时间:2019-05-08 20:54:55

标签: c#

首先,我是C ++开发人员,并且是C#的新手,对不起这个简单的问题。 我正在为本机库创建包装器。

我想在一个类中传递一个值,然后从类中的其他函数(如C ++中的指针)对其进行编辑,我发现它可以在不安全的模式下完成,但是我需要在不安全的情况下进行操作,我敢肯定有可能。

这是我的代码:

主控制台

namespace ConsoleApp2
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string DATA_VALUE = "Not Set Yet";
            new Data_Picker_Form(DATA_VALUE).ShowDialog();

            Console.WriteLine("Value is {0}", DATA_VALUE);

            Console.ReadKey();
        }
    }
}

表格代码

using System;
using System.Windows.Forms;

namespace ConsoleApp2
{
    public partial class Data_Picker_Form : Form
    {
        object data_in_obj;

        public Data_Picker_Form(string data_in)
        {
            InitializeComponent();
            data_in_obj = data_in;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string data_in_new = data_in_obj as string;
            data_in_new = "OUTPUT_VALUE";
            this.Close();
        }
    }
}

不幸的是,它不能正常工作,因此我需要将我的string,int等值传递给新表单,在初始化表单时会创建一个指向原始字符串的实例[如指针],并且可以从其他函数(如按钮)访问ins类点击。

谢谢。

3 个答案:

答案 0 :(得分:2)

只需创建一个类或结构,它就可以容纳您需要的所有数据。

示例(控制台):

using System;
namespace ConsoleApp2
{

    public class data_to_pass //// Don't forget to use 'public'
    {
        //// Put your values here
        public int a_int_value { get; set; }
        public string a_string_value { get; set; }
        public bool a_boolean_value { get; set; }
    }

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            //// Create your values
            data_to_pass new_data = new data_to_pass()
            {
                a_int_value = 10,
                a_string_value = "Not Set Yet",
                a_boolean_value = true
            };

            new Data_Picker_Form(new_data).ShowDialog();

            Console.WriteLine("Value is {0} , String is {1} , Bool is {2}",
             new_data.a_int_value, new_data.a_string_value, new_data.a_boolean_value);

            Console.ReadKey();
        }
    }
}

示例(表格):

using System.Windows.Forms;

namespace ConsoleApp2
{
    public partial class Data_Picker_Form : Form
    {
        data_to_pass data_in_obj;

        public Data_Picker_Form(data_to_pass data_in)
        {
            InitializeComponent();
            data_in_obj = data_in;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            data_in_obj.a_string_value = "OUTPUT_VALUE";
            data_in_obj.a_int_value = 666;
            data_in_obj.a_boolean_value = false;

            this.Close();
        }
    }
}

输出:

  

值是666,字符串是OUTPUT_VALUE,布尔是False

玩得开心;)

答案 1 :(得分:1)

您已经拥有一个引用(有点像一个指针),这就是您的问题(无论如何,它是其中的一半)。

string data_in_new = data_in_obj as string;

要创建一个变量来保存字符串引用(因为字符串是不可变的引用类型),然后将当前引用data_in_obj复制到该变量。然后,当您重新分配data_in_new时,它当然不会影响任何其他变量(就像在C ++中一样)。

由于字符串是不可变的,因此该代码无法影响指向该字符串的其他事物(通过引用传递,但这与变量/成员有关)。您需要将其存储在简单的结构或类中,以便每个人都指向一个持有当前字符串引用并可以更新的对象。

int的想法相同,它实际上是一个值类型,因此任何副本都将复制实际值,您不能通过它更改其他变量。您需要一个包装器类,以便每个用户都指向同一对象。

答案 2 :(得分:1)

既然已经在初始化表单,那么如何设置一个简单的get and set函数呢?

您的表单:

    private string data_in_new = "";

    public Data_Picker_Form(string DATA_VALUE)
   {
     InitializeComponent();
   }

   private void button1_Click(object sender, EventArgs e)
   {
    Data_in_new = "OUTPUT_VALUE";
    Close();
   }

   public string Data_in_new
   {
     get
    {
     return data_in_new;
    }

    set
    {
     data_in_new = value;
    }
   }

在控制台中:

    class Program
   {
     static void Main(string[] args)
    {
     string DATA_VALUE = "Not Set Yet";
     Data_Picker_Form D_P_T = new Data_Picker_Form(DATA_VALUE);

     D_P_T.ShowDialog();
     DATA_VALUE = D_P_T.Data_in_new;

     Console.WriteLine("Value is {0}", DATA_VALUE);

    Console.ReadKey();
   }
  }

通过这种方式,您可以在项目中的任何所需位置获取价值。