Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/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# 类类型为的Ref只读属性_C#_.net_C# 7.3 - Fatal编程技术网

C# 类类型为的Ref只读属性

C# 类类型为的Ref只读属性,c#,.net,c#-7.3,C#,.net,C# 7.3,我正在尝试创建一个只读属性(c#7.2特性) 这段代码编译成功。我希望在试图更新只读属性的字段时会出现某种错误。我是否错误地使用了ref readonly return功能?根据我在中的发现,您应该理解如下 将参数标记为“readonly ref”或“in”不会使其引用的值不可变。虽然声明参数的函数无法对其进行更改,但可以在其他位置更改该值。这不需要多个线程,只是一种访问参数引用的原始变量的方法 因此,由于您的类不是不变的,所以可以在其他地方更改它。这个特性似乎主要是关于传递参考值的性能,从我在

我正在尝试创建一个只读属性(c#7.2特性)

这段代码编译成功。我希望在试图更新只读属性的字段时会出现某种错误。我是否错误地使用了ref readonly return功能?

根据我在中的发现,您应该理解如下

将参数标记为“readonly ref”或“in”不会使其引用的值不可变。虽然声明参数的函数无法对其进行更改,但可以在其他位置更改该值。这不需要多个线程,只是一种访问参数引用的原始变量的方法

因此,由于您的类不是不变的,所以可以在其他地方更改它。这个特性似乎主要是关于传递参考值的性能,从我在中发现的,您应该理解为

将参数标记为“readonly ref”或“in”不会使其引用的值不可变。虽然声明参数的函数无法对其进行更改,但可以在其他位置更改该值。这不需要多个线程,只是一种访问参数引用的原始变量的方法


因此,由于您的类不是不变的,所以可以在其他地方更改它。此功能主要是关于将引用值传递给我时的性能。您似乎正在更新引用类型的属性。如果您要更新状态本身,我预计会出现编译时错误,但这只是更改对象的属性,我眼中的只读并不起作用,只有JobStatus引用是只读的,即您不能将JobStatus对象与另一个JobStatus对象交换。但是,您可以自由更改JobStatus的内容。这就像你有一个经典的getter-only属性一样,即
publicjobstatus=>\u JobStatus
,顺便说一句,这是常用的方法。对我来说,你似乎在更新一个引用类型的属性。如果您要更新状态本身,我预计会出现编译时错误,但这只是更改对象的属性,我眼中的只读并不起作用,只有JobStatus引用是只读的,即您不能将JobStatus对象与另一个JobStatus对象交换。但是,您可以自由更改JobStatus的内容。如果你有一个经典的只有吸气剂的属性,即<代码>公共工作状态状态> >工作状态> /CODE >,这是常见的方法。C语言中是否可能返回C++中的const对象的引用?没有添加额外的抽象层(比如只读接口)。@Yozer不,我看不到。但是,作为一个吸气剂,只有接口返回似乎是你的最佳选择(虽然,消费者当然可以总是扔回去,如果他们选择这样做),有可能在C++中返回一个引用const对象,像在C++?没有添加额外的抽象层(比如只读接口)。@Yozer不,我看不到。但是,让它作为一个getter-only接口返回似乎是您的最佳选择(尽管,如果消费者选择这样做,他们当然可以将其返回)
public class JobStatus
{
    public int Id { get; set; }
}

public class Job
{
    public ref readonly JobStatus Status => ref _jobStatus;
    private readonly JobStatus _jobStatus = new JobStatus
    {
        Id = 4
    };
}

class Program
{
    static void Main(string[] args)
    {
        var job = new Job();
        job.Status.Id = 5;
    }
}