字段初始值无法引用非静态字段、方法或属性

一上代码,后解释

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestStatic
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("解决字段初始化无法引用非静态字段问题");
            A a = new A(new B());
            Console.WriteLine(a.restrs);  //利用属性调用就可以解决
        }
    }
    public class A
    {
        public A(B obj)
        {
            this.str = obj;
            Console.WriteLine(str.Say2());    //利用构造函数也可以解决

        }

        public B str
        {
            get;
            set;
        }
        //string a = str.Say2();           //字段初始化无法引用非静态字段
        //public string restrs = restr(); //字段初始化无法引用非静态字段
        //而通过属性调用就可以编译通过
        public string restrs
        {
            get
            {
                return restr();
            }
            set
            {
                restrs = value;
            }
        }


        public string restr()
        {
            return "1》利用属性调用就可以解决";
        }
    }
    public class B
    {
        public B()
        {
        }
        public string Say2()
        {
            return "2》利用构造函数也可以解决";
        }
    }
}

二,字段初始化无法引用非静态字段,原因:

1》C#语法规则:在 C# 中不允许使用未初始化的变量。

2》属性内存和变量内存的分配的时间不一样。 属性是用的时候分配,而变量是在类初始化时候分配。

3》在实例一个类时,因为静态字段赋值动作已经在静态构造函数中完成,实例化的字段会在非静态构造函数中实例化,而两者的时间前后是静态构造函数执行早于非静态构造函数,也洽洽是这个原因会造成两个问题:

1,当你用非静态字段给静态字段赋值时,字段一直为空错误

2,当你在类中给非静态赋值时:字段初始化无法引用非静态字段

三,解决方法:

1》因为初始化的时候顺序问题造成的问题,我们可以将对应代码放到当前需要赋值的类的构造函数中执行。

2》使用属性的get来赋值,如上例子

原文地址:https://www.cnblogs.com/May-day/p/6755324.html