Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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# - Fatal编程技术网

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参数,或者使用其他答案,这是针对属性的,但从第二个到第一个都有依赖关系(这不一定是坏事)