c#的只读属性

本文关键字:只读属性 | 更新日期: 2023-09-27 18:11:03

我想在数据传输对象中有只读属性,DTO对象,没有设置;访问器:

public class ViewBannerDTO
    {
        public int Id { get;  }
    }

但是为什么get:

ViewBannerDTO.Id。Get必须声明一个主体,因为它没有被标记为抽象或外部。自动实现的属性必须同时定义get和set访问器。

和为什么我不能:

public readonly int Id{get;}

c#的只读属性

你不能为自动实现的属性设置no setter(否则你怎么设置它呢?)您可以添加getter实现(如果需要,还可以添加一个后备字段)或使用private setter:

public class ViewBannerDTO
{
    public int Id { get; private set; }
}

Why i can i do:

public readonly int Id{get;}

因为readonly只适用于字段。您可以通过使用readonly支持字段而不使用set访问器来完成相同的事情:

private readonly int _Id;
public int Id {get { return _Id; } }

但是你不能有一个readonly自动实现属性,因为没有set访问器就没有初始化属性的语法

这正是所说的:没有为该变量设置访问器,并且没有实现Get方法可以做一些事情来获取值。

要么

:

public int Id { get; set; }

    public int Id
    {
        get
        {
            int something = GetStuffDone();
            return something;
        }
    }

你可以做的另一件事是使set函数私有,像这样:

public int Id { get; private set; }
这个值永远不会被设置,因为它没有访问器。

这只是回答的重复,但是OP不理解

public class ViewBannerDTO
{
    public int Id { get; private set; }
    public ViewBannerDTO () 
    {
         Id = 12;  // inside the class can assign private
                   // private not seen outside the classs 
    }
}

或者

public class ViewBannerDTO
{
    private int id = 12;
    public int Id { get { return id; } }
}

或者

public class ViewBannerDTO
{
    public int Id { get { return 12; }
}

从c# 9开始,您可以通过使用init访问器获得只读行为。例子:

public class Foo
{
    public int Bar { get; init;} = 1
    public int Baz { get; private init;} = 2
}
var foo = new Foo { Baz = 3};

在这两种情况下,属性只能在对象构造期间设置。private关键字确保只有类可以设置该值,否则new的调用者可以使用示例中的对象文字表记法设置该值。

参考:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init