在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#引用类型参数,传递的是地址引用
------解决思路----------------------
就是可以~ 你这样写代码也是违反了一个原则的~(看《重构》这本书)
所以还是不要这样干了~亲~
------解决思路----------------------
我觉得按你这个需求,所谓更好的办法就是直接把你传入的变量定义成全局静态变量
否则如果是实例变量,在多个实例之间传递,然后每个实例都去改它的值,不乱了?
------解决思路----------------------
public class Test()
{
public Test()
{
}
public int Add(int i)
{
return 999;
}
}
//外部调用
Test t= new Test ();
int i = t.Add(1);
------解决思路----------------------
你可以传入一个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")