为什么我可以在只读变量中设置字段的值? 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 的实例,而不是结构或基本数据类型),引用是常量,但是它指向的实例不是。所以一个只读实例的内部状态是可以改变的,可以改变
我做了以下代码:
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 的实例,而不是结构或基本数据类型),引用是常量,但是它指向的实例不是。所以一个只读实例的内部状态是可以改变的,可以改变