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;}
你不能为自动实现的属性设置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