Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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#_Readonly - Fatal编程技术网

“的目的”;只读“;在C#中?(这是一个漏洞吗?)

“的目的”;只读“;在C#中?(这是一个漏洞吗?),c#,readonly,C#,Readonly,在C#中使字段只读的目的是什么 它实际上似乎并没有阻止对字段的修改: public struct Struct { public readonly int Value; public Struct(int value) { this.Value = value; } } static class Program { static void Main() { var s = new Struct(1);

在C#中使字段
只读的目的是什么

它实际上似乎并没有阻止对字段的修改:

public struct Struct
{
    public readonly int Value;
    public Struct(int value)
    {
        this.Value = value;
    }
}

static class Program
{
    static void Main()
    {
        var s = new Struct(1);
        Debug.Assert(s.Value == 1, "Read-only field is 1");
        s = new Struct(2);
        Debug.Assert(s.Value == 2, "Read-only field written!");
    }
}
这被认为是一个漏洞,还是出于设计 考虑到该字段可以很容易地修改,我什么时候才能从将字段设置为只读中获益呢?

您的
结构有一个不同的实例。您没有覆盖原始结构的
只读
值。也就是说,变量
s
被分配了一个
Struct
,其
Value
为1,随后被分配了另一个
Struct
,其
值为2

readonly
的要点是允许在初始化或构造类型期间设置字段的值,但不允许在后置字中设置

如果您尝试:

static void Main()
{
    var s = new Struct(1);
    Debug.Assert(s.Value == 1, "Read-only field is 1");
    s.Value = 2;
    Debug.Assert(s.Value == 2, "Read-only field written!");
}
您将收到一个编译器错误-“无法为只读字段赋值(构造函数或变量初始值设定项中除外)”。

您的
结构有一个不同的实例。您没有覆盖原始结构的
只读
值。也就是说,变量
s
被分配了一个
Struct
,其
Value
为1,随后被分配了另一个
Struct
,其
值为2

readonly
的要点是允许在初始化或构造类型期间设置字段的值,但不允许在后置字中设置

如果您尝试:

static void Main()
{
    var s = new Struct(1);
    Debug.Assert(s.Value == 1, "Read-only field is 1");
    s.Value = 2;
    Debug.Assert(s.Value == 2, "Read-only field written!");
}

您将收到一个编译器错误-“无法将只读字段分配给(构造函数或变量初始值设定项中除外)”。

允许构造函数或声明写入它们,但不允许其他人写入


:“当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类中的构造函数中进行。”

构造函数或声明可以对其进行写入,但不能对其他任何人进行写入

:“当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中进行。”

来源:

只读字段可以在声明或构造函数中初始化

发件人:

只读字段可以在声明或构造函数中初始化

这被认为是一个漏洞,还是故意的

这是设计的

它防止直接修改字段本身(在结构内部或外部),但这并不意味着不能用新的
struct
值替换变量的整个值(
s

与类相比,它对结构肯定没有那么有用——特别是当替换“整体值”可能不是原子的时候——但在我看来它仍然有用

换句话说。。。你可以把整数看作是不可变的值,对吗?但该代码仍然有效:

int x = 10;
x = 20;
这会改变
x
的值,但不会改变10的含义

这被认为是一个漏洞,还是故意的

这是设计的

它防止直接修改字段本身(在结构内部或外部),但这并不意味着不能用新的
struct
值替换变量的整个值(
s

与类相比,它对结构肯定没有那么有用——特别是当替换“整体值”可能不是原子的时候——但在我看来它仍然有用

换句话说。。。你可以把整数看作是不可变的值,对吗?但该代码仍然有效:

int x = 10;
x = 20;

这会改变
x
的值-它不会改变10的含义。

但它位于完全相同的内存位置。引用该对象的人会看到该字段已修改。你说它是一个不同的实例是什么意思?它不只是一个带有一些内存位置的值类型吗?@Mehrdad
你说它是一个不同的实例是什么意思我想他指的是:
s=new Struct(2)
@Mehrdad-它是一个不同的对象,因为它是一个
新结构(2)
@Mehrdad:它不是一个对象,而是一个值类型的值。其他人会怎么说呢?您刚刚得到一个局部变量。@Mehrdad,请看。它不在与
Struct
的不同实例完全相同的内存位置,但它在完全相同的内存位置。引用该对象的人会看到该字段已修改。你说它是一个不同的实例是什么意思?它不只是一个带有一些内存位置的值类型吗?@Mehrdad
你说它是一个不同的实例是什么意思我想他指的是:
s=new Struct(2)
@Mehrdad-它是一个不同的对象,因为它是一个
新结构(2)
@Mehrdad:它不是一个对象,而是一个值类型的值。其他人会怎么说呢?您刚刚得到一个局部变量。@Mehrdad,请看。它不在与类的
Struct
+1的不同实例完全相同的内存位置,我认为这才是真正的答案。当我写这个问题时,我想到了结构,完全忘记了类…关于整数是不可变的。。。我并不认为它们是不可变的(它们显然是可修改的),但你的观点是正确的。事实上,它对于一般来说应该是不可变的结构非常有用,并且将它们的所有字段声明为
只读
将绝对确保你不会对它们进行变异。@Mehrdad:不,整数是不可修改的。你不能让10意味着别的。您可以更改一个变量的值,该变量以前的值为10,但这不是同一回事。@Mehrdad:关键是我没有说
x
不能修改,它显然可以修改。我说这个值可以