具有嵌套结构作为属性的类不起作用

bop*_*bop 0 c# struct properties

为什么以下代码不起作用?如果我h从一个属性更改为一个字段,它就可以了!或者,如果我改变FileHeader来自structclass它的作品!我只是在找一个为什么它不起作用的答案.

public class MyFile
{
    public struct FileHeader
    {
        public List<string> ColNames
        {
            get;
            set;
        }

        public void setColNames()
        {
            ColNames = new List<string>();
            ColNames.Add("address");
        }
    }

    public FileHeader h
    {
        get;
        set;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        MyFile o = new MyFile();
        o.h.setColNames();

        Console.WriteLine(o.h.ColNames[0]); // <- Doesn't work! No elements

        string line = System.Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

这一行:

o.h.setColNames();
Run Code Online (Sandbox Code Playgroud)

相当于:

FileHeader tmp = o.h;
tmp.setColNames();
Run Code Online (Sandbox Code Playgroud)

因为FileHeader是结构,值tmp是该字段值的副本o.修改tmp不会改变o.h.

我会建议:

  • 除非您正在创建自然(小)值类型,否则不会创建自定义结构
  • 您创建的任何自定义结构应该是不可变的.那时,犯这种错误就更难了
  • 遵循.NET命名约定 - 属性h和方法setColNames都违反了这一点
  • 避免使用嵌套类型,除非有显着的好处.这与你的实际问题无关,但它可以使各种事情更棘手.