C#引用类值

时间:2013-03-03 15:50:59

标签: c# pointers reference

我的问题是,我创建一个'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()更改任何变量并将方法/类标记为不安全。

感谢您提供有关更好解决方案的任何指导/提示。

3 个答案:

答案 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;
    }
}