-2

我的问题是,我创建了一个“A 类”来更新和处理值。'Class B'是在'Class A'中创建的,只需要读取Class 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() 更改任何变量并将方法/类标记为不安全。

感谢您提供任何指导/提示以获得更好的解决方案。

4

3 回答 3

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

于 2013-03-03T15:56:53.920 回答
1

正如您所注意到的,有很多方法可以做到这一点。如果aInt仍然是一个静态变量(阅读:我的意思是它不会改变,而不是静态类型),那么你可以通过构造函数或属性将它传递给 B,或者你可以将整个对象传递给 B。

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 给您。

于 2013-03-03T15:57:05.887 回答
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;
    }
}
于 2013-03-03T16:04:41.037 回答