的空访问器重要吗?关于值类型及其修改

我有以下代码由于输入了“ a”而无法使用.但是我认为即使没有访问器,它也无法工作,但它确实做到了:

class Program
    {
        a _a  //with accessors it WONT compile
        {
            get; 
            set;
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p._a.X = 5; //when both accessors are deleted, compiler does not
                        //complain about _a.X not being as variable
        }
    }
    struct a
    {
       public int X;
    }

它不起作用,因为“ a”是结构.但是,当我从“ _a”实例删除访问器时,它可以工作.我不理解为什么.
谢谢

解决方法:

值类型的主要特征是它们被复制而不是通过引用传递.

当您具有值类型和访问器时,从本质上来说,您会从方法中返回值类型,这会导致复制(以下两个示例相同):

ValueType Property { get { return x; } } // Will make a copy of x
ValueType Method() { return x; }    // Will make a copy of x

如果现在分配给返回值,则意味着分配给x的副本.因此,对从属性返回的值所做的任何更改都将立即丢失.

当您删除{get; }访问者,您现在有了一个基本字段,例如:

int field;

要么

ValueType field;

这意味着没有副本,这意味着在分配给字段时,您将不再分配给副本.

上一篇:Javascript-为什么Array.isArray算法是ES5执行类型检查?


下一篇:基于C#中给定对象类型的动态列表创建