为什么我可以在只读变量中设置字段的值?c#
我制作了以下代码:为什么我可以在只读变量中设置字段的值?c#,c#,variables,readonly,C#,Variables,Readonly,我制作了以下代码: public class AppearanceDefinition<VertexInfo> where VertexInfo : struct { public readonly ShaderProperty<bool> HasBorder; // READONLY VARIABLE public readonly ShaderProperty<float> BorderSize; internal readonl
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);
}
}
公共类外观定义,其中VertexInfo:struct
{
公共只读着色器属性HasBorder;//只读变量
公共只读着色器属性边框大小;
内部只读着色器[]着色器;
私有只读字符串VertexShaderCode;
私有只读字符串片段ShaderCode;
公共外观定义(字符串vertexCode、字符串碎片代码)
{
this.VertexShaderCode=vertexCode;
this.FragmentShaderCode=片段代码;
HasBorder=新的着色器属性(“HasBorder”,ResourceKind.UniformBuffer,ShaderStages.Fragment,0);
BorderSize=new ShaderProperty(“BorderSize”,ResourceKind.UniformBuffer,ShaderStages.Fragment,0);
}
}
公共类着色器属性,其中T:struct
{
公共只读字符串名称;
公共只读ResourceKind InternalDataType;
公共只读着色器阶段着色器阶段;
公共只读uint组ID;
私人T_值;
公共价值
{
得到
{
返回_值;
}
设置
{
_价值=价值;
//需要更新缓冲区。
}
}
公共ShaderProperty(字符串名称、ResourceKind internalDataType、ShaderStages阶段、uint组)
{
this.Name=Name;
this.InternalDataType=InternalDataType;
this.ShaderStage=stage;
this.GroupId=group;
该值为默认值(T);
}
}
我是这样使用它的:
class Program
{
static AppearanceDefinition<bool> test;
static void Main(string[] args)
{
test = new AppearanceDefinition<bool>("", "");
test.HasBorder.Value = true;
}
}
类程序
{
静态外观定义测试;
静态void Main(字符串[]参数)
{
测试=新外观定义(“,”);
test.HasBorder.Value=true;
}
}
这工作正常,HasBorder
的值从false
变为true
这很好,因为我不希望人们重新分配值
HasBorder
,但我希望人们更改HasBorder.value
的值。但在某种程度上,我可以更改只读变量,这感觉很奇怪。有人能解释一下为什么这是可能的,如果有更好的方法的话 您可以更改HasBorder.Value,但无法更改HasBorder,因为HasBorder是只读的。尝试将HasBorder等同于其他东西,它将失败
请务必记住,当只读数据成员是引用类型(即类的实例,而不是结构或基本数据类型)时,引用是常量,但它指向的实例不是常量。因此,只读实例的内部状态可以更改,也可以更改您可以更改HasBorder.Value,但不能更改HasBorder,因为HasBorder是只读的。尝试将HasBorder等同于其他东西,它将失败
请务必记住,当只读数据成员是引用类型(即类的实例,而不是结构或基本数据类型)时,引用是常量,但它指向的实例不是常量。因此,只读实例的内部状态可以更改,也可以更改假设您有一个框。通过添加
只读
,您可以将盒子粘到地板上。但是通过把盒子粘到地板上,你并不能阻止东西被添加到盒子里或从盒子里移除。您可以为HasBorder.value
分配一个新值,但一旦构造函数完成,就不能为HasBorder
分配任何内容。假设您有一个框。通过添加只读
,您可以将盒子粘到地板上。但是通过把盒子粘到地板上,你并不能阻止东西被添加到盒子里或从盒子里移除。您可以将新值分配给HasBorder.value
,但一旦构造函数完成,就不能将任何内容分配给HasBorder
。