我正在尝试执行以下操作:
我希望有两个课程 propList.push(new Property(1,<?php echo json_encode($propertyNameList[0]); ?>,
<?php echo json_encode($propertyCodeList[0]); ?>));
和Class01
。使用Class02
的{{1}}属性初始化Class02
Integer
的属性。当我更改Integer
时。整数现在我想拥有Class01
。整数也发生了变化。我怎么能这样做?
Class01
答案 0 :(得分:3)
您需要区分引用类型和值类型。
更改引用类型的值时,会在引用此对象的任何位置更改它。
int
是一个值类型,因此当在一个对象中更改整数属性时,它不会在另一个对象中自动更新它。
Class01
是一种参考类型,如果您以与Integer
属性类似的方式使用它,它将按您希望的方式工作。
值类型示例:int,double,bool,char,DateTime。
参考类型的示例:表单,字符串,列表
最脏的解决方案是让一个类具有static
变量,例如带有static int
的Class03,Class01和Class02都可以访问和更新而不是自己的属性,但我不建议这样做。根据体系结构的不同,您可能会发现您可能希望为此值编写包装器,使其成为引用类型,或者使用事件通知其他对象有关更改或使用某种类型的继承(如果类是非常连接的)。 p>
答案 1 :(得分:2)
你不能这样做,因为int
是值类型,每个类都有它的&#39;自己的int值副本;
您可以编写包含int
值的类包装器,并在类中设置对它的引用,或者您可以尝试框int
。
答案 2 :(得分:1)
@JRace
分配Class01
对象的值只会复制值而不是内存引用。
因此,无论何时在one.Integer
进行更改,它都永远不会反映到two.Integer
。
您可以使用int属性创建一个新类(引用类型),创建此类的实例并工作。
它会有所帮助。
public class Class02
{
public Data Integer { get; set; }
}
public class Class01
{
public Data Integer { get; set; }
}
public class Data {
public int Integer { get; set; }
}
public class A
{
private void myFunc()
{
Data data = new Data();
data.Integer = 16;
Class01 one = new Class01 { Integer = data };
Class02 two = new Class02 { Integer = data };
Console.WriteLine("Class one: {0} -- Class two: {1}", one.Integer.Integer, two.Integer.Integer);
// Prints: Class one: 16 -- Class two: 16
data.Integer++;
Console.WriteLine("Class one: {0} -- Class two: {1}", one.Integer.Integer, two.Integer.Integer);
// Prints: Class one: 17 -- Class two: 16
// I want it to print: Class one: 17 -- Class two: 17
}
}
答案 3 :(得分:0)
我知道1种方式,它可能不是最简单的方法,但确实有效:
你可以创建一个自定义事件处理程序,在事件处理程序初始化时在事件处理程序中订阅这些类,一旦它们在事件处理程序中订阅为这些类创建公共void,就调用public void类似public void UpdateIntegerValue(int) ,在该事件处理程序内部引发该事件,其中1个参数击败整数值,另一个参与类对象本身,然后简单地为每个类实例设置值。
最后,用一行更新所有两个类就好了,例如UpdateIntegerValueForAllClasses(Object ownerclass,int integerToUpdate);
如果你没有完全理解它或需要更多细节,请告诉我。
答案 4 :(得分:0)
如果要在类的所有实例之间共享变量,则可以创建父类,两个类将从该类继承,并在其中定义protected static
变量(protected
=只能访问此类和从其继承的类; static
=在整个类型中共享):
abstract class ClassAbstract{
protected static int _myInteger {get;set;}
}
class Class01:ClassAbstract{
public int MyInteger {
get{return _myInteger;}
set{ _myInteger=value;}
}
}
class Class02:ClassAbstract{
public int MyInteger {
get{return _myInteger;}
set{ _myInteger=value;}
}
}
static class Program {
public void Main(){
Class01 one = new Class01();
one.MyInteger = 16;
Class02 two = new Class02();
Console.WriteLine("Class two: {0}", two.MyInteger);
}
}