C#对类值的引用
我的问题是,我创建了一个“类A”,用于更新和处理值。 “类别B”是在“类别A”中创建的,只需要读取类别A的值 现在我可以创建A类的值,如下所示: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++背景,所以指针对我
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;
}
}