почему я могу установить значение поля в переменной только для чтения? 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. Но мне кажется странным, что я могу изменить переменную только для чтения.
Может ли кто-нибудь объяснить мне, почему это возможно, и есть ли способ сделать это лучше?


person FutureCake    schedule 14.04.2020    source источник
comment
Допустим, у вас есть коробка. Добавляя readonly, вы приклеиваете коробку к полу. Но приклеивая коробку к полу, вы не препятствуете тому, чтобы что-то добавлялось в коробку или вынималось из нее. Вы можете присвоить новое значение HasBorder.Value, но вы не можете ничего присвоить HasBorder после того, как конструктор будет готов.   -  person madreflection    schedule 14.04.2020


Ответы (1)


Вы можете изменить HasBorder.Value, но не можете изменить HasBorder, потому что HasBorder доступен только для чтения. Попробуйте приравнять HasBorder к чему-то другому, и ничего не получится.

Важно помнить, что, когда член данных только для чтения имеет ссылочный тип (т.е. экземпляр класса, а не структуру или базовый тип данных), ссылка постоянна, а экземпляр, на который она указывает, - нет. Таким образом, внутренний статус экземпляра только для чтения может изменяться и может быть изменен

person YankTHEcode    schedule 14.04.2020