我的问题是,我创建一个'A级'来更新和处理值。 'B类'是在'A类'中创建的,只需要读取A类的值。
现在我可以创建A类的值:
public static int AInt { get { return aInt; } }
static int aInt;
在B中访问它们为A.AInt。
但是我可以使用指针,但这似乎非常反c#。
public class A
{
int aInt;
unsafe public A()
{
fixed(int *aPtr = &aInt)
B b = new B(aPtr);
}
// Changes aInt
}
unsafe public class B
{
int *bInt;
public B(int *a)
{
bInt = a;
}
// Does stuff according to bInt value changes
}
我有点困惑的是,在没有显式调用值的更新方法的情况下,更好地为另一个类提供一个类的值。我觉得第一个例子是它应该如何完成,但我来自c ++背景,所以指针对我来说是常态。
在c#中执行指针似乎太乱了,因为你必须更改编译标志并且必须使用fixed()更改任何变量并将方法/类标记为不安全。
感谢您提供有关更好解决方案的任何指导/提示。
答案 0 :(得分:2)
您应该将引用传递给整个A
对象,而不是该对象中的某些属性:
public class A
{
public int aInt;
public A()
{
B b = new B(this);
}
// Changes aInt
}
public class B
{
A _a;
public B(A a)
{
_a = a;
}
// can use _a.aInt here
}
或者在A
中创建一个活动,并在B
答案 1 :(得分:1)
你注意到有很多方法可以做到这一点。
如果aInt
仍然是一个静态变量(读:我的意思是它不会改变,而不是静态类型)那么你可以通过构造函数或属性将它传递给B,或者你可以将整个对象传递给B. / p>
B b = new B(this.aInt); //this is A
或
B b = new B(this); //this is A
如果您希望aInt更改而B获得通知,那么您可以在A中创建一个事件并在B中订阅它。
如果你期望aInt不同,但是你会让B轮询A中的aInt,你可以将Func委托传递给B并让Func将aInt返回给你。
答案 2 :(得分:1)
不确定你想在B类中做什么,但是只要一个简单的扩展类就足够了:
public class A
{
int aInt;
public A()
{
aInt = 1;
aInt = aInt.DoSomething();
// aInt is now 6
}
}
public static class Extension
{
public static int DoSomething (this int value)
{
return value += 5;
}
}