Я сделал следующий код:
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
. Но мне кажется странным, что я могу изменить переменную только для чтения.
Может ли кто-нибудь объяснить мне, почему это возможно, и есть ли способ сделать это лучше?
readonly
, вы приклеиваете коробку к полу. Но приклеивая коробку к полу, вы не препятствуете тому, чтобы что-то добавлялось в коробку или вынималось из нее. Вы можете присвоить новое значениеHasBorder.Value
, но вы не можете ничего присвоитьHasBorder
после того, как конструктор будет готов. - person madreflection   schedule 14.04.2020