当前位置: 代码迷 >> C# >> c#类构造函数中使用ref变量传递有关问题
  详细解决方案

c#类构造函数中使用ref变量传递有关问题

热度:21   发布时间:2016-05-05 03:45:10.0
c#类构造函数中使用ref变量传递问题
在C/C++中可以在类的成员变量中定义一个指针,然后指针指向类的构造函数中的参数,实现类中变量操作外部变量。
但是在c#中不知道怎么实现,请教大家

C/C++示例:
class Test(int * i)
{
int * p;
Test(int * i) //构造函数
{
p=i;
}
Add()
{
*p=999;
}
}
//以上代码意思通过内部变量p就可以控制外部变量i,并且在类的范围内都可以使用p。

而C#
public class Test()
{
public int p;
 public Test(ref int i)
{
p=i; //其实是值传递
}
public Add()
{
p=999; //此时i的值无法改变
}

}

刚接触c#还不熟悉,难道在这里要把p也定义成指针吗?能不能实现ref的顺序传递下去?
我的实际情况是类的构造函数传递的是一个结构体,想在类中不同函数里面操作修改其值。
可用分有限,只能拿出这么多,谢谢!
------解决思路----------------------
你可以传入一个class,这样就可以保证两个是一致的,ref,out什么的都只是在这个方法执行期间有效,出了方法就是各管各的了
------解决思路----------------------
C#引用类型参数,传递的是地址引用
------解决思路----------------------
就是可以~ 你这样写代码也是违反了一个原则的~(看《重构》这本书)
所以还是不要这样干了~亲~
------解决思路----------------------
引用:
Quote: 引用:

你可以传入一个class,这样就可以保证两个是一致的,ref,out什么的都只是在这个方法执行期间有效,出了方法就是各管各的了

1楼说的是个方法,但是如果就为了一个变量再去传入一个class岂不是很麻烦。
有没有其他什么好的办法。将传入的变量定义成类的静态变量?
但是我总觉得C#应该有更好的办法。

我觉得按你这个需求,所谓更好的办法就是直接把你传入的变量定义成全局静态变量
否则如果是实例变量,在多个实例之间传递,然后每个实例都去改它的值,不乱了?
------解决思路----------------------

public class Test()
{

 public Test()
{
}
public int Add(int i)
{
return 999; 
}

}

//外部调用
Test t= new Test ();
int i = t.Add(1);


------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你可以传入一个class,这样就可以保证两个是一致的,ref,out什么的都只是在这个方法执行期间有效,出了方法就是各管各的了

1楼说的是个方法,但是如果就为了一个变量再去传入一个class岂不是很麻烦。
有没有其他什么好的办法。将传入的变量定义成类的静态变量?
但是我总觉得C#应该有更好的办法。

我觉得按你这个需求,所谓更好的办法就是直接把你传入的变量定义成全局静态变量
否则如果是实例变量,在多个实例之间传递,然后每个实例都去改它的值,不乱了?




在C++里面,有这么一种情况,比如说设备句柄指针,我在外部获得,然后在创建一个类的时候需要这个句柄,
我只要在类内部定义一个private 指针,指向构造函数传入的设备句柄就行,这样类内部不同函数都可以使用了。
当外部更改设备句柄的时候,内部也相应更改,做到了同步更新。

现在看来也没有好的办法, 准备先定义成全局静态变量。





//实现方法
public  class Test {
private  int  a = 0 ; 
public Test(){}

public int A { get {return a; }  set{a= value;}}

public void B(){ A= 5;}

}

//外部代码
int a =10;
Test t = new Test();
t.A =a ;//外部修改,t对象值同步
console.write(t.A);
t.B();//内部修改
a = t.A;//通过内部修改同步至外部引用
console.write(t.A);
console.write(a);





------解决思路----------------------
当外部更改设备句柄的时候,内部也相应更改,做到了同步更新

这样只会造成混乱,没有任何好处.
C#里已经将指针归为不安全的代码

当然你依然可以使用unsafe关键字定义指针来使用.
------解决思路----------------------

Test t = new Test();
Test  t1 = t ;
Test   t2 = t;
//引用类型的赋值不会产生新对象,只是多维护一个引用。

针对你的情况有两个解决方法,第一使用静态变量,全局可用。第二维护好你的句柄封装类,即维护好你的Test实例对象。建议用第二种。
------解决思路----------------------
C#是完全面向对象的,所以你可以将设备处理的类封装一下,主要是定义一个事件
class MyDeviceController : System.ComponentModel.INotifyPropertyChanged
        {
            public IntPtr Handle 
            {
                get
                {
                    return this._hnd;
                }
                private set
                {
                    if (this._hnd != value)
                    {
                        this._hnd = value;
                        this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Handle"));
                    }
                }
            }

            //模拟句柄变化
            public void RetrieveHandle()
            {
                this.Handle = new IntPtr(this._hnd.ToInt32() + 1);
            }

            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

            public void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e)
            {
                if (this.PropertyChanged != null) this.PropertyChanged(this, e);
            }

            private IntPtr _hnd;
        }


这样,要么你直接传MyDeviceController 这个类的实例
要么让其他对象处理PropertyChanged事件(e.PropertyName == "Handle")
  相关解决方案