C# 从另一个新创建的类访问类变量
我有这样的代码:C# 从另一个新创建的类访问类变量,c#,C#,我有这样的代码: class First { public int a { get; set; } public int b { get; set; } public int c = 2; public _second; public First() { _second = new Second(c); this.a = _second.a; this.b = _second.b; } }
class First
{
public int a { get; set; }
public int b { get; set; }
public int c = 2;
public _second;
public First()
{
_second = new Second(c);
this.a = _second.a;
this.b = _second.b;
}
}
class Second
{
public int a;
public int b;
public Second(int c)
{
if(c == 0)
{
a = 1;
b = 2;
}
else
{
a = -1;
b = -2;
}
}
}
如何将a
和b
从First
类传递到第二类,然后直接从第二类传递到第二类,而不使用static
作为First
类中的声明来设置其值
我试过这个:
class First
{
public int a;
public int b;
public int c = 2;
public _second;
public First()
{
_second = new Second(a, b, c);
}
}
class Second
{
public Second(int a, int b, int c)
{
if(c == 0)
{
a = 1;
b = 2;
}
else
{
a = -1;
b = -2;
}
}
}
但它不起作用。您可以将字段作为
ref
传递,这意味着您传递的是对作为参数传递的字段的引用,而不是值。这意味着对第二个
构造函数内字段的更改将反映在第一个
类中
class First
{
public int a;
public int b;
public int c = 2;
public Second _second;
public First()
{
_second = new Second(ref a, ref b, c);
}
}
class Second
{
public Second(ref int a, ref int b, int c)
{
if (c == 0)
{
a = 1;
b = 2;
}
else
{
a = -1;
b = -2;
}
}
}
您可以通过
ref
传递给任何方法,而不仅仅是构造函数。您应该阅读有关此主题的更多信息,例如,您可以将字段作为ref
传递,这意味着您将引用传递给作为参数而不是值传递的字段。这意味着对第二个
构造函数内字段的更改将反映在第一个
类中
class First
{
public int a;
public int b;
public int c = 2;
public Second _second;
public First()
{
_second = new Second(ref a, ref b, c);
}
}
class Second
{
public Second(ref int a, ref int b, int c)
{
if (c == 0)
{
a = 1;
b = 2;
}
else
{
a = -1;
b = -2;
}
}
}
您可以通过
ref
传递给任何方法,而不仅仅是构造函数。您应该阅读有关此主题的更多信息,例如,您只需在第二个类中添加一个构造函数,该构造函数接收第一个实例并更新传递的实例的公共变量
public class Second
{
public Second(int a, int b, int c)
{
// old constructor if still needed
...
}
public Second(First f)
{
int sign = f.c == 0 ? 1 : -1;
f.a = 1 * sign;
f.b = 2 * sign;
}
}
顺便说一句,我建议用房产代替公共场所
public class First
{
public int a {get;set;}
public int b {get;set;}
public int c {get;set;} = 2;
public Second _second {get;set;}
public First()
{
_second = new Second(this);
}
}
更新从你的形象上看,很清楚问题的根源是什么。您正在Forma构造函数中接收一个Form类实例。您需要接收一个主实例,如
public Forma(Main form, int modulID)
{
.....
}
基类表单不了解自定义表单类中定义的方法。或者,您仍然可以接收一个表单实例,但需要添加如下内容
public Forma(Form form, int modulID)
{
Main m = form as Main;
if(m != null)
m.helpWindow = new Help(modulID);
}
.....
}
您只需在第二个类中添加一个构造函数,该构造函数接收第一个类的实例并更新传递的实例的公共变量
public class Second
{
public Second(int a, int b, int c)
{
// old constructor if still needed
...
}
public Second(First f)
{
int sign = f.c == 0 ? 1 : -1;
f.a = 1 * sign;
f.b = 2 * sign;
}
}
顺便说一句,我建议用房产代替公共场所
public class First
{
public int a {get;set;}
public int b {get;set;}
public int c {get;set;} = 2;
public Second _second {get;set;}
public First()
{
_second = new Second(this);
}
}
更新从你的形象上看,很清楚问题的根源是什么。您正在Forma构造函数中接收一个Form类实例。您需要接收一个主实例,如
public Forma(Main form, int modulID)
{
.....
}
基类表单不了解自定义表单类中定义的方法。或者,您仍然可以接收一个表单实例,但需要添加如下内容
public Forma(Form form, int modulID)
{
Main m = form as Main;
if(m != null)
m.helpWindow = new Help(modulID);
}
.....
}
我用
接口
完成了它
public interface IClass
{
int a { get; set; }
int b { get; set; }
}
class First : IClass
{
public int a { get; set; }
public int b { get; set; }
public int c = 2;
public _second;
public First()
{
_second = new Second(this, c);
}
}
class Second
{
public Second(IClass ic, int c)
{
if(c == 0)
{
ic.a = 1;
ic.b = 2;
}
else
{
ic.a = -1;
ic.b = -2;
}
}
}
我用
接口
完成了它
public interface IClass
{
int a { get; set; }
int b { get; set; }
}
class First : IClass
{
public int a { get; set; }
public int b { get; set; }
public int c = 2;
public _second;
public First()
{
_second = new Second(this, c);
}
}
class Second
{
public Second(IClass ic, int c)
{
if(c == 0)
{
ic.a = 1;
ic.b = 2;
}
else
{
ic.a = -1;
ic.b = -2;
}
}
}
将First的实例传递给Second中的构造函数将First的实例传递给Second中的构造函数我无法使用
f.a
访问它,因为它不是static
尝试。这不需要任何静态类,但这两个类是私有的,它们在同一个文件中吗?在类名称之前添加公共限定符这是因为我在第二个类中请求基于的类
,而它实际上没有该属性…我无法使用f.a
访问它,因为它不是静态的
尝试它。这不需要任何静态类,但这两个类是私有的,它们在同一个文件中吗?在类名之前添加公共限定符这是因为我在第二个类中请求基于类的类
,而它实际上没有该属性…我没有编写的一个更改,我声明了如下变量:publilc int a{get;set;}
因此,当我尝试使用ref时,获取错误属性或索引器可能不会作为out或ref参数传递
@AleksaRistic这只适用于字段或局部变量,如果要使用属性,可以使用backing字段声明它们,并将backing字段用作ref参数,或者使用其他答案,这是针对属性的,但从第二个到第一个(这不一定是坏事)进行了一次更改,我没有编写,我声明了如下变量:publicinta{get;set;}
因此,当我尝试使用ref时,获取错误属性或索引器可能不会作为out或ref参数传递
@AleksaRistic这只适用于字段或局部变量,如果要使用属性,可以使用backing字段声明它们,并将backing字段用作ref参数,或者使用其他答案,这是针对属性的,但从第二个到第一个都有依赖关系(这不一定是坏事)