Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以在只读变量中设置字段的值?c#_C#_Variables_Readonly - Fatal编程技术网

为什么我可以在只读变量中设置字段的值?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