Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对类值的引用_C#_Pointers_Reference - Fatal编程技术网

C#对类值的引用

C#对类值的引用,c#,pointers,reference,C#,Pointers,Reference,我的问题是,我创建了一个“类A”,用于更新和处理值。 “类别B”是在“类别A”中创建的,只需要读取类别A的值 现在我可以创建A类的值,如下所示: public static int AInt { get { return aInt; } } static int aInt; 并在B内访问它们作为A.AInt 不过,我可以使用指针,但这似乎非常反c 我有点困惑,是否有更好的方法可以将一个类的值提供给另一个类,而不显式地调用值的更新方法。我觉得第一个例子是如何做,但是我来自C++背景,所以指针对我

我的问题是,我创建了一个“类A”,用于更新和处理值。 “类别B”是在“类别A”中创建的,只需要读取类别A的值

现在我可以创建A类的值,如下所示:

public static int AInt { get { return aInt; } }
static int aInt;
并在B内访问它们作为A.AInt

不过,我可以使用指针,但这似乎非常反c

我有点困惑,是否有更好的方法可以将一个类的值提供给另一个类,而不显式地调用值的更新方法。我觉得第一个例子是如何做,但是我来自C++背景,所以指针对我来说是个常态。 在c#中,To do指针看起来太乱了,因为您必须更改编译标志,必须使用fixed()更改任何变量,并将方法/类标记为不安全的


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

您应该将引用传递给整个
对象,而不是该对象中的特定属性:

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

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

B b = new B(this.aInt); //this is A

如果您希望AIT更改,B收到通知,那么您可以在A中创建一个事件,并在B中订阅它


如果您希望AIT不同,但您将让B从A中轮询AIT,则可以将Func委托传递给B,并让该Func将AIT返回给您。

不确定您希望在类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;
    }
}

不要使用不安全的
,除非你真的需要或者你100%确定这是一种正确的方法。就你的例子来说,不是这样的。两种方法都有效,但确实看起来不必要。谢谢您的快速回复。实际问题是什么?“在B中作为
A.AInt
”似乎可以。您的问题不清楚。请重新阅读并编辑以使其更清晰。可能更适合程序员。stackexchange.comdownvotes没有解释是很奇怪的。啊,是的,我可以使用一个代表来询问值。即使我将它们用于控制器输入,我也没有想到这一点。非常感谢。我没有投反对票,我投了赞成票。@NomeSkavinski我不是在说你,我是在说谁先投了我的反对票。我不介意被否决,只要有一个错误的解释。这是一个可行的方法,即使只有一个错误?A也是入口点,是一个相当大的对象,但当它传递一个引用时,它不会成为问题。如果只有一个
A
为什么不将其设置为静态?对于静态类,您不必传递任何内容,只需使用
A.aInt
访问属性即可。这是非常正确的,因为除非A仍然存在,否则B将不存在。我希望我能给出不止一个答案,这些答案都很好。谢谢。非常好,我喜欢。对于将来的问题,一定要记住扩展,谢谢你让我注意到这一点#
B b = new B(this); //this is A
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;
    }
}