为什么我可以在只读变量中设置字段的值? C#

why can I set the value of a field in a readonly variable? c#

我做了以下代码:

public class AppearanceDefinition<VertexInfo> where VertexInfo : struct
{
    public readonly ShaderProperty<bool> HasBorder; // READONLY VARIABLE
    public readonly ShaderProperty<float> BorderSize;

    internal readonly Shader[] Shaders;

    private readonly string VertexShaderCode;
    private readonly string FragmentShaderCode;

    public AppearanceDefinition(string vertexCode, string fragmentCode)
    {
        this.VertexShaderCode = vertexCode;
        this.FragmentShaderCode = fragmentCode;

        HasBorder = new ShaderProperty<bool>("HasBorder", ResourceKind.UniformBuffer, ShaderStages.Fragment, 0);
        BorderSize = new ShaderProperty<float>("BorderSize", ResourceKind.UniformBuffer, ShaderStages.Fragment, 0);
    }
}

public class ShaderProperty<T> where T : struct
{
    public readonly string Name;
    public readonly ResourceKind InternalDataType;
    public readonly ShaderStages ShaderStage;
    public readonly uint GroupId;

    private T _value;
    public T Value 
    { 
        get 
        {
            return _value;
        }
        set 
        {
            _value = value;
            // requires buffer update. 
        }
    }

    public ShaderProperty(string name, ResourceKind internalDataType, ShaderStages stage, uint group) 
    {
        this.Name = name;
        this.InternalDataType = internalDataType;
        this.ShaderStage = stage;
        this.GroupId = group;
        this._value = default(T);
    }
}

我是这样使用它的:

class Program
{
    static AppearanceDefinition<bool> test;

    static void Main(string[] args)
    {
        test = new AppearanceDefinition<bool>("", "");
        test.HasBorder.Value = true;
    }
}

这很好用,HasBorder 的值从 false 更改为 true
这很好,因为我不希望人们重新分配值 HasBorder,但我确实希望人们更改 HasBorder.Value 的值。但是我在某种程度上可以更改只读变量感觉很奇怪。
有人可以向我解释为什么这是可能的,以及是否有更好的方法来做到这一点?

您可以更改 HasBorder.Value 但不能更改 HasBorder,因为 HasBorder 是只读的。尝试将 HasBorder 等同于其他东西,它会失败。

重要的是要记住,当只读数据成员是引用类型时(即 class 的实例,而不是结构或基本数据类型),引用是常量,但是它指向的实例不是。所以一个只读实例的内部状态是可以改变的,可以改变